aboutsummaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>2000-08-14 17:54:23 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2000-08-14 18:54:23 +0100
commitd9f204241be3449693b5ff3a3779ed3703f2f85e (patch)
tree3c2d1a8e00a88cc50366722ec7f395faf90ed355 /gcc/cse.c
parentc8fa6556c1071cac32c06c4f8085717cf2937675 (diff)
downloadgcc-d9f204241be3449693b5ff3a3779ed3703f2f85e.zip
gcc-d9f204241be3449693b5ff3a3779ed3703f2f85e.tar.gz
gcc-d9f204241be3449693b5ff3a3779ed3703f2f85e.tar.bz2
cse.c (insert_regs): Also in REG case...
* cse.c (insert_regs): Also in REG case: When finding an invalid value, and we make a new quantity, make sure that it won't be mistaken by for a valid one by mention_regs. From-SVN: r35679
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index a65ceca..cd220b7 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -1244,6 +1244,19 @@ insert_regs (x, classp, modified)
return 1;
}
+ /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger
+ than REG_IN_TABLE to find out if there was only a single preceding
+ invalidation - for the SUBREG - or another one, which would be
+ for the full register. However, if we find here that REG_TICK
+ indicates that the register is invalid, it means that it has
+ been invalidated in a separate operation. The SUBREG might be used
+ now (then this is a recursive call), or we might use the full REG
+ now and a SUBREG of it later. So bump up REG_TICK so that
+ mention_regs will do the right thing. */
+ if (! modified
+ && REG_IN_TABLE (regno) >= 0
+ && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
+ REG_TICK (regno)++;
make_new_qty (regno, GET_MODE (x));
return 1;
}
@@ -1263,15 +1276,6 @@ insert_regs (x, classp, modified)
unsigned int regno = REGNO (SUBREG_REG (x));
insert_regs (SUBREG_REG (x), NULL_PTR, 0);
- /* Mention_regs checks if REG_TICK is exactly one larger than
- REG_IN_TABLE to find out if there was only a single preceding
- invalidation - for the SUBREG - or another one, which would be
- for the full register. Since we don't invalidate the SUBREG
- here first, we might have to bump up REG_TICK so that mention_regs
- will do the right thing. */
- if (REG_IN_TABLE (regno) >= 0
- && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
- REG_TICK (regno)++;
mention_regs (x);
return 1;
}