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