147 lines
4.3 KiB
Diff
147 lines
4.3 KiB
Diff
|
|
From b66a843505f32685f428c502f1a88e0f681b4acd Mon Sep 17 00:00:00 2001
|
||
|
|
From: eastb233 <xiezhiheng@huawei.com>
|
||
|
|
Date: Thu, 15 Sep 2022 17:57:00 +0800
|
||
|
|
Subject: [PATCH] [Struct Reorg] Type simplify limitation when in structure
|
||
|
|
optimizaiton
|
||
|
|
|
||
|
|
When enable structure optimization, we should not simplify
|
||
|
|
TYPE NODE. But now we unconditionally skip the simplification
|
||
|
|
under structure optimization regardless of whether it takes
|
||
|
|
effect. So add the same limitation as the optimization has.
|
||
|
|
---
|
||
|
|
gcc/ipa-struct-reorg/ipa-struct-reorg.c | 72 ++++++++++++-------------
|
||
|
|
gcc/tree.c | 13 ++++-
|
||
|
|
2 files changed, 47 insertions(+), 38 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/gcc/ipa-struct-reorg/ipa-struct-reorg.c b/gcc/ipa-struct-reorg/ipa-struct-reorg.c
|
||
|
|
index 8d3da35400d..54c20ca3f33 100644
|
||
|
|
--- a/gcc/ipa-struct-reorg/ipa-struct-reorg.c
|
||
|
|
+++ b/gcc/ipa-struct-reorg/ipa-struct-reorg.c
|
||
|
|
@@ -104,6 +104,42 @@ along with GCC; see the file COPYING3. If not see
|
||
|
|
|
||
|
|
#define VOID_POINTER_P(type) (POINTER_TYPE_P (type) && VOID_TYPE_P (TREE_TYPE (type)))
|
||
|
|
|
||
|
|
+/* Check whether in C language or LTO with only C language. */
|
||
|
|
+bool
|
||
|
|
+lang_c_p (void)
|
||
|
|
+{
|
||
|
|
+ const char *language_string = lang_hooks.name;
|
||
|
|
+
|
||
|
|
+ if (!language_string)
|
||
|
|
+ {
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (lang_GNU_C ())
|
||
|
|
+ {
|
||
|
|
+ return true;
|
||
|
|
+ }
|
||
|
|
+ else if (strcmp (language_string, "GNU GIMPLE") == 0) // for LTO check
|
||
|
|
+ {
|
||
|
|
+ unsigned i = 0;
|
||
|
|
+ tree t = NULL_TREE;
|
||
|
|
+
|
||
|
|
+ FOR_EACH_VEC_SAFE_ELT (all_translation_units, i, t)
|
||
|
|
+ {
|
||
|
|
+ language_string = TRANSLATION_UNIT_LANGUAGE (t);
|
||
|
|
+ if (language_string == NULL
|
||
|
|
+ || strncmp (language_string, "GNU C", 5)
|
||
|
|
+ || (language_string[5] != '\0'
|
||
|
|
+ && !(ISDIGIT (language_string[5]))))
|
||
|
|
+ {
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+ return true;
|
||
|
|
+ }
|
||
|
|
+ return false;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
namespace {
|
||
|
|
|
||
|
|
using namespace struct_reorg;
|
||
|
|
@@ -163,42 +199,6 @@ handled_type (tree type)
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
-/* Check whether in C language or LTO with only C language. */
|
||
|
|
-bool
|
||
|
|
-lang_c_p (void)
|
||
|
|
-{
|
||
|
|
- const char *language_string = lang_hooks.name;
|
||
|
|
-
|
||
|
|
- if (!language_string)
|
||
|
|
- {
|
||
|
|
- return false;
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if (lang_GNU_C ())
|
||
|
|
- {
|
||
|
|
- return true;
|
||
|
|
- }
|
||
|
|
- else if (strcmp (language_string, "GNU GIMPLE") == 0) // for LTO check
|
||
|
|
- {
|
||
|
|
- unsigned i = 0;
|
||
|
|
- tree t = NULL_TREE;
|
||
|
|
-
|
||
|
|
- FOR_EACH_VEC_SAFE_ELT (all_translation_units, i, t)
|
||
|
|
- {
|
||
|
|
- language_string = TRANSLATION_UNIT_LANGUAGE (t);
|
||
|
|
- if (language_string == NULL
|
||
|
|
- || strncmp (language_string, "GNU C", 5)
|
||
|
|
- || (language_string[5] != '\0'
|
||
|
|
- && !(ISDIGIT (language_string[5]))))
|
||
|
|
- {
|
||
|
|
- return false;
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
- return true;
|
||
|
|
- }
|
||
|
|
- return false;
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
/* Get the number of pointer layers. */
|
||
|
|
|
||
|
|
int
|
||
|
|
diff --git a/gcc/tree.c b/gcc/tree.c
|
||
|
|
index c2075d73586..84a440b3576 100644
|
||
|
|
--- a/gcc/tree.c
|
||
|
|
+++ b/gcc/tree.c
|
||
|
|
@@ -128,6 +128,9 @@ const char *const tree_code_class_strings[] =
|
||
|
|
/* obstack.[ch] explicitly declined to prototype this. */
|
||
|
|
extern int _obstack_allocated_p (struct obstack *h, void *obj);
|
||
|
|
|
||
|
|
+/* Check whether in C language or LTO with only C language. */
|
||
|
|
+extern bool lang_c_p (void);
|
||
|
|
+
|
||
|
|
/* Statistics-gathering stuff. */
|
||
|
|
|
||
|
|
static uint64_t tree_code_counts[MAX_TREE_CODES];
|
||
|
|
@@ -5219,7 +5222,10 @@ fld_simplified_type_name (tree type)
|
||
|
|
/* Simplify type will cause that struct A and struct A within
|
||
|
|
struct B are different type pointers, so skip it in structure
|
||
|
|
optimizations. */
|
||
|
|
- if (flag_ipa_struct_layout || flag_ipa_struct_reorg)
|
||
|
|
+ if ((flag_ipa_struct_layout || flag_ipa_struct_reorg)
|
||
|
|
+ && lang_c_p ()
|
||
|
|
+ && flag_lto_partition == LTO_PARTITION_ONE
|
||
|
|
+ && (in_lto_p || flag_whole_program))
|
||
|
|
return TYPE_NAME (type);
|
||
|
|
|
||
|
|
if (!TYPE_NAME (type) || TREE_CODE (TYPE_NAME (type)) != TYPE_DECL)
|
||
|
|
@@ -5463,7 +5469,10 @@ fld_simplified_type (tree t, class free_lang_data_d *fld)
|
||
|
|
/* Simplify type will cause that struct A and struct A within
|
||
|
|
struct B are different type pointers, so skip it in structure
|
||
|
|
optimizations. */
|
||
|
|
- if (flag_ipa_struct_layout || flag_ipa_struct_reorg)
|
||
|
|
+ if ((flag_ipa_struct_layout || flag_ipa_struct_reorg)
|
||
|
|
+ && lang_c_p ()
|
||
|
|
+ && flag_lto_partition == LTO_PARTITION_ONE
|
||
|
|
+ && (in_lto_p || flag_whole_program))
|
||
|
|
return t;
|
||
|
|
if (POINTER_TYPE_P (t))
|
||
|
|
return fld_incomplete_type_of (t, fld);
|
||
|
|
--
|
||
|
|
2.21.0.windows.1
|
||
|
|
|