summaryrefslogtreecommitdiff
path: root/gcc/regrename.c
diff options
context:
space:
mode:
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>2005-01-11 21:56:01 +0000
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>2005-01-11 21:56:01 +0000
commit8ade52a4795c658c4ddc098c81a6d41c15e9a06d (patch)
treeab79c64ba9b51e95a4cb0265e13a68b36082f7cf /gcc/regrename.c
parentad2c46cf58ec0f1ec0328005b016ba8159c34530 (diff)
downloadgcc-8ade52a4795c658c4ddc098c81a6d41c15e9a06d.tar.gz
* regrename.c (kill_value): Handle subreg's that won't simplify.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@93200 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/regrename.c')
-rw-r--r--gcc/regrename.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 35f17a4d1d2..4b3860c647c 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -1104,14 +1104,15 @@ kill_value_regno (unsigned int regno, unsigned int nregs,
static void
kill_value (rtx x, struct value_data *vd)
{
- /* SUBREGS are supposed to have been eliminated by now. But some
- ports, e.g. i386 sse, use them to smuggle vector type information
- through to instruction selection. Each such SUBREG should simplify,
- so if we get a NULL we've done something wrong elsewhere. */
+ rtx orig_rtx = x;
if (GET_CODE (x) == SUBREG)
- x = simplify_subreg (GET_MODE (x), SUBREG_REG (x),
- GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
+ {
+ x = simplify_subreg (GET_MODE (x), SUBREG_REG (x),
+ GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
+ if (x == NULL_RTX)
+ x = SUBREG_REG (orig_rtx);
+ }
if (REG_P (x))
{
unsigned int regno = REGNO (x);