diff options
author | cltang <cltang@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-28 06:35:31 +0000 |
---|---|---|
committer | cltang <cltang@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-28 06:35:31 +0000 |
commit | 5998acf13d0d51b650bd7475ccf569e799cf6bad (patch) | |
tree | d232dac52ca30a6d4f292333f0379ec8ced66e41 /gcc/simplify-rtx.c | |
parent | 958913d4927208422278decb382fdb64eac4c6cd (diff) | |
download | gcc-5998acf13d0d51b650bd7475ccf569e799cf6bad.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180604 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r-- | gcc/simplify-rtx.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 13016169859..ab888a96db8 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 |