diff options
author | Richard Biener <rguenther@suse.de> | 2016-03-07 14:15:56 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-03-07 14:15:56 +0000 |
commit | 57548bf579a86a1e80a0b2e4a385f18dc65e0057 (patch) | |
tree | 174ab48133312ec86f9e42ef7360c9246e6df08a /gcc | |
parent | 4ae13300cd12a603847f1afd152103e0ad48d89a (diff) |
re PR tree-optimization/70115 (gcc ICE at -O2 (seg fault) and above on valid code on x86_64-linux-gnu)
2016-03-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/70115
* tree-ssa-loop-ivcanon.c (propagate_into_all_uses): Remove.
(propagate_constants_for_unrolling): Use replace_uses_by.
* gcc.dg/torture/pr70115.c: New testcase.
From-SVN: r234027
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr70115.c | 20 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivcanon.c | 36 |
4 files changed, 33 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5b14b176aea..04fb3361f41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-03-07 Richard Biener <rguenther@suse.de> + + PR tree-optimization/70115 + * tree-ssa-loop-ivcanon.c (propagate_into_all_uses): Remove. + (propagate_constants_for_unrolling): Use replace_uses_by. + 2016-03-07 Nathan Sidwell <nathan@codesourcery.com> PR middle-end/69916 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7d4d3424990..a0d3c2a5786 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-03-07 Richard Biener <rguenther@suse.de> + + PR tree-optimization/70115 + * gcc.dg/torture/pr70115.c: New testcase. + 2016-03-07 Nathan Sidwell <nathan@codesourcery.com> PR middle-end/69916 diff --git a/gcc/testsuite/gcc.dg/torture/pr70115.c b/gcc/testsuite/gcc.dg/torture/pr70115.c new file mode 100644 index 00000000000..0044fe4c2b1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr70115.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ + +typedef int size_t; +char a; +int main() +{ + size_t b, c; + for (;;) + { + b = 0; + for (; c;) + ; + for (; b < sizeof(long); b++) + ; + for (; b < c; b++) + a++; + for (; c < b; c++) + ; + } +} diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index ab1f7e6d7a9..1a4d6df7062 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -1164,38 +1164,6 @@ canonicalize_induction_variables (void) return 0; } -/* Propagate VAL into all uses of SSA_NAME. */ - -static void -propagate_into_all_uses (tree ssa_name, tree val) -{ - imm_use_iterator iter; - gimple *use_stmt; - - FOR_EACH_IMM_USE_STMT (use_stmt, iter, ssa_name) - { - gimple_stmt_iterator use_stmt_gsi = gsi_for_stmt (use_stmt); - use_operand_p use; - - FOR_EACH_IMM_USE_ON_STMT (use, iter) - SET_USE (use, val); - - if (is_gimple_assign (use_stmt) - && get_gimple_rhs_class (gimple_assign_rhs_code (use_stmt)) - == GIMPLE_SINGLE_RHS) - { - tree rhs = gimple_assign_rhs1 (use_stmt); - - if (TREE_CODE (rhs) == ADDR_EXPR) - recompute_tree_invariant_for_addr_expr (rhs); - } - - fold_stmt_inplace (&use_stmt_gsi); - update_stmt (use_stmt); - maybe_clean_or_replace_eh_stmt (use_stmt, use_stmt); - } -} - /* Propagate constant SSA_NAMEs defined in basic block BB. */ static void @@ -1212,7 +1180,7 @@ propagate_constants_for_unrolling (basic_block bb) && gimple_phi_num_args (phi) == 1 && TREE_CODE (arg) == INTEGER_CST) { - propagate_into_all_uses (result, arg); + replace_uses_by (result, arg); gsi_remove (&gsi, true); release_ssa_name (result); } @@ -1231,7 +1199,7 @@ propagate_constants_for_unrolling (basic_block bb) && (lhs = gimple_assign_lhs (stmt), TREE_CODE (lhs) == SSA_NAME) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)) { - propagate_into_all_uses (lhs, gimple_assign_rhs1 (stmt)); + replace_uses_by (lhs, gimple_assign_rhs1 (stmt)); gsi_remove (&gsi, true); release_ssa_name (lhs); } |