diff options
author | Eric Botcazou <ebotcazou@multimania.com> | 2002-07-15 23:59:02 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-07-15 16:59:02 -0700 |
commit | 6d80a8545be028be5d341b98f4619ab09178c2ea (patch) | |
tree | 0bd5bce9e9a6dee5dbbedc0753d8616b8d49aa5b /gcc | |
parent | 0cb45d38bb94c48dea0493029073722cb5ab428c (diff) | |
download | gcc-6d80a8545be028be5d341b98f4619ab09178c2ea.zip gcc-6d80a8545be028be5d341b98f4619ab09178c2ea.tar.gz gcc-6d80a8545be028be5d341b98f4619ab09178c2ea.tar.bz2 |
re PR middle-end/7153 (bad operands for 'movsbl' error)
PR optimization/7153
* regmove.c (optimize_reg_copy_3): Don't optimize if the register
dies in more than one insn.
From-SVN: r55468
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/regmove.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20020715-1.c | 22 |
3 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1e8b3a..5c65980 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-07-15 Eric Botcazou <ebotcazou@multimania.com> + + PR optimization/7153 + * regmove.c (optimize_reg_copy_3): Don't optimize if the register + dies in more than one insn. + 2002-07-15 Jason Thorpe <thorpej@wasabisystems.com> * config/sparc/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Remove. diff --git a/gcc/regmove.c b/gcc/regmove.c index 55a31dc..1a1fffe 100644 --- a/gcc/regmove.c +++ b/gcc/regmove.c @@ -664,6 +664,7 @@ optimize_reg_copy_3 (insn, dest, src) if (src_no < FIRST_PSEUDO_REGISTER || dst_no < FIRST_PSEUDO_REGISTER || ! find_reg_note (insn, REG_DEAD, src_reg) + || REG_N_DEATHS (src_no) != 1 || REG_N_SETS (src_no) != 1) return; for (p = PREV_INSN (insn); p && ! reg_set_p (src_reg, p); p = PREV_INSN (p)) diff --git a/gcc/testsuite/gcc.c-torture/compile/20020715-1.c b/gcc/testsuite/gcc.c-torture/compile/20020715-1.c new file mode 100644 index 0000000..5294133 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20020715-1.c @@ -0,0 +1,22 @@ +/* PR optimization/7153 */ +/* Verify that GCC doesn't promote a register when its + lifetime is not limited to one basic block. */ + +void f(char); +void g(void); + +void scale(void) +{ + int width; + char bytes; + char *src; + + if (width) + { + bytes = *src; + g(); + width *= bytes; + } + + f(bytes); +} |