summaryrefslogtreecommitdiff
path: root/core/gcc/gcc-pr49720.patch
diff options
context:
space:
mode:
Diffstat (limited to 'core/gcc/gcc-pr49720.patch')
-rw-r--r--core/gcc/gcc-pr49720.patch26
1 files changed, 26 insertions, 0 deletions
diff --git a/core/gcc/gcc-pr49720.patch b/core/gcc/gcc-pr49720.patch
new file mode 100644
index 000000000..8f50c4120
--- /dev/null
+++ b/core/gcc/gcc-pr49720.patch
@@ -0,0 +1,26 @@
+--- trunk/gcc/simplify-rtx.c 2011/10/28 05:55:10 180603
++++ trunk/gcc/simplify-rtx.c 2011/10/28 06:35:31 180604
+@@ -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