diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-05-26 11:55:34 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-05-26 11:55:34 -0400 |
commit | 7831ef177bd85529c59eac7b91681a95266bba37 (patch) | |
tree | 9c419b4b9c945d3e8a03412cf64775b030ad876d /gcc | |
parent | 7beec59e8ad123102ffbadd07c75fa415cfaa326 (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/expmed.c | 11 |
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); } |