summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-03-07 14:15:56 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-03-07 14:15:56 +0000
commit57548bf579a86a1e80a0b2e4a385f18dc65e0057 (patch)
tree174ab48133312ec86f9e42ef7360c9246e6df08a /gcc
parent4ae13300cd12a603847f1afd152103e0ad48d89a (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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr70115.c20
-rw-r--r--gcc/tree-ssa-loop-ivcanon.c36
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);
}