[RTL ifcvt] PR rtl-optimization/66940: Avoid signed overflow in noce_get_alt_condition
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Wed, 25 May 2016 15:53:21 +0000 (15:53 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Wed, 25 May 2016 15:53:21 +0000 (15:53 +0000)
PR rtl-optimization/66940
* ifcvt.c (noce_get_alt_condition): Check that incrementing or
decrementing desired_val will not overflow before performing these
operations.

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

From-SVN: r236728

gcc/ChangeLog
gcc/ifcvt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr66940.c [new file with mode: 0644]

index 4af0254ca987a83d11b66f1e7f655f1368d94117..92f094b5655d94947be5291d872af794920ee7da 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR rtl-optimization/66940
+       * ifcvt.c (noce_get_alt_condition): Check that incrementing or
+       decrementing desired_val will not overflow before performing these
+       operations.
+
 2016-05-25  Ilya Verbin  <ilya.verbin@intel.com>
 
        * config/i386/i386-builtin-types.def: Add V16SI_FTYPE_V16SF,
index 4949965c9dc771bbd2f219fa72bdace3d40424da..44ae020db2477597f5f9c5dd031e75139d2a5058 100644 (file)
@@ -2364,28 +2364,32 @@ noce_get_alt_condition (struct noce_if_info *if_info, rtx target,
          switch (code)
            {
            case LT:
-             if (actual_val == desired_val + 1)
+             if (desired_val != HOST_WIDE_INT_MAX
+                 && actual_val == desired_val + 1)
                {
                  code = LE;
                  op_b = GEN_INT (desired_val);
                }
              break;
            case LE:
-             if (actual_val == desired_val - 1)
+             if (desired_val != HOST_WIDE_INT_MIN
+                 && actual_val == desired_val - 1)
                {
                  code = LT;
                  op_b = GEN_INT (desired_val);
                }
              break;
            case GT:
-             if (actual_val == desired_val - 1)
+             if (desired_val != HOST_WIDE_INT_MIN
+                 && actual_val == desired_val - 1)
                {
                  code = GE;
                  op_b = GEN_INT (desired_val);
                }
              break;
            case GE:
-             if (actual_val == desired_val + 1)
+             if (desired_val != HOST_WIDE_INT_MAX
+                 && actual_val == desired_val + 1)
                {
                  code = GT;
                  op_b = GEN_INT (desired_val);
index 8070adb9df081d86cf2005f1cbaaa204266ee79a..fb7713d32559ed4cc7cd0c88b42f124695a4066b 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR rtl-optimization/66940
+       * gcc.c-torture/execute/pr66940.c: New test.
+
 2016-05-25  Ilya Verbin  <ilya.verbin@intel.com>
 
        * gcc.target/i386/avx512f-ceil-vec-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr66940.c b/gcc/testsuite/gcc.c-torture/execute/pr66940.c
new file mode 100644 (file)
index 0000000..fbd109d
--- /dev/null
@@ -0,0 +1,20 @@
+long long __attribute__ ((noinline, noclone))
+foo (long long ival)
+{
+ if (ival <= 0)
+    return -0x7fffffffffffffffL - 1;
+
+ return 0x7fffffffffffffffL;
+}
+
+int
+main (void)
+{
+  if (foo (-1) != (-0x7fffffffffffffffL - 1))
+    __builtin_abort ();
+
+  if (foo (1) != 0x7fffffffffffffffL)
+    __builtin_abort ();
+
+  return 0;
+}