Blame SOURCES/gcc48-pr70549.patch

25c7f1
2017-03-08  Bernd Schmidt  <bschmidt@redhat.com>
25c7f1
25c7f1
	PR target/70549
25c7f1
	* config/aarch64/aarch64.c (aarch64_secondary_reload): Reload
25c7f1
	CORE_REGS rclass constants in [SD]Fmode through FP_REGS.
25c7f1
25c7f1
	* g++.dg/opt/pr70549.C: New test.
25c7f1
25c7f1
--- gcc/config/aarch64/aarch64.c.jj	2017-03-08 15:50:55.000000000 +0100
25c7f1
+++ gcc/config/aarch64/aarch64.c	2017-03-08 16:01:15.426080172 +0100
25c7f1
@@ -3846,8 +3846,13 @@ aarch64_secondary_reload (bool in_p ATTR
25c7f1
       && GET_MODE_SIZE (mode) == 16 && MEM_P (x))
25c7f1
     return FP_REGS;
25c7f1
 
25c7f1
+  if (rclass == CORE_REGS
25c7f1
+      && (mode == SFmode || mode == DFmode)
25c7f1
+      && CONSTANT_P (x))
25c7f1
+    return FP_REGS;
25c7f1
+
25c7f1
   if (rclass == FP_REGS && (mode == TImode || mode == TFmode) && CONSTANT_P(x))
25c7f1
-      return CORE_REGS;
25c7f1
+    return CORE_REGS;
25c7f1
 
25c7f1
   return NO_REGS;
25c7f1
 }
25c7f1
--- gcc/testsuite/g++.dg/opt/pr70549.C.jj	2017-03-08 16:02:45.104918249 +0100
25c7f1
+++ gcc/testsuite/g++.dg/opt/pr70549.C	2017-03-08 16:02:14.000000000 +0100
25c7f1
@@ -0,0 +1,33 @@
25c7f1
+// PR target/70549
25c7f1
+// { dg-do compile }
25c7f1
+// { dg-options "-O2" }
25c7f1
+// { dg-additional-options "-fPIC" { target fpic } }
25c7f1
+
25c7f1
+struct A { float x; float y; };
25c7f1
+A a, b, c;
25c7f1
+int d, e;
25c7f1
+A bar ();
25c7f1
+void foo (A, A);
25c7f1
+inline A operator/ (A, A p2) { if (p2.x) return a; }
25c7f1
+struct B { A dval; };
25c7f1
+int baz (A, B, A, int);
25c7f1
+
25c7f1
+void
25c7f1
+test ()
25c7f1
+{
25c7f1
+  B q;
25c7f1
+  A f, g, h, k;
25c7f1
+  h.x = 1.0;
25c7f1
+  f = h;
25c7f1
+  struct A i, j = f;
25c7f1
+  do {
25c7f1
+    i = bar ();
25c7f1
+    g = i / j;
25c7f1
+    foo (g, c);
25c7f1
+    int l = baz (k, q, b, e);
25c7f1
+    if (l)
25c7f1
+      goto cleanup;
25c7f1
+    j = i;
25c7f1
+  } while (d);
25c7f1
+cleanup:;
25c7f1
+}