aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1993-04-03 17:34:45 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1993-04-03 17:34:45 -0500
commit20fdd649e587eb923e447773a73c6e3a71d16a64 (patch)
treeba73190a046df8b0a6e8b6ac48a9871970c520c5
parentbe7ae2a48490fa9809c604c6e33e645fc5076f5a (diff)
downloadgcc-20fdd649e587eb923e447773a73c6e3a71d16a64.zip
gcc-20fdd649e587eb923e447773a73c6e3a71d16a64.tar.gz
gcc-20fdd649e587eb923e447773a73c6e3a71d16a64.tar.bz2
(simplify_comparison, case PLUS): Generalize simplification of (eq (plus A B) C).
(simplify_comparison, case PLUS): Generalize simplification of (eq (plus A B) C). (simplify_comparison, case MINUS): Add corresponding cases. From-SVN: r3992
-rw-r--r--gcc/combine.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 92fa365..6993356 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -8315,12 +8315,12 @@ simplify_comparison (code, pop0, pop1)
break;
case PLUS:
- /* (eq (plus X C1) C2) -> (eq X (minus C2 C1)). We can only do
+ /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do
this for equality comparisons due to pathological cases involving
overflows. */
- if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
- && (tem = simplify_binary_operation (MINUS, mode, op1,
- XEXP (op0, 1))) != 0)
+ if (equality_comparison_p
+ && 0 != (tem = simplify_binary_operation (MINUS, mode,
+ op1, XEXP (op0, 1))))
{
op0 = XEXP (op0, 0);
op1 = tem;
@@ -8338,6 +8338,28 @@ simplify_comparison (code, pop0, pop1)
break;
case MINUS:
+ /* (eq (minus A B) C) -> (eq A (plus B C)) or
+ (eq B (minus A C)), whichever simplifies. We can only do
+ this for equality comparisons due to pathological cases involving
+ overflows. */
+ if (equality_comparison_p
+ && 0 != (tem = simplify_binary_operation (PLUS, mode,
+ XEXP (op0, 1), op1)))
+ {
+ op0 = XEXP (op0, 0);
+ op1 = tem;
+ continue;
+ }
+
+ if (equality_comparison_p
+ && 0 != (tem = simplify_binary_operation (MINUS, mode,
+ XEXP (op0, 0), op1)))
+ {
+ op0 = XEXP (op0, 1);
+ op1 = tem;
+ continue;
+ }
+
/* The sign bit of (minus (ashiftrt X C) X), where C is the number
of bits in X minus 1, is one iff X > 0. */
if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT