[AArch64] Restore recog state after finding pre-madd instruction
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Wed, 29 Oct 2014 21:44:05 +0000 (21:44 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Wed, 29 Oct 2014 21:44:05 +0000 (21:44 +0000)
* config/aarch64/aarch64.c (aarch64_madd_needs_nop): Restore
recog state after aarch64_prev_real_insn call.

* gcc.target/aarch64/madd_after_asm_1.c: New test.

From-SVN: r216852

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/madd_after_asm_1.c [new file with mode: 0644]

index 9c85fa9361c888a36c0d8ce364c2ad9f9284892a..80935753a35a9c11b6545ba9b991e9329be7088a 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-29  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_madd_needs_nop): Restore
+       recog state after aarch64_prev_real_insn call.
+
 2014-10-29  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/aarch64/aarch64.h (MACHMODE): Add 'enum' to machine_mode.
index e222ee37cf257a4449ec4fa0e74736524088721b..0400fd503d26b2bb482589a14d10e032edba83b3 100644 (file)
@@ -7770,6 +7770,10 @@ aarch64_madd_needs_nop (rtx_insn* insn)
     return false;
 
   prev = aarch64_prev_real_insn (insn);
+  /* aarch64_prev_real_insn can call recog_memoized on insns other than INSN.
+     Restore recog state to INSN to avoid state corruption.  */
+  extract_constrain_insn_cached (insn);
+
   if (!prev || !has_memory_op (prev))
     return false;
 
index 2955cfd58e3f8fe017d69bfdcec137b4ff239c6d..a362f13578263ae4dfda52b9c5138c3db1089ae3 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-29  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * gcc.target/aarch64/madd_after_asm_1.c: New test.
+
 2014-10-29  DJ Delorie  <dj@redhat.com>
 
        * gcc.dg/20141029-1.c: New.
diff --git a/gcc/testsuite/gcc.target/aarch64/madd_after_asm_1.c b/gcc/testsuite/gcc.target/aarch64/madd_after_asm_1.c
new file mode 100644 (file)
index 0000000..523941d
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do assemble } */
+/* { dg-options "-O2 -mfix-cortex-a53-835769" } */
+
+int
+test (int a, double b, int c, int d, int e)
+{
+  double result;
+  __asm__ __volatile ("// %0, %1"
+                      : "=w" (result)
+                      : "0" (b)
+                      :    /* No clobbers */
+                      );
+  return c * d + e;
+}