diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1994-08-17 22:03:37 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1994-08-17 22:03:37 +0000 |
commit | e6d1f05b10e022faf64359736a8956bc41165502 (patch) | |
tree | 1e0cbb9d0a02989de66b4123e0b07b2b868cf9d3 /gcc/cse.c | |
parent | 8a7375fbdc4564b9133bc089d37331e955b56280 (diff) | |
download | gcc-e6d1f05b10e022faf64359736a8956bc41165502.tar.gz |
(fold_rtx): When folding tablejump, allow LABEL_REF to be in arg0;
also allow other arg to be MINUS, not just be equivalent to it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@7939 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cse.c')
-rw-r--r-- | gcc/cse.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/gcc/cse.c b/gcc/cse.c index b929fb5c58f..4902b897976 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -5369,20 +5369,43 @@ fold_rtx (x, insn) ADDR_DIFF_VEC table. */ if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF) { - rtx y = lookup_as_function (folded_arg0, MINUS); + rtx y + = GET_CODE (folded_arg0) == MINUS ? folded_arg0 + : lookup_as_function (folded_arg0, MINUS); if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF && XEXP (XEXP (y, 1), 0) == XEXP (const_arg1, 0)) return XEXP (y, 0); /* Now try for a CONST of a MINUS like the above. */ - if ((y = lookup_as_function (folded_arg0, CONST)) != 0 + if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0 + : lookup_as_function (folded_arg0, CONST))) != 0 && GET_CODE (XEXP (y, 0)) == MINUS && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF && XEXP (XEXP (XEXP (y, 0),1), 0) == XEXP (const_arg1, 0)) return XEXP (XEXP (y, 0), 0); } + /* Likewise if the operands are in the other order. */ + if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF) + { + rtx y + = GET_CODE (folded_arg1) == MINUS ? folded_arg1 + : lookup_as_function (folded_arg1, MINUS); + + if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF + && XEXP (XEXP (y, 1), 0) == XEXP (const_arg0, 0)) + return XEXP (y, 0); + + /* Now try for a CONST of a MINUS like the above. */ + if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1 + : lookup_as_function (folded_arg1, CONST))) != 0 + && GET_CODE (XEXP (y, 0)) == MINUS + && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF + && XEXP (XEXP (XEXP (y, 0),1), 0) == XEXP (const_arg0, 0)) + return XEXP (XEXP (y, 0), 0); + } + /* If second operand is a register equivalent to a negative CONST_INT, see if we can find a register equivalent to the positive constant. Make a MINUS if so. Don't do this for |