]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/59166 (ICE in simplify_subreg, at simplify-rtx.c:5901 on valid...
authorJakub Jelinek <jakub@redhat.com>
Tue, 26 Nov 2013 20:54:37 +0000 (21:54 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 26 Nov 2013 20:54:37 +0000 (21:54 +0100)
PR rtl-optimization/59166
* ira.c (find_moveable_pseudos): Use DF_REF_REAL_LOC instead of
DF_REF_LOC in validate_change call.
(split_live_ranges_for_shrink_wrap): Likewise.

* gcc.dg/torture/pr59166.c: New test.

From-SVN: r205413

gcc/ChangeLog
gcc/ira.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr59166.c [new file with mode: 0644]

index 0d97d2ec45a514e6f7ef93812ff804ff03b17ec7..c2d977efdf259beb6925cc213359da72cfe14fcd 100644 (file)
@@ -1,5 +1,10 @@
 2013-11-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/59166
+       * ira.c (find_moveable_pseudos): Use DF_REF_REAL_LOC instead of
+       DF_REF_LOC in validate_change call.
+       (split_live_ranges_for_shrink_wrap): Likewise.
+
        PR middle-end/59150
        * omp-low.c (lower_rec_input_clause): For reduction with placeholder
        of references to constant size types in simd loops, defer emitting
index 2902ebe0a8bed29171944593891f146ad938d639..cb2d94725b5d200d8ad19b9c847935b8f8916d62 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -4812,7 +4812,7 @@ find_moveable_pseudos (void)
        {
          rtx def_reg = DF_REF_REG (def);
          rtx newreg = ira_create_new_reg (def_reg);
-         if (validate_change (def_insn, DF_REF_LOC (def), newreg, 0))
+         if (validate_change (def_insn, DF_REF_REAL_LOC (def), newreg, 0))
            {
              unsigned nregno = REGNO (newreg);
              emit_insn_before (gen_move_insn (def_reg, newreg), use_insn);
@@ -5034,7 +5034,7 @@ split_live_ranges_for_shrink_wrap (void)
 
       rtx newreg = NULL_RTX;
       df_ref use, next;
-      for (use = DF_REG_USE_CHAIN (REGNO(dest)); use; use = next)
+      for (use = DF_REG_USE_CHAIN (REGNO (dest)); use; use = next)
        {
          rtx uin = DF_REF_INSN (use);
          next = DF_REF_NEXT_REG (use);
@@ -5045,7 +5045,7 @@ split_live_ranges_for_shrink_wrap (void)
            {
              if (!newreg)
                newreg = ira_create_new_reg (dest);
-             validate_change (uin, DF_REF_LOC (use), newreg, true);
+             validate_change (uin, DF_REF_REAL_LOC (use), newreg, true);
            }
        }
 
index a00cd97d63c6094c045c0b7638b1b2b005d9540c..fc50a051f2636eb8a9c8dec99a68edc0d58ffac7 100644 (file)
@@ -1,5 +1,8 @@
 2013-11-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/59166
+       * gcc.dg/torture/pr59166.c: New test.
+
        PR c++/58874
        * g++.dg/gomp/pr58874.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr59166.c b/gcc/testsuite/gcc.dg/torture/pr59166.c
new file mode 100644 (file)
index 0000000..d29ec33
--- /dev/null
@@ -0,0 +1,37 @@
+/* PR rtl-optimization/59166 */
+/* { dg-additional-options "-fcompare-debug" } */
+
+int a, b, c, f, g;
+
+void
+foo ()
+{
+  for (; b; b++)
+    for (; f; f = g)
+      for (; a;)
+       ;
+}
+
+static int
+bar (int p)
+{
+  short d;
+  if (c)
+    {
+      for (; f; f = g);
+      foo ();
+      d = p;
+      char e = d;
+      if (p)
+       return 1;
+    }
+  return p;
+}
+
+int
+main ()
+{
+  bar (0);
+  bar (g);
+  return 0;
+}