[simplify-rtx] (GTU (PLUS a C) (C - 1)) --> (LTU a -C)
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Mon, 19 Sep 2016 16:15:57 +0000 (16:15 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Mon, 19 Sep 2016 16:15:57 +0000 (16:15 +0000)
* simplify-rtx.c (simplify_relational_operation_1): Add transformation
(GTU (PLUS a C) (C - 1)) --> (LTU a -C).

* gcc.target/aarch64/gtu_to_ltu_cmp_1.c: New test.
* gcc.target/aarch64/gtu_to_ltu_cmp_2.c: New test.

From-SVN: r240238

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/gtu_to_ltu_cmp_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/gtu_to_ltu_cmp_2.c [new file with mode: 0644]

index 905316d281450b7abdb8a0d671aed91ccd92b9cc..51244467892a3fd28908dac8975d258a4b8a7ae7 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-19  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * simplify-rtx.c (simplify_relational_operation_1): Add transformation
+       (GTU (PLUS a C) (C - 1)) --> (LTU a -C).
+
 2016-09-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * target.def (lra_p): Wordsmithing.
index 8daef97b473d6ee1c1abb8f6f557f496bb85f374..035f70e89b5eb4b45053480007caa24f5edc538d 100644 (file)
@@ -4650,6 +4650,19 @@ simplify_relational_operation_1 (enum rtx_code code, machine_mode mode,
                                      cmp_mode, XEXP (op0, 0), new_cmp);
     }
 
+  /* (GTU (PLUS a C) (C - 1)) where C is a non-zero constant can be
+     transformed into (LTU a -C).  */
+  if (code == GTU && GET_CODE (op0) == PLUS && CONST_INT_P (op1)
+      && CONST_INT_P (XEXP (op0, 1))
+      && (UINTVAL (op1) == UINTVAL (XEXP (op0, 1)) - 1)
+      && XEXP (op0, 1) != const0_rtx)
+    {
+      rtx new_cmp
+       = simplify_gen_unary (NEG, cmp_mode, XEXP (op0, 1), cmp_mode);
+      return simplify_gen_relational (LTU, mode, cmp_mode,
+                                      XEXP (op0, 0), new_cmp);
+    }
+
   /* Canonicalize (LTU/GEU (PLUS a b) b) as (LTU/GEU (PLUS a b) a).  */
   if ((code == LTU || code == GEU)
       && GET_CODE (op0) == PLUS
index 361ed14ca875139ff9458b682beaf14bb8965adc..7f2f057fa0dd869bfcd107adf8c284646041bf4a 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-19  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * gcc.target/aarch64/gtu_to_ltu_cmp_1.c: New test.
+       * gcc.target/aarch64/gtu_to_ltu_cmp_2.c: New test.
+
 2016-09-19  Jakub Jelinek  <jakub@redhat.com>
            Jan Hubicka  <jh@suse.cz>
 
diff --git a/gcc/testsuite/gcc.target/aarch64/gtu_to_ltu_cmp_1.c b/gcc/testsuite/gcc.target/aarch64/gtu_to_ltu_cmp_1.c
new file mode 100644 (file)
index 0000000..81c536c
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+f1 (int x, int t)
+{
+  if (x == -1 || x == -2)
+    t = 1;
+
+  return t;
+}
+
+/* { dg-final { scan-assembler-times "cmn\\tw\[0-9\]+, #2" 1 } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/gtu_to_ltu_cmp_2.c b/gcc/testsuite/gcc.target/aarch64/gtu_to_ltu_cmp_2.c
new file mode 100644 (file)
index 0000000..e0e999f
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned int
+foo (unsigned int a, unsigned int b)
+{
+  return (a + 10) > 9;
+}
+
+/* { dg-final { scan-assembler-times "cmn\\tw\[0-9\]+" 1 } } */
+/* { dg-final { scan-assembler-not "add\\tw\[0-9\]+" } } */