[ARM] PR target/70566 Check that condition register is dead in tst-imm -> lsls-imm...
authorktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2016 09:39:44 +0000 (09:39 +0000)
committerktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2016 09:39:44 +0000 (09:39 +0000)
PR target/70566
* config/arm/thumb2.md (tst + branch-> lsls + branch
peephole below *orsi_not_shiftsi_si): Require that condition
register is dead after the peephole.
(second peephole after the above): Likewise.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234825 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/thumb2.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr70566.c [new file with mode: 0644]

index 980ae25..7fe1c42 100644 (file)
@@ -1,3 +1,11 @@
+2016-04-08  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR target/70566
+       * config/arm/thumb2.md (tst + branch-> lsls + branch
+       peephole below *orsi_not_shiftsi_si): Require that condition
+       register is dead after the peephole.
+       (second peephole after the above): Likewise.
+
 2016-04-08  Alan Modra  <amodra@gmail.com>
 
        PR target/70117
index 9925365..ab08288 100644 (file)
                      (match_operand 5 "" "")
                      (match_operand 6 "" "")))]
   "TARGET_THUMB2
-   && (INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32)"
+   && (INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32)
+   && peep2_reg_dead_p (2, operands[0])"
   [(parallel [(set (match_dup 0)
                   (compare:CC_NOOV (ashift:SI (match_dup 1) (match_dup 2))
                                    (const_int 0)))
                      (match_operand 5 "" "")
                      (match_operand 6 "" "")))]
   "TARGET_THUMB2
-   && (INTVAL (operands[2]) > 0 && INTVAL (operands[2]) < 32)"
+   && (INTVAL (operands[2]) > 0 && INTVAL (operands[2]) < 32)
+   && peep2_reg_dead_p (2, operands[0])"
   [(parallel [(set (match_dup 0)
                   (compare:CC_NOOV (ashift:SI (match_dup 1) (match_dup 2))
                                    (const_int 0)))
index bd77314..2668b0d 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-08  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR target/70566
+       * gcc.c-torture/execute/pr70566.c: New test.
+
 2016-04-08  Tom de Vries  <tom@codesourcery.com>
 
        * c-c++-common/goacc/uninit-copy-clause.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr70566.c b/gcc/testsuite/gcc.c-torture/execute/pr70566.c
new file mode 100644 (file)
index 0000000..f47106e
--- /dev/null
@@ -0,0 +1,47 @@
+/* PR target/70566.  */
+
+#define NULL 0
+
+struct mystruct
+{
+  unsigned int f1 : 1;
+  unsigned int f2 : 1;
+  unsigned int f3 : 1;
+};
+
+__attribute__ ((noinline)) void
+myfunc (int a, void *b)
+{
+}
+__attribute__ ((noinline)) int
+myfunc2 (void *a)
+{
+  return 0;
+}
+
+static void
+set_f2 (struct mystruct *user, int f2)
+{
+  if (user->f2 != f2)
+    myfunc (myfunc2 (NULL), NULL);
+  else
+    __builtin_abort ();
+}
+
+__attribute__ ((noinline)) void
+foo (void *data)
+{
+  struct mystruct *user = data;
+  if (!user->f2)
+    set_f2 (user, 1);
+}
+
+int
+main (void)
+{
+  struct mystruct a;
+  a.f1 = 1;
+  a.f2 = 0;
+  foo (&a);
+  return 0;
+}