aboutsummaryrefslogtreecommitdiff
path: root/gcc/simplify-rtx.c
diff options
context:
space:
mode:
authorChung-Lin Tang <cltang@codesourcery.com>2011-10-28 06:35:31 +0000
committerChung-Lin Tang <cltang@gcc.gnu.org>2011-10-28 06:35:31 +0000
commitd303c992f61f5f94aaa314e914b1e27280940de2 (patch)
treed232dac52ca30a6d4f292333f0379ec8ced66e41 /gcc/simplify-rtx.c
parent2df19a351fc63643a15629cd3368d16ab20844b4 (diff)
downloadgcc-d303c992f61f5f94aaa314e914b1e27280940de2.zip
gcc-d303c992f61f5f94aaa314e914b1e27280940de2.tar.gz
gcc-d303c992f61f5f94aaa314e914b1e27280940de2.tar.bz2
re PR rtl-optimization/49720 (Infinite recursion compiling gold binary_test.cc testcase)
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. testsuite/ * g++.dg/torture/pr49720.C: New test. From-SVN: r180604
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r--gcc/simplify-rtx.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 1301616..ab888a9 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -4352,10 +4352,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