----- Original Message -----
From: "Michael Meissner" <meiss...@linux.vnet.ibm.com>
To: "Vladimir Makarov" <vmaka...@redhat.com>
Cc: "Michael Meissner" <meiss...@linux.vnet.ibm.com>, "David Edelsohn" 
<dje....@gmail.com>, "gcc-patches" <gcc-patches@gcc.gnu.org>, "Peter Bergner" 
<berg...@vnet.ibm.com>, aavru...@redhat.com
Sent: Friday, April 26, 2013 7:13:55 PM
Subject: Re: RFA: enable LRA for rs6000

On Fri, Apr 26, 2013 at 07:00:37PM -0400, Vladimir Makarov wrote:
> 2013-04-26  Vladimir Makarov  <vmaka...@redhat.com>
> 
>         * lra.c (setup_operand_alternative): Ignore '?'.
>         * lra-constraints.c (process_alt_operands): Print cost dump for
>         alternatives.  Check only moves for cycling.
>         (curr_insn_transform): Print insn name.

I'm not sure I'm comfortable with ignoring the '?' altogether.  For example, if
you do something in the GPR unit, instructions run at one cycle, while if you
do it in the vector unit, it runs in two cycles.  In the past, I've seen cases
where it wanted to spill floating point values from the floating point
registers to the CTR.  And if you spill to the LR, it can interfere with the
call cache.

Admitily, when to use '!', '?', and '*' is unclear, and unfortunately it has
changed over time.

-----------

I don't like to change '?' semantics too.  So I found another solution.
I've committed it to the branch although it might be not final solution --
I'd like to see how it affects x86/x86-64.

Mike, could you send me the config file (if it is possible of course) for
spec2006 you are using in order to be in sync.

Thanks, Vlad.


2013-04-28  Vladimir Makarov  <vmaka...@redhat.com>

        * lra.c (setup_operand_alternative): Restore taking into account
        '?'.
        * lra-constraints.c (process_alt_operands): Discourage a bit more using
        memory for pseudos.  Remove printing undefined values.  Modify
        cost values for conflicts with early clobbers.


Index: lra.c
===================================================================
--- lra.c       (revision 198350)
+++ lra.c       (working copy)
@@ -784,6 +784,9 @@ setup_operand_alternative (lra_insn_reco
                  lra_assert (i != nop - 1);
                  break;

+               case '?':
+                 op_alt->reject += LRA_LOSER_COST_FACTOR;
+                 break;
                case '!':
                  op_alt->reject += LRA_MAX_REJECT;
                  break;
Index: lra-constraints.c
===================================================================
--- lra-constraints.c   (revision 198373)
+++ lra-constraints.c   (working copy)
@@ -2007,7 +2007,7 @@ process_alt_operands (int only_alternati
                 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
@@ -2040,9 +2040,9 @@ process_alt_operands (int only_alternati
          if ((best_losers == 0 || losers != 0) && best_overall < overall)
            {
              if (lra_dump_file != NULL)
-               fprintf (lra_dump_file, "          alt=%d,overall=%d,losers=%d,"
-                        "small_class_ops=%d,rld_nregs=%d -- reject\n",
-                nalt, overall, losers, small_class_operands_num, reload_nregs);
+               fprintf (lra_dump_file,
+                        "          alt=%d,overall=%d,losers=%d -- reject\n",
+                        nalt, overall, losers);
              goto fail;
            }

@@ -2139,7 +2139,10 @@ process_alt_operands (int only_alternati
              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 +2166,10 @@ process_alt_operands (int only_alternati
                }
              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;

Reply via email to