aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-03-16 12:41:08 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-03-16 12:41:08 +0000
commitef13324ecab94740e5bb2f4c65e0600fe616e9ae (patch)
tree610cae3077906896402d52f6103099ad59a5184d
parentf0eddb90199eac4df644329c8cd0089b110062f1 (diff)
downloadgcc-ef13324ecab94740e5bb2f4c65e0600fe616e9ae.zip
gcc-ef13324ecab94740e5bb2f4c65e0600fe616e9ae.tar.gz
gcc-ef13324ecab94740e5bb2f4c65e0600fe616e9ae.tar.bz2
re PR c/48146 (ICE tree check: expected ssa_name, have var_decl in has_zero_uses, at tree-flow-inline.h:342)
2011-03-16 Richard Guenther <rguenther@suse.de> PR tree-optimization/48146 * tree-ssa-sink.c (sink_code_in_bb): Manually update virtual operands avoiding the need for renaming. * gcc.dg/torture/pr48146.c: New testcase. From-SVN: r171045
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr48146.c35
-rw-r--r--gcc/tree-ssa-sink.c14
4 files changed, 56 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f42547c..7e81a55 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2011-03-16 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/48146
+ * tree-ssa-sink.c (sink_code_in_bb): Manually update virtual
+ operands avoiding the need for renaming.
+
+2011-03-16 Richard Guenther <rguenther@suse.de>
+
* gimple-fold.c (maybe_fold_reference): Open-code relevant
constant folding. Move MEM_REF canonicalization first.
Rely on fold_const_aggregate_ref for initializer folding.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b3d5f81..2e6963b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2011-03-16 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/48146
+ * gcc.dg/torture/pr48146.c: New testcase.
+
+2011-03-16 Richard Guenther <rguenther@suse.de>
+
* gcc.dg/tree-ssa/pr14814.c: Adjust.
* gcc.dg/tree-ssa/ssa-ccp-19.c: Likewise.
diff --git a/gcc/testsuite/gcc.dg/torture/pr48146.c b/gcc/testsuite/gcc.dg/torture/pr48146.c
new file mode 100644
index 0000000..c208325
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr48146.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+
+static unsigned char
+safe_sub_func_int_s_s (int si1, unsigned char si2)
+{
+ return si1 ^ si2 & -si2 ^ si2 ? : si1 - si2;
+}
+
+int g_2[10] = {
+ 0x90AC204EL
+};
+
+volatile unsigned char g_39;
+
+unsigned char
+func_67 (unsigned short p_68)
+{
+ unsigned char l_92;
+ unsigned char l_74;
+ int *l = &g_2[6];
+lbl_90:*l ^= 1;
+ if (p_68)
+ goto lbl_93;
+ for (l_74 = 0;; l_74 = safe_sub_func_int_s_s (l_74, 1))
+ {
+ if (l_74)
+ goto lbl_90;
+lbl_93:l_92 ^= 0 != &g_39;
+ if (0)
+ {
+ }
+ else
+ *l = 1;
+ }
+}
diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c
index c3119ba..4dc5ae4 100644
--- a/gcc/tree-ssa-sink.c
+++ b/gcc/tree-ssa-sink.c
@@ -505,12 +505,18 @@ sink_code_in_bb (basic_block bb)
bb->index, (gsi_bb (togsi))->index);
}
- /* Prepare for VOP update. */
+ /* Update virtual operands of statements in the path we
+ do not sink to. */
if (gimple_vdef (stmt))
{
- unlink_stmt_vdef (stmt);
- gimple_set_vdef (stmt, gimple_vop (cfun));
- mark_sym_for_renaming (gimple_vop (cfun));
+ imm_use_iterator iter;
+ use_operand_p use_p;
+ gimple vuse_stmt;
+
+ FOR_EACH_IMM_USE_STMT (vuse_stmt, iter, gimple_vdef (stmt))
+ if (gimple_code (vuse_stmt) != GIMPLE_PHI)
+ FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
+ SET_USE (use_p, gimple_vuse (stmt));
}
/* If this is the end of the basic block, we need to insert at the end