]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/57568 (wrong code for assignment in conditional at -Os)
authorJakub Jelinek <jakub@redhat.com>
Sun, 9 Jun 2013 18:37:51 +0000 (20:37 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 9 Jun 2013 18:37:51 +0000 (20:37 +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: r199872

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

index d6ed9bbf2bfcfabcb5378f3fb2e5b518b7e05fb4..f74e049046af84f9b19eb23ede1e42c3164c212f 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-05-22  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/57356
index b0e278e917c868950670f01bf003c6cb323c93a9..c76cd6bac52c2566e468d98b9c4325c8bdfff290 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 f80afa0ad46c6864fed1203da223c39bd52e83bc..d1abd627cc0c1d5b516e563cacb7b21592a8f95c 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-06  Tobias Burnus  <burnus@net-b.de>
 
        Backport from mainline
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;
+}