aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2003-05-09 17:16:54 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2003-05-09 17:16:54 +0000
commitf8a30250165a6dc9ac3e323cdf0859f13b4b69d8 (patch)
treea45f9fe5c6841a2561bee0d8369feff64fbea99c /gcc
parente912eadf52af10e7ffff54c1c6ec867f2f0ba3bc (diff)
downloadgcc-f8a30250165a6dc9ac3e323cdf0859f13b4b69d8.zip
gcc-f8a30250165a6dc9ac3e323cdf0859f13b4b69d8.tar.gz
gcc-f8a30250165a6dc9ac3e323cdf0859f13b4b69d8.tar.bz2
reload1.c (reload_cse_move2add): Don't turn an implicit truncation into a self-set in the narrow mode.
* reload1.c (reload_cse_move2add): Don't turn an implicit truncation into a self-set in the narrow mode. From-SVN: r66638
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/reload1.c21
2 files changed, 22 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01bc7ff..d7ac8d8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-05-09 Alexandre Oliva <aoliva@redhat.com>
+
+ * reload1.c (reload_cse_move2add): Don't turn an implicit
+ truncation into a self-set in the narrow mode.
+
2003-05-09 Richard Earnshaw <rearnsha@arm.com>
* arm.md (clzsi2): The CLZ instruction is predicable.
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 792dd46..adae5c8 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -9166,7 +9166,14 @@ reload_cse_move2add (first)
value flag. jump2 already knows how to get rid of
no-op moves. */
if (new_src == const0_rtx)
- validate_change (insn, &SET_SRC (pat), reg, 0);
+ {
+ /* If the constants are different, this is a
+ truncation, that, if turned into (set (reg)
+ (reg)), would be discarded. Maybe we should
+ try a truncMN pattern? */
+ if (INTVAL (src) == reg_offset [regno])
+ validate_change (insn, &SET_SRC (pat), reg, 0);
+ }
else if (rtx_cost (new_src, PLUS) < rtx_cost (src, SET)
&& have_add2_insn (reg, new_src))
{
@@ -9252,9 +9259,15 @@ reload_cse_move2add (first)
int success = 0;
if (new_src == const0_rtx)
- /* See above why we create (set (reg) (reg)) here. */
- success
- = validate_change (next, &SET_SRC (set), reg, 0);
+ {
+ if (INTVAL (src) == reg_offset [regno])
+ /* See above why we create (set (reg)
+ (reg)) here. */
+ success
+ = validate_change (next, &SET_SRC (set), reg, 0);
+ else
+ success = 0;
+ }
else if ((rtx_cost (new_src, PLUS)
< COSTS_N_INSNS (1) + rtx_cost (src3, SET))
&& have_add2_insn (reg, new_src))