235 lines
6.5 KiB
Diff
235 lines
6.5 KiB
Diff
|
|
From 05bece3d79daa886a469b066061f0606ca6ebed8 Mon Sep 17 00:00:00 2001
|
||
|
|
From: huang-xioaquan <huangxiaoquan1@huawei.com>
|
||
|
|
Date: Mon, 2 Dec 2024 17:39:11 +0800
|
||
|
|
Subject: [PATCH 2/5] [Bugfix] Add no var recored check for ssa_name in struct
|
||
|
|
reorg
|
||
|
|
|
||
|
|
---
|
||
|
|
gcc/ipa-struct-reorg/escapes.def | 1 +
|
||
|
|
gcc/ipa-struct-reorg/ipa-struct-reorg.cc | 44 ++++++
|
||
|
|
.../gcc.dg/struct/rf_void_ptr_ssa_name.c | 125 ++++++++++++++++++
|
||
|
|
3 files changed, 170 insertions(+)
|
||
|
|
create mode 100644 gcc/testsuite/gcc.dg/struct/rf_void_ptr_ssa_name.c
|
||
|
|
|
||
|
|
diff --git a/gcc/ipa-struct-reorg/escapes.def b/gcc/ipa-struct-reorg/escapes.def
|
||
|
|
index 996a09bac..4ba9cc2d0 100644
|
||
|
|
--- a/gcc/ipa-struct-reorg/escapes.def
|
||
|
|
+++ b/gcc/ipa-struct-reorg/escapes.def
|
||
|
|
@@ -61,5 +61,6 @@ DEF_ESCAPE (escape_unhandled_rewrite, "Type escapes via a unhandled rewrite stmt
|
||
|
|
DEF_ESCAPE (escape_via_orig_escape, "Type escapes via a original escape type")
|
||
|
|
DEF_ESCAPE (escape_instance_field, "Type escapes via a field of instance")
|
||
|
|
DEF_ESCAPE (escape_via_empty_no_orig, "Type escapes via empty and no original")
|
||
|
|
+DEF_ESCAPE (escape_no_record_var, "Type escapes via no record var")
|
||
|
|
|
||
|
|
#undef DEF_ESCAPE
|
||
|
|
diff --git a/gcc/ipa-struct-reorg/ipa-struct-reorg.cc b/gcc/ipa-struct-reorg/ipa-struct-reorg.cc
|
||
|
|
index 1a169c635..b93b8a5b5 100644
|
||
|
|
--- a/gcc/ipa-struct-reorg/ipa-struct-reorg.cc
|
||
|
|
+++ b/gcc/ipa-struct-reorg/ipa-struct-reorg.cc
|
||
|
|
@@ -1433,6 +1433,7 @@ public:
|
||
|
|
void propagate_escape_via_original (void);
|
||
|
|
void propagate_escape_via_empty_with_no_original (void);
|
||
|
|
void propagate_escape_via_ext_func_types (void);
|
||
|
|
+ void propagate_escape_via_no_record_var (void);
|
||
|
|
void analyze_types (void);
|
||
|
|
void clear_visited (void);
|
||
|
|
bool create_new_types (void);
|
||
|
|
@@ -4467,6 +4468,13 @@ ipa_struct_reorg::check_type_and_push (tree newdecl, srdecl *decl,
|
||
|
|
}
|
||
|
|
/* At this point there should only be unkown void* ssa names. */
|
||
|
|
gcc_assert (TREE_CODE (newdecl) == SSA_NAME);
|
||
|
|
+ tree inner = SSA_NAME_VAR (newdecl);
|
||
|
|
+ if (current_layout_opt_level >= STRUCT_REORDER_FIELDS &&
|
||
|
|
+ inner && find_decl (inner) == NULL)
|
||
|
|
+ {
|
||
|
|
+ type->mark_escape (escape_no_record_var, stmt);
|
||
|
|
+ return;
|
||
|
|
+ }
|
||
|
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||
|
|
{
|
||
|
|
fprintf (dump_file, "\nrecording unkown decl: ");
|
||
|
|
@@ -5512,6 +5520,41 @@ ipa_struct_reorg::propagate_escape_via_ext_func_types (void)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+/* Escape propagation is performed on ssa_name decl that no record var in
|
||
|
|
+ decls. */
|
||
|
|
+
|
||
|
|
+void
|
||
|
|
+ipa_struct_reorg::propagate_escape_via_no_record_var (void)
|
||
|
|
+{
|
||
|
|
+ if (dump_file && (dump_flags & TDF_DETAILS))
|
||
|
|
+ fprintf (dump_file, "\n propagate_escape_via_no_record_var: \n\n");
|
||
|
|
+
|
||
|
|
+ for (unsigned i = 0; i < functions.length (); i++)
|
||
|
|
+ {
|
||
|
|
+ if (functions[i]->node)
|
||
|
|
+ set_cfun (DECL_STRUCT_FUNCTION (functions[i]->node->decl));
|
||
|
|
+
|
||
|
|
+ for (unsigned j = 0; j < functions[i]->decls.length (); j++)
|
||
|
|
+ {
|
||
|
|
+ srdecl *decl = functions[i]->decls[j];
|
||
|
|
+ srtype *type = decl->type;
|
||
|
|
+
|
||
|
|
+ if (TREE_CODE (decl->decl) == SSA_NAME)
|
||
|
|
+ {
|
||
|
|
+ tree inner = SSA_NAME_VAR (decl->decl);
|
||
|
|
+
|
||
|
|
+ if (inner && functions[i]->find_decl (inner) == NULL)
|
||
|
|
+ type->mark_escape (escape_no_record_var, NULL);
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ set_cfun (NULL);
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (dump_file && (dump_flags & TDF_DETAILS))
|
||
|
|
+ fprintf (dump_file, "\n end propagate_escape_via_no_record_var \n\n");
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
/* Prune the escaped types and their decls from what was recorded. */
|
||
|
|
|
||
|
|
void
|
||
|
|
@@ -5530,6 +5573,7 @@ ipa_struct_reorg::prune_escaped_types (void)
|
||
|
|
propagate_escape_via_original ();
|
||
|
|
propagate_escape_via_empty_with_no_original ();
|
||
|
|
propagate_escape_via_ext_func_types ();
|
||
|
|
+ propagate_escape_via_no_record_var ();
|
||
|
|
}
|
||
|
|
|
||
|
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||
|
|
diff --git a/gcc/testsuite/gcc.dg/struct/rf_void_ptr_ssa_name.c b/gcc/testsuite/gcc.dg/struct/rf_void_ptr_ssa_name.c
|
||
|
|
new file mode 100644
|
||
|
|
index 000000000..0f624b6b9
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/gcc/testsuite/gcc.dg/struct/rf_void_ptr_ssa_name.c
|
||
|
|
@@ -0,0 +1,125 @@
|
||
|
|
+// Add a void* ssa_name check and escape.
|
||
|
|
+/* { dg-do compile } */
|
||
|
|
+
|
||
|
|
+// includes
|
||
|
|
+#include "stdio.h"
|
||
|
|
+#include "stdlib.h"
|
||
|
|
+#include "time.h"
|
||
|
|
+#include "string.h"
|
||
|
|
+#include "limits.h"
|
||
|
|
+#include "float.h"
|
||
|
|
+
|
||
|
|
+#define JOTAI_NUM_RANDS_ 25
|
||
|
|
+
|
||
|
|
+const unsigned rand_primes[JOTAI_NUM_RANDS_] = {179, 103, 479, 647, 229, 37,
|
||
|
|
+271, 557, 263, 607, 18743, 50359, 21929, 48757, 98179, 12907, 52937, 64579,
|
||
|
|
+49957, 52567, 507163, 149939, 412157, 680861, 757751};
|
||
|
|
+
|
||
|
|
+int next_i ()
|
||
|
|
+{
|
||
|
|
+ int counter = 0;
|
||
|
|
+ return rand_primes[(++counter)%JOTAI_NUM_RANDS_];
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+float next_f ()
|
||
|
|
+{
|
||
|
|
+ int counter = 0;
|
||
|
|
+ return rand_primes[(++counter)%JOTAI_NUM_RANDS_] / 757751.0F;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+// Usage menu
|
||
|
|
+void usage()
|
||
|
|
+{
|
||
|
|
+ printf("%s", "Usage:\n\
|
||
|
|
+ prog [ARGS]\n\
|
||
|
|
+\nARGS:\n\
|
||
|
|
+ 0 big-arr\n\
|
||
|
|
+ 1 big-arr-10x\n\
|
||
|
|
+ 2 empty\n\
|
||
|
|
+\n\
|
||
|
|
+");
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+// ------------------------------------------------------------------------- //
|
||
|
|
+
|
||
|
|
+typedef unsigned long size_t; // Customize by platform.
|
||
|
|
+typedef long intptr_t;
|
||
|
|
+typedef unsigned long uintptr_t;
|
||
|
|
+typedef long scalar_t__; // Either arithmetic or pointer type.
|
||
|
|
+/* By default, we understand bool (as a convenience). */
|
||
|
|
+typedef int bool;
|
||
|
|
+#define false 0
|
||
|
|
+#define true 1
|
||
|
|
+
|
||
|
|
+/* Forward declarations */
|
||
|
|
+
|
||
|
|
+/* Type definitions */
|
||
|
|
+typedef size_t u32 ;
|
||
|
|
+struct octeon_device {int octeon_id; } ;
|
||
|
|
+
|
||
|
|
+/* Variables and functions */
|
||
|
|
+ size_t MAX_OCTEON_DEVICES ;
|
||
|
|
+ struct octeon_device** octeon_device ;
|
||
|
|
+
|
||
|
|
+int lio_get_device_id(void *dev)
|
||
|
|
+{
|
||
|
|
+ struct octeon_device *octeon_dev = (struct octeon_device *)dev;
|
||
|
|
+ u32 i;
|
||
|
|
+
|
||
|
|
+ for (i = 0; i < MAX_OCTEON_DEVICES; i++)
|
||
|
|
+ {
|
||
|
|
+ if (octeon_device[i] == octeon_dev)
|
||
|
|
+ return octeon_dev->octeon_id;
|
||
|
|
+ }
|
||
|
|
+ return -1;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+// ------------------------------------------------------------------------- //
|
||
|
|
+
|
||
|
|
+int main(int argc, char *argv[])
|
||
|
|
+{
|
||
|
|
+ if (argc != 2)
|
||
|
|
+ {
|
||
|
|
+ usage();
|
||
|
|
+ return 1;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ int opt = atoi(argv[1]);
|
||
|
|
+ switch(opt)
|
||
|
|
+ {
|
||
|
|
+ // big-arr
|
||
|
|
+ case 0:
|
||
|
|
+ {
|
||
|
|
+ void * dev;
|
||
|
|
+ int benchRet = lio_get_device_id(dev);
|
||
|
|
+ printf("%d\n", benchRet);
|
||
|
|
+ break;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ // big-arr-10x
|
||
|
|
+ case 1:
|
||
|
|
+ {
|
||
|
|
+ void * dev;
|
||
|
|
+ int benchRet = lio_get_device_id(dev);
|
||
|
|
+ printf("%d\n", benchRet);
|
||
|
|
+ break;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ // empty
|
||
|
|
+ case 2:
|
||
|
|
+ {
|
||
|
|
+ void * dev;
|
||
|
|
+ int benchRet = lio_get_device_id(dev);
|
||
|
|
+ printf("%d\n", benchRet);
|
||
|
|
+ break;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ default:
|
||
|
|
+ usage();
|
||
|
|
+ break;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+/* { dg-final { scan-ipa-dump "No structures to transform" "struct_reorg" } } */
|
||
|
|
--
|
||
|
|
2.33.0
|
||
|
|
|