diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f1e8b3ac929c862d8f7252f499f129b34089a347..5c659805be5fc367edba1c74057af8f476148938 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 55a31dc612eafaff62f7a01b8262511f8980e6c3..1a1fffe097525299d16d5bd69706f35fd6219c00 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 0000000000000000000000000000000000000000..5294133f37b088cdc8fb8ba3d51784ffc0a77d2d
--- /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);
+}