]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Detect infinite recursion condition
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 15 Dec 2011 23:50:32 +0000 (23:50 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 15 Dec 2011 23:50:32 +0000 (15:50 -0800)
gcc/

2011-12-15  H.J. Lu  <hongjiu.lu@intel.com>

Backport from mainline.
2011-10-28  Chung-Lin Tang  <cltang@codesourcery.com>

PR rtl-optimization/49720
* simplify-rtx.c (simplify_relational_operation_1): Detect
infinite recursion condition in "(eq/ne (plus x cst1) cst2)
simplifies to (eq/ne x (cst2 - cst1))" case.

gcc/testsuite/

2011-12-15  H.J. Lu  <hongjiu.lu@intel.com>

Backport from mainline.
2011-10-28  Chung-Lin Tang  <cltang@codesourcery.com>

PR rtl-optimization/49720
* g++.dg/torture/pr49720.C: New test.

From-SVN: r182394

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr49720.C [new file with mode: 0644]

index eb00324cc191e59942d7deb65653500fe19720e8..ea113da104ee06d817374bbba60d7af5c744f46a 100644 (file)
@@ -1,3 +1,13 @@
+2011-12-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       Backport from mainline.
+       2011-10-28  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR rtl-optimization/49720
+       * simplify-rtx.c (simplify_relational_operation_1): Detect
+       infinite recursion condition in "(eq/ne (plus x cst1) cst2)
+       simplifies to (eq/ne x (cst2 - cst1))" case.
+
 2011-12-15  Andreas Tobler  <andreast@fgznet.ch>
 
        Backport from mainline.
index eb747ad3c86dae7e433e65f3587d24a9d7d497c1..ed4019622017614f58df65b669699e6e6042f2b5 100644 (file)
@@ -4177,10 +4177,20 @@ simplify_relational_operation_1 (enum rtx_code code, enum machine_mode mode,
     {
       rtx x = XEXP (op0, 0);
       rtx c = XEXP (op0, 1);
+      enum rtx_code invcode = op0code == PLUS ? MINUS : PLUS;
+      rtx tem = simplify_gen_binary (invcode, cmp_mode, op1, c);
+
+      /* Detect an infinite recursive condition, where we oscillate at this
+        simplification case between:
+           A + B == C  <--->  C - B == A,
+        where A, B, and C are all constants with non-simplifiable expressions,
+        usually SYMBOL_REFs.  */
+      if (GET_CODE (tem) == invcode
+         && CONSTANT_P (x)
+         && rtx_equal_p (c, XEXP (tem, 1)))
+       return NULL_RTX;
 
-      c = simplify_gen_binary (op0code == PLUS ? MINUS : PLUS,
-                              cmp_mode, op1, c);
-      return simplify_gen_relational (code, mode, cmp_mode, x, c);
+      return simplify_gen_relational (code, mode, cmp_mode, x, tem);
     }
 
   /* (ne:SI (zero_extract:SI FOO (const_int 1) BAR) (const_int 0))) is
index 50d720ecefd95d451bf487444b9fc9b82a0edbdf..0e3d1f662fc0acc1ab433b76079014d01e33397c 100644 (file)
@@ -1,3 +1,11 @@
+2011-12-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       Backport from mainline.
+       2011-10-28  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR rtl-optimization/49720
+       * g++.dg/torture/pr49720.C: New test.
+
 2011-12-14  Jason Merrill  <jason@redhat.com>
 
        PR c++/51248
diff --git a/gcc/testsuite/g++.dg/torture/pr49720.C b/gcc/testsuite/g++.dg/torture/pr49720.C
new file mode 100644 (file)
index 0000000..c5da7ba
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+extern char t_start[], t_end[], t_size[];
+bool foo (void)
+{
+  long size = reinterpret_cast<long>(t_size);
+  return (size == t_end - t_start);
+}