aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-10-28 20:15:51 +0000
committerRichard Stallman <rms@gnu.org>1992-10-28 20:15:51 +0000
commit5f96750d14e28200c13fb15d88edc77ecc8cbafc (patch)
tree73c88455d61388bd6fb9a840e9bc39fbdaafcccf /gcc/combine.c
parentdc4e989cc8d778764e96577061efc48770bc17fd (diff)
downloadgcc-5f96750d14e28200c13fb15d88edc77ecc8cbafc.zip
gcc-5f96750d14e28200c13fb15d88edc77ecc8cbafc.tar.gz
gcc-5f96750d14e28200c13fb15d88edc77ecc8cbafc.tar.bz2
(can_combine_p): Don't don't substitute an expression
containing a register that will be clobbered in I3. From-SVN: r2631
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index de46091..89383a4 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -776,11 +776,15 @@ can_combine_p (insn, i3, pred, succ, pdest, psrc)
else if (GET_CODE (dest) != CC0)
return 0;
- /* Don't substitute for a register intended as a clobberable operand. */
+ /* Don't substitute for a register intended as a clobberable operand.
+ Similarly, don't substitute an expression containing a register that
+ will be clobbered in I3. */
if (GET_CODE (PATTERN (i3)) == PARALLEL)
for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER
- && rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest))
+ && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0),
+ src)
+ || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest)))
return 0;
/* If INSN contains anything volatile, or is an `asm' (whether volatile