aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-05-02 09:13:49 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-05-02 09:13:49 +0200
commit6aae324cce99057e81876888e5f83e20bad9f55d (patch)
treeded425eea0d88fb780f3a7aa47e92d5c227063ad
parent481c45f690ae5cfeca07e86c348ddfbe0885e069 (diff)
downloadgcc-6aae324cce99057e81876888e5f83e20bad9f55d.zip
gcc-6aae324cce99057e81876888e5f83e20bad9f55d.tar.gz
gcc-6aae324cce99057e81876888e5f83e20bad9f55d.tar.bz2
re PR rtl-optimization/53160 (likely wrong code bug)
PR rtl-optimization/53160 * ree.c (combine_reaching_defs): Handle the case where cand->insn has been modified by ree pass already. * gcc.c-torture/execute/pr53160.c: New test. From-SVN: r187035
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ree.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr53160.c35
4 files changed, 64 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5cf6a8f..972f3cc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-05-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/53160
+ * ree.c (combine_reaching_defs): Handle the case where cand->insn
+ has been modified by ree pass already.
+
2012-05-01 Ian Lance Taylor <iant@google.com>
PR c/37303
diff --git a/gcc/ree.c b/gcc/ree.c
index 86fd900..25ee7e2 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -667,6 +667,24 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
if (!outcome)
return false;
+ /* If cand->insn has been already modified, update cand->mode to a wider
+ mode if possible, or punt. */
+ if (state->modified[INSN_UID (cand->insn)].kind != EXT_MODIFIED_NONE)
+ {
+ enum machine_mode mode;
+ rtx set;
+
+ if (state->modified[INSN_UID (cand->insn)].kind
+ != (cand->code == ZERO_EXTEND
+ ? EXT_MODIFIED_ZEXT : EXT_MODIFIED_SEXT)
+ || state->modified[INSN_UID (cand->insn)].mode != cand->mode
+ || (set = single_set (cand->insn)) == NULL_RTX)
+ return false;
+ mode = GET_MODE (SET_DEST (set));
+ gcc_assert (GET_MODE_SIZE (mode) >= GET_MODE_SIZE (cand->mode));
+ cand->mode = mode;
+ }
+
merge_successful = true;
/* Go through the defs vector and try to merge all the definitions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8f32793..72d9379 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/53160
+ * gcc.c-torture/execute/pr53160.c: New test.
+
2012-05-01 Ian Lance Taylor <iant@google.com>
PR c/37303
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr53160.c b/gcc/testsuite/gcc.c-torture/execute/pr53160.c
new file mode 100644
index 0000000..1187e08
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr53160.c
@@ -0,0 +1,35 @@
+/* PR rtl-optimization/53160 */
+
+extern void abort (void);
+
+int a, c = 1, d, e, g;
+volatile int b;
+volatile char f;
+long h;
+short i;
+
+void
+foo (void)
+{
+ for (e = 0; e; ++e)
+ ;
+}
+
+int
+main ()
+{
+ if (g)
+ (void) b;
+ foo ();
+ for (d = 0; d >= 0; d--)
+ {
+ short j = f;
+ int k = 0;
+ i = j ? j : j << k;
+ }
+ h = c == 0 ? 0 : i;
+ a = h;
+ if (a != 0)
+ abort ();
+ return 0;
+}