diff options
Diffstat (limited to '0022-StructReorderFields-Fix-pointer-layer-check-bug.patch')
-rw-r--r-- | 0022-StructReorderFields-Fix-pointer-layer-check-bug.patch | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/0022-StructReorderFields-Fix-pointer-layer-check-bug.patch b/0022-StructReorderFields-Fix-pointer-layer-check-bug.patch new file mode 100644 index 0000000..effad4e --- /dev/null +++ b/0022-StructReorderFields-Fix-pointer-layer-check-bug.patch @@ -0,0 +1,167 @@ +From 1c69390a01d3bf7226fce2a670a0f71731744b04 Mon Sep 17 00:00:00 2001 +From: huangxiaoquan <huangxiaoquan1@huawei.com> +Date: Tue, 17 Aug 2021 15:50:31 +0800 +Subject: [PATCH 22/22] [StructReorderFields] Fix pointer layer check bug + +In the pointer layer check, the NULL pointer check is added +for the escape type mark. + +diff --git a/gcc/ipa-struct-reorg/ipa-struct-reorg.c b/gcc/ipa-struct-reorg/ipa-struct-reorg.c +index fe364f742d8..85986ce5803 100644 +--- a/gcc/ipa-struct-reorg/ipa-struct-reorg.c ++++ b/gcc/ipa-struct-reorg/ipa-struct-reorg.c +@@ -2235,9 +2235,9 @@ check_record_ptr_usage (gimple *use_stmt, tree ¤t_node, + } + + bool res = true; +- /* MEM[(long int *)a_1] = _57; (record). ++ /* MEM[(long int *)a_1] = _1; (record). + If lhs is ssa_name, lhs cannot be the current node. +- _283 = _282->flow; (No record). */ ++ _2 = _1->flow; (No record). */ + if (TREE_CODE (rhs1) == SSA_NAME) + { + tree tmp = (rhs1 != current_node) ? rhs1 : lhs; +@@ -2285,13 +2285,13 @@ check_record_single_node (gimple *use_stmt, tree ¤t_node, + bool res = true; + if (TREE_CODE (lhs) == SSA_NAME && TREE_CODE (rhs1) == MEM_REF) + { +- /* _257 = MEM[(struct arc_t * *)_17]. */ ++ /* add such as: _2 = MEM[(struct arc_t * *)_1]. */ + res = add_node (lhs, *ptr_layers.get (current_node) - 1, + ptr_layers, ssa_name_stack); + } + else if (TREE_CODE (lhs) == MEM_REF && TREE_CODE (rhs1) == SSA_NAME) + { +- /* MEM[(long int *)a_1] = _57. */ ++ /* add such as: MEM[(long int *)a_1] = _1. */ + if (rhs1 == current_node) + { + res = add_node (TREE_OPERAND (lhs, 0), +@@ -3097,7 +3097,8 @@ ipa_struct_reorg::find_vars (gimple *stmt) + isptrptr (TREE_TYPE (rhs)) ? TREE_TYPE (rhs) : NULL); + } + } +- /* void * _1; struct arc * _2; ++ /* find void ssa_name such as: ++ void * _1; struct arc * _2; + _2 = _1 + _3; _1 = calloc (100, 40). */ + if (TREE_CODE (rhs) == SSA_NAME + && VOID_POINTER_P (TREE_TYPE (rhs)) +@@ -3126,7 +3127,7 @@ ipa_struct_reorg::find_vars (gimple *stmt) + find_var (gimple_assign_rhs1 (stmt), stmt); + find_var (gimple_assign_rhs2 (stmt), stmt); + } +- /* _23 = _21 - old_arcs_12. */ ++ /* find void ssa_name from stmt such as: _2 = _1 - old_arcs_1. */ + else if ((current_mode == STRUCT_REORDER_FIELDS) + && gimple_assign_rhs_code (stmt) == POINTER_DIFF_EXPR + && types_compatible_p ( +@@ -3310,7 +3311,7 @@ trace_calculate_negate (gimple *size_def_stmt, tree *num, tree struct_size) + { + gcc_assert (gimple_assign_rhs_code (size_def_stmt) == NEGATE_EXPR); + +- /* _480 = -_479; _479 = _478 * 72. */ ++ /* support NEGATE_EXPR trace: _3 = -_2; _2 = _1 * 72. */ + tree num1 = NULL_TREE; + tree arg0 = gimple_assign_rhs1 (size_def_stmt); + if (!is_result_of_mult (arg0, &num1, struct_size) || num1 == NULL_TREE) +@@ -3329,7 +3330,8 @@ trace_calculate_diff (gimple *size_def_stmt, tree *num) + { + gcc_assert (gimple_assign_rhs_code (size_def_stmt) == NOP_EXPR); + +- /* _25 = (long unsigned int) _23; _23 = _21 - old_arcs_12. */ ++ /* support POINTER_DIFF_EXPR trace: ++ _3 = (long unsigned int) _2; _2 = _1 - old_arcs_1. */ + tree arg = gimple_assign_rhs1 (size_def_stmt); + size_def_stmt = SSA_NAME_DEF_STMT (arg); + if (size_def_stmt && is_gimple_assign (size_def_stmt) +@@ -3811,8 +3813,8 @@ ipa_struct_reorg::get_type_field (tree expr, tree &base, bool &indirect, + release INTEGER_TYPE cast to struct pointer. + (If t has escpaed above, then directly returns + and doesn't mark escape follow.). */ +- /* _607 = MEM[(struct arc_t * *)pl_100]. +- then base pl_100:ssa_name - pointer_type - integer_type. */ ++ /* _1 = MEM[(struct arc_t * *)a_1]. ++ then base a_1: ssa_name - pointer_type - integer_type. */ + if (current_mode == STRUCT_REORDER_FIELDS) + { + bool is_int_ptr = POINTER_TYPE_P (TREE_TYPE (base)) +@@ -4520,8 +4522,15 @@ ipa_struct_reorg::check_ptr_layers (tree a_expr, tree b_expr, gimple* stmt) + { + return; + } +- a->type->mark_escape (escape_cast_another_ptr, stmt); +- b->type->mark_escape (escape_cast_another_ptr, stmt); ++ ++ if (a) ++ { ++ a->type->mark_escape (escape_cast_another_ptr, stmt); ++ } ++ if (b) ++ { ++ b->type->mark_escape (escape_cast_another_ptr, stmt); ++ } + } + + void +@@ -5649,9 +5658,9 @@ ipa_struct_reorg::rewrite_expr (tree expr, tree newexpr[max_split], bool ignore_ + if (current_mode == STRUCT_REORDER_FIELDS) + { + /* Supports the MEM_REF offset. +- _1 = MEM[(struct arc *)ap_4 + 72B].flow; +- Old rewrite:_1 = ap.reorder.0_8->flow; +- New rewrite:_1 ++ _1 = MEM[(struct arc *)ap_1 + 72B].flow; ++ Old rewrite: _1 = ap.reorder.0_8->flow; ++ New rewrite: _1 + = MEM[(struct arc.reorder.0 *)ap.reorder.0_8 + 64B].flow; + */ + HOST_WIDE_INT offset_tmp = 0; +@@ -6150,10 +6159,10 @@ ipa_struct_reorg::rewrite_cond (gcond *stmt, gimple_stmt_iterator *gsi) + return false; + } + +- /* Old rewrite:if (x_1 != 0B) ++ /* Old rewrite: if (x_1 != 0B) + -> _1 = x.reorder.0_1 != 0B; if (_1 != 1) + The logic is incorrect. +- New rewrite:if (x_1 != 0B) ++ New rewrite: if (x_1 != 0B) + -> if (x.reorder.0_1 != 0B);*/ + for (unsigned i = 0; i < max_split && (newlhs[i] || newrhs[i]); i++) + { +diff --git a/gcc/testsuite/gcc.dg/struct/rf_check_ptr_layers_bug.c b/gcc/testsuite/gcc.dg/struct/rf_check_ptr_layers_bug.c +new file mode 100644 +index 00000000000..a5477dcc9be +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/struct/rf_check_ptr_layers_bug.c +@@ -0,0 +1,24 @@ ++/* check_ptr_layers bugfix.*/ ++/* { dg-do compile } */ ++struct { ++ char a; ++} **b = 0, *e = 0; ++long c; ++char d = 9; ++int f; ++ ++void g() ++{ ++ for (; f;) ++ if (c) ++ (*e).a++; ++ if (!d) ++ for (;;) ++ b &&c; ++} ++int ++main() ++{ ++ g(); ++} ++/* { dg-final { scan-ipa-dump "No structures to transform." "reorder_fields" } } */ +\ No newline at end of file +-- +2.21.0.windows.1 + |