aboutsummaryrefslogtreecommitdiff
path: root/gcc/expmed.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-05-26 11:55:34 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-05-26 11:55:34 -0400
commit7831ef177bd85529c59eac7b91681a95266bba37 (patch)
tree9c419b4b9c945d3e8a03412cf64775b030ad876d /gcc/expmed.c
parent7beec59e8ad123102ffbadd07c75fa415cfaa326 (diff)
downloadgcc-7831ef177bd85529c59eac7b91681a95266bba37.zip
gcc-7831ef177bd85529c59eac7b91681a95266bba37.tar.gz
gcc-7831ef177bd85529c59eac7b91681a95266bba37.tar.bz2
(expand_divmod): Correctly set CAN_CLOBBER_OP0 when we've converted OP0
to COMPUTE_MODE. From-SVN: r7349
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r--gcc/expmed.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 85cf0de..09cbbaf 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -2439,13 +2439,16 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
modifying it. */
can_clobber_op0 = (GET_CODE (op0) == REG && op0 == target);
- /* Now convert to the best mode to use. Show we made a copy of OP0
+ /* Now convert to the best mode to use. Normally show we made a copy of OP0
and hence we can clobber it (we cannot use a SUBREG to widen
- something. */
+ something), but check that the conversion wasn't a no-op due to
+ promotion. */
if (compute_mode != mode)
{
- adjusted_op0 = op0 = convert_modes (compute_mode, mode, op0, unsignedp);
- can_clobber_op0 = 1;
+ adjusted_op0 = convert_modes (compute_mode, mode, op0, unsignedp);
+ can_clobber_op0 = ! (GET_CODE (op0) == SUBREG
+ && SUBREG_REG (op0) == adjusted_op0);
+ op0 = adjusted_op0;
op1 = convert_modes (compute_mode, mode, op1, unsignedp);
}