From d9f204241be3449693b5ff3a3779ed3703f2f85e Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Mon, 14 Aug 2000 17:54:23 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/cse.c | 22 +++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 524ee83e947..c0cab5b93a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Mon Aug 14 18:51:44 2000 J"orn Rennecke + + * 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. + 2000-08-13 Ralf Gütlein * h8300.md: Remove obsolete peepholes. diff --git a/gcc/cse.c b/gcc/cse.c index a65cecabdfa..cd220b78202 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; } -- 2.30.2