PR rtl-optimization/59166
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Nov 2013 20:54:37 +0000 (20:54 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Nov 2013 20:54:37 +0000 (20:54 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205413 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 0d97d2e..c2d977e 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 2902ebe..cb2d947 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 a00cd97..fc50a05 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;
+}