Message ID | 4EA8FA03.10805@codesourcery.com |
---|---|
State | New |
Headers | show |
> 2011-10-27 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. OK, thanks.
On Thu, Oct 27, 2011 at 3:39 PM, Eric Botcazou <ebotcazou@adacore.com> wrote: >> 2011-10-27 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. > > OK, thanks. > This also fails on 4.6 branch. Can we move it to 4.6 branch? Thanks.
> This also fails on 4.6 branch. Can we move it to 4.6 branch?
Sure.
Index: trunk/gcc/simplify-rtx.c =================================================================== --- trunk/gcc/simplify-rtx.c (revision 180421) +++ trunk/gcc/simplify-rtx.c (working copy) @@ -4352,10 +4352,20 @@ { 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); - c = simplify_gen_binary (op0code == PLUS ? MINUS : PLUS, - cmp_mode, op1, c); - return simplify_gen_relational (code, mode, cmp_mode, x, 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; + + 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: trunk/gcc/testsuite/g++.dg/torture/pr49720.C =================================================================== --- trunk/gcc/testsuite/g++.dg/torture/pr49720.C (revision 0) +++ trunk/gcc/testsuite/g++.dg/torture/pr49720.C (revision 0) @@ -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); +}