2013-04-29 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2013 19:42:20 +0000 (19:42 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2013 19:42:20 +0000 (19:42 +0000)
PR target/57097
        * lra-constraints.c (process_alt_operands): Discourage a bit more
using memory for pseudos.  Print cost dump for alternatives.
Modify cost values for conflicts with early clobbers.
(curr_insn_transform): Spill pseudos reassigned to NO_REGS.

2013-04-29  Vladimir Makarov  <vmakarov@redhat.com>

PR target/57097
* gcc.target/i386/pr57097.c: New test.

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

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

index c097c80..f587af8 100644 (file)
@@ -1,3 +1,11 @@
+2013-04-29  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/57097
+        * lra-constraints.c (process_alt_operands): Discourage a bit more
+       using memory for pseudos.  Print cost dump for alternatives.
+       Modify cost values for conflicts with early clobbers.
+       (curr_insn_transform): Spill pseudos reassigned to NO_REGS.
+
 2013-04-29  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/57098
index bd1325b..d9e14dc 100644 (file)
@@ -2013,7 +2013,7 @@ process_alt_operands (int only_alternative)
                 although it might takes the same number of
                 reloads.  */
              if (no_regs_p && REG_P (op))
-               reject++;
+               reject += 2;
 
 #ifdef SECONDARY_MEMORY_NEEDED
              /* If reload requires moving value through secondary
@@ -2044,7 +2044,13 @@ process_alt_operands (int only_alternative)
             or non-important thing to be worth to do it.  */
          overall = losers * LRA_LOSER_COST_FACTOR + reject;
          if ((best_losers == 0 || losers != 0) && best_overall < overall)
-           goto fail;
+            {
+              if (lra_dump_file != NULL)
+               fprintf (lra_dump_file,
+                        "          alt=%d,overall=%d,losers=%d -- reject\n",
+                        nalt, overall, losers);
+              goto fail;
+            }
 
          curr_alt[nop] = this_alternative;
          COPY_HARD_REG_SET (curr_alt_set[nop], this_alternative_set);
@@ -2139,7 +2145,10 @@ process_alt_operands (int only_alternative)
              curr_alt_dont_inherit_ops[curr_alt_dont_inherit_ops_num++]
                = last_conflict_j;
              losers++;
-             overall += LRA_LOSER_COST_FACTOR;
+             /* Early clobber was already reflected in REJECT. */
+             lra_assert (reject > 0);
+             reject--;
+             overall += LRA_LOSER_COST_FACTOR - 1;
            }
          else
            {
@@ -2163,7 +2172,10 @@ process_alt_operands (int only_alternative)
                }
              curr_alt_win[i] = curr_alt_match_win[i] = false;
              losers++;
-             overall += LRA_LOSER_COST_FACTOR;
+             /* Early clobber was already reflected in REJECT. */
+             lra_assert (reject > 0);
+             reject--;
+             overall += LRA_LOSER_COST_FACTOR - 1;
            }
        }
       small_class_operands_num = 0;
@@ -2171,6 +2183,11 @@ process_alt_operands (int only_alternative)
        small_class_operands_num
          += SMALL_REGISTER_CLASS_P (curr_alt[nop]) ? 1 : 0;
 
+      if (lra_dump_file != NULL)
+       fprintf (lra_dump_file, "          alt=%d,overall=%d,losers=%d,"
+                "small_class_ops=%d,rld_nregs=%d\n",
+                nalt, overall, losers, small_class_operands_num, reload_nregs);
+
       /* If this alternative can be made to work by reloading, and it
         needs less reloading than the others checked so far, record
         it as the chosen goal for reloading.  */
@@ -3136,7 +3153,15 @@ curr_insn_transform (void)
                 spilled.  Spilled scratch pseudos are transformed
                 back to scratches at the LRA end.  */
              && lra_former_scratch_operand_p (curr_insn, i))
-           change_class (REGNO (op), NO_REGS, "      Change", true);
+           {
+             int regno = REGNO (op);
+             change_class (regno, NO_REGS, "      Change", true);
+             if (lra_get_regno_hard_regno (regno) >= 0)
+               /* We don't have to mark all insn affected by the
+                  spilled pseudo as there is only one such insn, the
+                  current one.  */
+               reg_renumber[regno] = -1;
+           }
          continue;
        }
 
index a70dc4b..42f141e 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-29  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/57097
+       * gcc.target/i386/pr57097.c: New test.
+
 2013-04-29  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/57098
diff --git a/gcc/testsuite/gcc.target/i386/pr57097.c b/gcc/testsuite/gcc.target/i386/pr57097.c
new file mode 100644 (file)
index 0000000..2f00938
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fPIC" } */
+extern double ad[], bd[], cd[], dd[];
+extern long long all[], bll[], cll[], dll[];
+
+int
+main (int i, char **a)
+{
+  bd[i] = i + 64;
+  if (i % 3 == 0)
+    {
+      cd[i] = i;
+    }
+  dd[i] = i / 2;
+  ad[i] = i * 2;
+  if (i % 3 == 1)
+    {
+      dll[i] = 127;
+    }
+  dll[i] = i;
+  cll[i] = i * 2;
+  switch (i % 3)
+    {
+    case 0:
+      bll[i] = i + 64;
+    }
+  all[i] = i / 2;
+  return 0;
+}