From 6d80a8545be028be5d341b98f4619ab09178c2ea Mon Sep 17 00:00:00 2001 From: Eric Botcazou <ebotcazou@multimania.com> Date: Mon, 15 Jul 2002 23:59:02 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 +++++ gcc/regmove.c | 1 + .../gcc.c-torture/compile/20020715-1.c | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20020715-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1e8b3ac929c..5c659805be5f 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 55a31dc612ea..1a1fffe09752 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 000000000000..5294133f37b0 --- /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); +} -- GitLab