]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/65647 (GCC won't stop when compile for armv6-m)
authorYvan Roux <yvan.roux@linaro.org>
Sun, 5 Apr 2015 19:06:43 +0000 (19:06 +0000)
committerYvan Roux <yroux@gcc.gnu.org>
Sun, 5 Apr 2015 19:06:43 +0000 (19:06 +0000)
gcc/
2015-04-05  Yvan Roux  <yvan.roux@linaro.org>

Backport from trunk r221867
2015-04-04  Vladimir Makarov  <vmakarov@redhat.com>

PR target/65647
* lra.c (lra): Stop updating lra_constraint_new_regno_start after switching
off inheritance.

gcc/testsuite/
2015-04-05  Yvan Roux  <yvan.roux@linaro.org>

Backport from trunk r221867
2015-04-04  Vladimir Makarov <vmakarov@redhat.com>

PR target/65647
* gcc.target/arm/pr65647.c: New.
* gcc.target/arm/pr65647-2.c: New.

From-SVN: r221873

gcc/ChangeLog
gcc/lra.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr65647-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/pr65647.c [new file with mode: 0644]

index 320d23278499b5724e8147e59cfeb4a8eb6ebbfc..676fcd8ba1c14d69fa84b619ca5037f594a91ef8 100644 (file)
@@ -1,3 +1,12 @@
+2015-04-05  Yvan Roux  <yvan.roux@linaro.org>
+
+       Backport from trunk r221867
+       2015-04-04  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/65647
+       * lra.c (lra): Stop updating lra_constraint_new_regno_start after switching
+       off inheritance.
+
 2015-04-02  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.c (pa_output_move_double): Directly handle register
index 69b08dc244ab2e2f51041a8a40692c5b5fc459bd..98f0444356ea13c1b28f288ee13291a3b3784fbc 100644 (file)
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -2417,7 +2417,11 @@ lra (FILE *f)
       /* Assignment of stack slots changes elimination offsets for
         some eliminations.  So update the offsets here.  */
       lra_eliminate (false, false);
-      lra_constraint_new_regno_start = max_reg_num ();
+      /* After switching off inheritance passe, don't forget reload pseudos
+         after spilling sub-pass to avoid LRA cycling in some complicated
+        cases.  */
+      if (lra_inheritance_iter <= LRA_MAX_INHERITANCE_PASSES)
+        lra_constraint_new_regno_start = max_reg_num ();
       lra_constraint_new_insn_uid_start = get_max_uid ();
       lra_assignment_iter_after_spill = 0;
     }
index 1aa94998dfef1ca561e8eeb29e22ffd8450ce6f3..2f98c6649d5855dc1eda9433dbebf6adb07ab88c 100644 (file)
@@ -1,3 +1,12 @@
+2015-04-05  Yvan Roux  <yvan.roux@linaro.org>
+
+       Backport from trunk r221867
+       2015-04-04  Vladimir Makarov <vmakarov@redhat.com>
+
+       PR target/65647
+       * gcc.target/arm/pr65647.c: New.
+       * gcc.target/arm/pr65647-2.c: New.
+
 2015-03-31  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
        * gcc.target/s390/hotpatch-25.c: New test.
diff --git a/gcc/testsuite/gcc.target/arm/pr65647-2.c b/gcc/testsuite/gcc.target/arm/pr65647-2.c
new file mode 100644 (file)
index 0000000..f2985f8
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -marm -march=armv6 -std=c99" } */
+
+typedef struct {
+  int i;
+} x264_union32_t;
+typedef struct {
+  int level_idx;
+} trellis_node_t;
+int a, c, d, f, h, i = (int)&c;
+trellis_node_t b[1][1];
+short *e = 0;
+short g;
+void fn1() {
+  int k[64 * 8 * 2];
+  trellis_node_t *l = b[0];
+  for (; i >= d; i--) {
+    if (e[i]) {
+      for (int j = 1; j < 8; j++) {
+        ((x264_union32_t *)&k[a])->i = l[j].level_idx;
+        l[j].level_idx = a;
+        a++;
+      }
+      continue;
+    }
+    for (int j;; j++)
+      ;
+  }
+  int m[6] __attribute__((aligned(16)));
+  for (; h; h++, f++)
+    g = m[h];
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr65647.c b/gcc/testsuite/gcc.target/arm/pr65647.c
new file mode 100644 (file)
index 0000000..686eb58
--- /dev/null
@@ -0,0 +1,58 @@
+/* { dg-do compile } */
+/* { dg-options "-march=armv6-m -mthumb -O3 -w" } */
+
+a, b, c, e, g = &e, h, i = 7, l = 1, m, n, o, q = &m, r, s = &r, u, w = 9, x,
+  y = 6, z, t6 = 7, t8, t9 = 1, t11 = 5, t12 = &t8, t13 = 3, t15,
+  t16 = &t15;
+struct {
+  long long f3;
+    char f4
+} p = {3}
+
+    ,
+  t = {4};
+
+struct S1 {
+  long long f0;
+  short f1;
+    long long f2
+} d;
+long long f = 4073709551613, t7 = 8, t14 = 4073709551610;
+j[];
+k = j;
+v = &d;
+*t10 = j;
+struct S1 fn1();
+struct S1 fn2() {
+  signed char t1;
+  struct S1 t2;
+  long t3 = x;
+  short t4 = h;
+  short *t5 = &l;
+  fn1(t2, w, 1, o);
+  if (u) {
+    l = q;
+    t1 = a < b ?: b;
+    z = c >= 2 || t1 << c;
+  }
+  *t5 = t4 &= t3;
+  fn3(y);
+}
+
+fn4() {
+  t6 = t.f3;
+  fn5(k, t7);
+}
+
+struct S1 fn1() {
+  f = 0;
+  for (; i;)
+    ;
+  t11 = 0;
+  t13 = *t10 = t14 || n;
+  t9 = t12;
+  for (; p.f4;)
+    s = t16 <= fn6();
+  if (g)
+    v = 0;
+}