summaryrefslogtreecommitdiffstats
path: root/patches/gcc-4.5.2/0003-pr39429.diff
blob: bd194f15415d618ff9eca165879b37616f65d072 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
From: Michael Olbrich <m.olbrich@pengutronix.de>

This is http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39429.

I've removed Michael's original patch and replaced it by the one from
the gcc bugzilla.

Signed-off-by: Robert Schwebel <r.schwebel@pengutronix.de>
---
 gcc/config/arm/arm.md |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

Index: gcc-4.5.1/gcc/config/arm/arm.md
===================================================================
--- gcc-4.5.1.orig/gcc/config/arm/arm.md
+++ gcc-4.5.1/gcc/config/arm/arm.md
@@ -10390,6 +10390,21 @@
 	else
 	  {
 	    /* Offset is out of range for a single add, so use two ldr.  */
+
+	    /* Swap the ldrs if the first ldr would clobber the shared base_reg.  */
+	    if (REGNO (ldm[1]) == REGNO (base_reg))
+	      {
+		rtx tmp_reg;
+		HOST_WIDE_INT tmp_val;
+
+		tmp_reg = ldm[1];
+		ldm[1] = ldm[2];
+		ldm[2] = tmp_reg;
+		tmp_val = val1;
+		val1 = val2;
+		val2 = tmp_val;
+	      }
+
 	    ops[0] = ldm[1];
 	    ops[1] = base_reg;
 	    ops[2] = GEN_INT (val1);