]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/56246 (ICE in assign_by_spills, at lra-assigns.c:1262)
authorVladimir Makarov <vmakarov@redhat.com>
Fri, 8 Feb 2013 21:59:11 +0000 (21:59 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Fri, 8 Feb 2013 21:59:11 +0000 (21:59 +0000)
2013-02-08  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/56246
* lra-constraints.c (simplify_operand_subreg): Try tor reuse
reload pseudo.
* lra.c (lra): Clear lra_optional_reload_pseudos only when all
constraints are satisfied.

2013-02-08  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/56246
* gcc.target/i386/pr56246.c: New test.

From-SVN: r195902

gcc/ChangeLog
gcc/lra-constraints.c
gcc/lra.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr56246.c [new file with mode: 0644]

index 2693b7e843e6c5759fac1d06d4fad0b065379ce5..1b24e78915448ac3b61dab8377b119547e04d4b3 100644 (file)
@@ -1,3 +1,11 @@
+2013-02-08  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/56246
+       * lra-constraints.c (simplify_operand_subreg): Try tor reuse
+       reload pseudo.
+       * lra.c (lra): Clear lra_optional_reload_pseudos only when all
+       constraints are satisfied.
+
 2013-02-08  Jeff Law  <law@redhat.com>
 
        PR debug/53948
index 13420ebfbd84bc7a4eaee97bc5c4b8f0b85dc732..49c9723fc485199edb561049ef58d68207579a24 100644 (file)
@@ -1213,24 +1213,26 @@ simplify_operand_subreg (int nop, enum machine_mode reg_mode)
       enum reg_class rclass
        = (enum reg_class) targetm.preferred_reload_class (reg, ALL_REGS);
 
-      new_reg = lra_create_new_reg_with_unique_value (reg_mode, reg, rclass,
-                                                     "subreg reg");
-      bitmap_set_bit (&lra_optional_reload_pseudos, REGNO (new_reg));
-      if (type != OP_OUT
-         || GET_MODE_SIZE (GET_MODE (reg)) > GET_MODE_SIZE (mode))
+      if (get_reload_reg (curr_static_id->operand[nop].type, reg_mode, reg,
+                         rclass, "subreg reg", &new_reg))
        {
-         push_to_sequence (before);
-         lra_emit_move (new_reg, reg);
-         before = get_insns ();
-         end_sequence ();
-       }
-      if (type != OP_IN)
-       {
-         start_sequence ();
-         lra_emit_move (reg, new_reg);
-         emit_insn (after);
-         after = get_insns ();
-         end_sequence ();
+         bitmap_set_bit (&lra_optional_reload_pseudos, REGNO (new_reg));
+         if (type != OP_OUT
+             || GET_MODE_SIZE (GET_MODE (reg)) > GET_MODE_SIZE (mode))
+           {
+             push_to_sequence (before);
+             lra_emit_move (new_reg, reg);
+             before = get_insns ();
+             end_sequence ();
+           }
+         if (type != OP_IN)
+           {
+             start_sequence ();
+             lra_emit_move (reg, new_reg);
+             emit_insn (after);
+             after = get_insns ();
+             end_sequence ();
+           }
        }
       SUBREG_REG (operand) = new_reg;
       lra_process_new_insns (curr_insn, before, after,
index 6271660d8ab65e7f25c5206c1c284f68ee54d203..875c7afddabcc322510433d063cb3fb0b0fd69be 100644 (file)
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -2272,7 +2272,6 @@ lra (FILE *f)
     {
       for (;;)
        {
-         bitmap_clear (&lra_optional_reload_pseudos);
          /* We should try to assign hard registers to scratches even
             if there were no RTL transformations in
             lra_constraints.  */
@@ -2311,6 +2310,7 @@ lra (FILE *f)
                live_p = false;
            }
        }
+      bitmap_clear (&lra_optional_reload_pseudos);
       bitmap_clear (&lra_inheritance_pseudos);
       bitmap_clear (&lra_split_regs);
       if (! lra_need_for_spills_p ())
index 83843b765810ad7eca61d15022319654f75e98f6..56299003f675dfb5ce286e7c4efd095cd54d1904 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-08  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/56246
+       * gcc.target/i386/pr56246.c: New test.
+
 2013-02-08  Jeff Law  <law@redhat.com>
 
        PR debug/53948
diff --git a/gcc/testsuite/gcc.target/i386/pr56246.c b/gcc/testsuite/gcc.target/i386/pr56246.c
new file mode 100644 (file)
index 0000000..64a2527
--- /dev/null
@@ -0,0 +1,7 @@
+/* PR target/56225 */
+/* { dg-do compile { target { ia32 } } } */
+/* { dg-options "-O2 -fno-omit-frame-pointer -march=i686 -fpic" } */
+
+void NoBarrier_AtomicExchange (long long *ptr) {
+  while (__sync_val_compare_and_swap (ptr, 1, 0) );
+}