From 0b2951eb8034c4e8405131be6cbaab3abedd405c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 15 Dec 2011 23:50:32 +0000 Subject: [PATCH] Detect infinite recursion condition gcc/ 2011-12-15 H.J. Lu Backport from mainline. 2011-10-28 Chung-Lin Tang 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 Backport from mainline. 2011-10-28 Chung-Lin Tang PR rtl-optimization/49720 * g++.dg/torture/pr49720.C: New test. From-SVN: r182394 --- gcc/ChangeLog | 10 ++++++++++ gcc/simplify-rtx.c | 16 +++++++++++++--- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/torture/pr49720.C | 8 ++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr49720.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eb00324cc191..ea113da104ee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2011-12-15 H.J. Lu + + Backport from mainline. + 2011-10-28 Chung-Lin Tang + + 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 Backport from mainline. diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index eb747ad3c86d..ed4019622017 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 50d720ecefd9..0e3d1f662fc0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-12-15 H.J. Lu + + Backport from mainline. + 2011-10-28 Chung-Lin Tang + + PR rtl-optimization/49720 + * g++.dg/torture/pr49720.C: New test. + 2011-12-14 Jason Merrill 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 index 000000000000..c5da7ba670f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49720.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +extern char t_start[], t_end[], t_size[]; +bool foo (void) +{ + long size = reinterpret_cast(t_size); + return (size == t_end - t_start); +} -- 2.47.2