aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2003-06-03 17:10:48 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2003-06-03 17:10:48 +0000
commit8d6b2775eca066ed3cd5e07b35e4c1693f2a33da (patch)
treecd3544e7b5842efabe947bbaaa036b6c1b9dfa8f /gcc/combine.c
parentbf46042bdbc7ef0b75d56e856c44c2391e15d344 (diff)
downloadgcc-8d6b2775eca066ed3cd5e07b35e4c1693f2a33da.zip
gcc-8d6b2775eca066ed3cd5e07b35e4c1693f2a33da.tar.gz
gcc-8d6b2775eca066ed3cd5e07b35e4c1693f2a33da.tar.bz2
combine.c (simplify_set): Don't move a subreg in SET_SRC to SET_DEST if...
* combine.c (simplify_set): Don't move a subreg in SET_SRC to SET_DEST if WORD_REGISTER_OPERATIONS is not defined. From-SVN: r67388
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 79f0226..c470655 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -5238,17 +5238,18 @@ simplify_set (x)
SUBST (SET_SRC (x), src);
}
+#ifdef WORD_REGISTER_OPERATIONS
/* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
and X being a REG or (subreg (reg)), we may be able to convert this to
(set (subreg:m2 x) (op)).
- We can always do this if M1 is narrower than M2 because that means that
- we only care about the low bits of the result.
+ On a machine where WORD_REGISTER_OPERATIONS is defined, this
+ transformation is safe as long as M1 and M2 have the same number
+ of words.
- However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
- perform a narrower operation than requested since the high-order bits will
- be undefined. On machine where it is defined, this transformation is safe
- as long as M1 and M2 have the same number of words. */
+ However, on a machine without WORD_REGISTER_OPERATIONS defined,
+ we cannot apply this transformation because it would create a
+ paradoxical subreg in SET_DEST. */
if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
&& GET_RTX_CLASS (GET_CODE (SUBREG_REG (src))) != 'o'
@@ -5256,10 +5257,6 @@ simplify_set (x)
/ UNITS_PER_WORD)
== ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
+ (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
-#ifndef WORD_REGISTER_OPERATIONS
- && (GET_MODE_SIZE (GET_MODE (src))
- < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
-#endif
#ifdef CANNOT_CHANGE_MODE_CLASS
&& ! (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER
&& REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
@@ -5277,6 +5274,7 @@ simplify_set (x)
src = SET_SRC (x), dest = SET_DEST (x);
}
+#endif
#ifdef HAVE_cc0
/* If we have (set (cc0) (subreg ...)), we try to remove the subreg