From 3a1944a6027742b55618cf0105e190f2023786ff Mon Sep 17 00:00:00 2001
From: Richard Earnshaw <rearnsha@arm.com>
Date: Sun, 16 Feb 2003 19:40:11 +0000
Subject: [PATCH] arm.c (arm_reload_in_hi): Ensure that the scratch register
 does not overlap the final result register.

* arm.c (arm_reload_in_hi): Ensure that the scratch register does
not overlap the final result register.

From-SVN: r62981
---
 gcc/ChangeLog        | 5 +++++
 gcc/config/arm/arm.c | 9 ++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a15042015653..79562ba52acb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-02-16 Richard Earnshaw  <rearnsha@arm.com>
+
+	* arm.c (arm_reload_in_hi): Ensure that the scratch register does
+	not overlap the final result register.
+
 2003-02-16 Arend Bayer <arend.bayer@web.de>
 	   Richard Henderson  <rth@redhat.com>
 
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 2d4f4d891235..0847c97ae9d5 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -5845,7 +5845,14 @@ arm_reload_in_hi (operands)
 	}
     }
 
-  scratch = gen_rtx_REG (SImode, REGNO (operands[2]));
+  /* Operands[2] may overlap operands[0] (though it won't overlap
+     operands[1]), that's why we asked for a DImode reg -- so we can
+     use the bit that does not overlap.  */
+  if (REGNO (operands[2]) == REGNO (operands[0]))
+    scratch = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
+  else
+    scratch = gen_rtx_REG (SImode, REGNO (operands[2]));
+
   emit_insn (gen_zero_extendqisi2 (scratch,
 				   gen_rtx_MEM (QImode,
 						plus_constant (base,
-- 
GitLab