re PR rtl-optimization/57568 (wrong code for assignment in conditional at -Os)
authorJakub Jelinek <jakub@redhat.com>
Sun, 9 Jun 2013 18:30:01 +0000 (20:30 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 9 Jun 2013 18:30:01 +0000 (20:30 +0200)
PR target/57568
* config/i386/i386.md (TARGET_READ_MODIFY_WRITE peepholes): Ensure
that operands[2] doesn't overlap with operands[0].

* gcc.c-torture/execute/pr57568.c: New test.

From-SVN: r199870

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr57568.c [new file with mode: 0644]

index 30f667a0ce1eb22ca0d07676c5554fea01d8b251..2767fbb6904e0f3cababb0a64b8dcf1596a5fc57 100644 (file)
@@ -1,3 +1,9 @@
+2013-06-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/57568
+       * config/i386/i386.md (TARGET_READ_MODIFY_WRITE peepholes): Ensure
+       that operands[2] doesn't overlap with operands[0].
+
 2013-06-09  David Edelsohn  <dje.gcc@gmail.com>
            Jan Hubicka  <jh@suse.cz>
 
index 018678dc850292d761d7039dff6728b12cfa356d..e97a4570501cd3d833612f319f0deff8441c837a 100644 (file)
   "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
    && peep2_reg_dead_p (4, operands[0])
    && !reg_overlap_mentioned_p (operands[0], operands[1])
+   && !reg_overlap_mentioned_p (operands[0], operands[2])
    && (<MODE>mode != QImode
        || immediate_operand (operands[2], QImode)
        || q_regs_operand (operands[2], QImode))
        || immediate_operand (operands[2], SImode)
        || q_regs_operand (operands[2], SImode))
    && !reg_overlap_mentioned_p (operands[0], operands[1])
+   && !reg_overlap_mentioned_p (operands[0], operands[2])
    && ix86_match_ccmode (peep2_next_insn (3),
                         (GET_CODE (operands[3]) == PLUS
                          || GET_CODE (operands[3]) == MINUS)
index 0628bfa798bda09685c8f3bf0bec04db41c199f5..0ba3af62182add2163e5d494baee6f367025ab78 100644 (file)
@@ -1,3 +1,8 @@
+2013-06-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/57568
+       * gcc.c-torture/execute/pr57568.c: New test.
+
 2013-06-09  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/37404
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr57568.c b/gcc/testsuite/gcc.c-torture/execute/pr57568.c
new file mode 100644 (file)
index 0000000..9a7ddb0
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR target/57568 */
+
+extern void abort (void);
+int a[6][9] = { }, b = 1, *c = &a[3][5];
+
+int
+main ()
+{
+  if (b && (*c = *c + *c))
+    abort ();
+  return 0;
+}