diff mbox

rs6000 branch probability changes

Message ID CAGWvnyn9J43o0oQc7kwM87zFzyY+85q9WoZgh=yX=WVsye9Luw@mail.gmail.com
State New
Headers show

Commit Message

David Edelsohn June 30, 2017, 1:36 p.m. UTC
Convert the rs6000 port to use the new API for branch probabilities.

Okay?

Thanks, David

* config/rs6000/rs6000.c (emit_unlikely_jump): Adjust to new branch
probability data type.

Comments

Ramana Radhakrishnan June 30, 2017, 9:36 p.m. UTC | #1
On Fri, Jun 30, 2017 at 2:36 PM, David Edelsohn <dje.gcc@gmail.com> wrote:
> Convert the rs6000 port to use the new API for branch probabilities.
>
> Okay?
>
> Thanks, David
>
> * config/rs6000/rs6000.c (emit_unlikely_jump): Adjust to new branch
> probability data type.
>
> Index: rs6000.c
> ===================================================================
> --- rs6000.c (revision 249839)
> +++ rs6000.c (working copy)
> @@ -23514,10 +23514,9 @@
>  static void
>  emit_unlikely_jump (rtx cond, rtx label)
>  {
> -  int very_unlikely = REG_BR_PROB_BASE / 100 - 1;
>    rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
>    rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
> -  add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
> +  add_int_reg_note (insn, REG_BR_PROB, profile_probability::very_unlikely ());

Hmmm isn't this very unlikely to work :) ?

I used this as inspiration to do this for the arm ports but
add_int_reg_note expects an integer but very_unlikely returns
profile_probability  ...

regards
Ramana



Ramana

>  }
>
>  /* A subroutine of the atomic operation splitters.  Emit a load-locked
Segher Boessenkool June 30, 2017, 11:18 p.m. UTC | #2
On Fri, Jun 30, 2017 at 10:36:27PM +0100, Ramana Radhakrishnan wrote:
> On Fri, Jun 30, 2017 at 2:36 PM, David Edelsohn <dje.gcc@gmail.com> wrote:
> > Convert the rs6000 port to use the new API for branch probabilities.
> >
> > Okay?
> >
> > Thanks, David
> >
> > * config/rs6000/rs6000.c (emit_unlikely_jump): Adjust to new branch
> > probability data type.
> >
> > Index: rs6000.c
> > ===================================================================
> > --- rs6000.c (revision 249839)
> > +++ rs6000.c (working copy)
> > @@ -23514,10 +23514,9 @@
> >  static void
> >  emit_unlikely_jump (rtx cond, rtx label)
> >  {
> > -  int very_unlikely = REG_BR_PROB_BASE / 100 - 1;
> >    rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
> >    rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
> > -  add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
> > +  add_int_reg_note (insn, REG_BR_PROB, profile_probability::very_unlikely ());
> 
> Hmmm isn't this very unlikely to work :) ?
> 
> I used this as inspiration to do this for the arm ports but
> add_int_reg_note expects an integer but very_unlikely returns
> profile_probability  ...

It probably should be converted using to_reg_br_prob_base ?


Segher
David Edelsohn July 1, 2017, 12:59 p.m. UTC | #3
On Fri, Jun 30, 2017 at 7:18 PM, Segher Boessenkool
<segher@kernel.crashing.org> wrote:
> On Fri, Jun 30, 2017 at 10:36:27PM +0100, Ramana Radhakrishnan wrote:
>> On Fri, Jun 30, 2017 at 2:36 PM, David Edelsohn <dje.gcc@gmail.com> wrote:
>> > Convert the rs6000 port to use the new API for branch probabilities.
>> >
>> > Okay?
>> >
>> > Thanks, David
>> >
>> > * config/rs6000/rs6000.c (emit_unlikely_jump): Adjust to new branch
>> > probability data type.
>> >
>> > Index: rs6000.c
>> > ===================================================================
>> > --- rs6000.c (revision 249839)
>> > +++ rs6000.c (working copy)
>> > @@ -23514,10 +23514,9 @@
>> >  static void
>> >  emit_unlikely_jump (rtx cond, rtx label)
>> >  {
>> > -  int very_unlikely = REG_BR_PROB_BASE / 100 - 1;
>> >    rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
>> >    rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
>> > -  add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
>> > +  add_int_reg_note (insn, REG_BR_PROB, profile_probability::very_unlikely ());
>>
>> Hmmm isn't this very unlikely to work :) ?
>>
>> I used this as inspiration to do this for the arm ports but
>> add_int_reg_note expects an integer but very_unlikely returns
>> profile_probability  ...
>
> It probably should be converted using to_reg_br_prob_base ?

The comments in profile-count.h state that this should go away.

We need advice from Honza about the preferred way to transform these idioms.

Thanks, David
Jan Hubicka July 1, 2017, 1:06 p.m. UTC | #4
> >> > * config/rs6000/rs6000.c (emit_unlikely_jump): Adjust to new branch
> >> > probability data type.
> >> >
> >> > Index: rs6000.c
> >> > ===================================================================
> >> > --- rs6000.c (revision 249839)
> >> > +++ rs6000.c (working copy)
> >> > @@ -23514,10 +23514,9 @@
> >> >  static void
> >> >  emit_unlikely_jump (rtx cond, rtx label)
> >> >  {
> >> > -  int very_unlikely = REG_BR_PROB_BASE / 100 - 1;
> >> >    rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
> >> >    rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
> >> > -  add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
> >> > +  add_int_reg_note (insn, REG_BR_PROB, profile_probability::very_unlikely ());
> >>
> >> Hmmm isn't this very unlikely to work :) ?
> >>
> >> I used this as inspiration to do this for the arm ports but
> >> add_int_reg_note expects an integer but very_unlikely returns
> >> profile_probability  ...
> >
> > It probably should be converted using to_reg_br_prob_base ?
> 
> The comments in profile-count.h state that this should go away.
> 
> We need advice from Honza about the preferred way to transform these idioms.

I plan to change REG_BR_PROB notes to preserve all information from
profile_probability (this is needed to make RTL expansion splitting work as
expected), but for now they are still just REG_BR_PROB_BASE fixpoint.  

I think the code can stay as it is.  I will add APIs for emitting/interpretting
br_prob_nodes as followup (after debugging fixing issues with profile updating
which I can now detect with the new type)

Thanks for looking into this.

Honza
> 
> Thanks, David
David Edelsohn July 1, 2017, 1:19 p.m. UTC | #5
On Sat, Jul 1, 2017 at 9:06 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> >> > * config/rs6000/rs6000.c (emit_unlikely_jump): Adjust to new branch
>> >> > probability data type.
>> >> >
>> >> > Index: rs6000.c
>> >> > ===================================================================
>> >> > --- rs6000.c (revision 249839)
>> >> > +++ rs6000.c (working copy)
>> >> > @@ -23514,10 +23514,9 @@
>> >> >  static void
>> >> >  emit_unlikely_jump (rtx cond, rtx label)
>> >> >  {
>> >> > -  int very_unlikely = REG_BR_PROB_BASE / 100 - 1;
>> >> >    rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
>> >> >    rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
>> >> > -  add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
>> >> > +  add_int_reg_note (insn, REG_BR_PROB, profile_probability::very_unlikely ());
>> >>
>> >> Hmmm isn't this very unlikely to work :) ?
>> >>
>> >> I used this as inspiration to do this for the arm ports but
>> >> add_int_reg_note expects an integer but very_unlikely returns
>> >> profile_probability  ...
>> >
>> > It probably should be converted using to_reg_br_prob_base ?
>>
>> The comments in profile-count.h state that this should go away.
>>
>> We need advice from Honza about the preferred way to transform these idioms.
>
> I plan to change REG_BR_PROB notes to preserve all information from
> profile_probability (this is needed to make RTL expansion splitting work as
> expected), but for now they are still just REG_BR_PROB_BASE fixpoint.
>
> I think the code can stay as it is.  I will add APIs for emitting/interpretting
> br_prob_nodes as followup (after debugging fixing issues with profile updating
> which I can now detect with the new type)
>
> Thanks for looking into this.

Does the computed value of very_unlikely need to change for the new
scale?  Can the profile machinery provide a helper function or macro
instead of the current calculation replicated in many ports?

Thanks, David
Jan Hubicka July 1, 2017, 1:23 p.m. UTC | #6
> On Sat, Jul 1, 2017 at 9:06 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> >> >> > * config/rs6000/rs6000.c (emit_unlikely_jump): Adjust to new branch
> >> >> > probability data type.
> >> >> >
> >> >> > Index: rs6000.c
> >> >> > ===================================================================
> >> >> > --- rs6000.c (revision 249839)
> >> >> > +++ rs6000.c (working copy)
> >> >> > @@ -23514,10 +23514,9 @@
> >> >> >  static void
> >> >> >  emit_unlikely_jump (rtx cond, rtx label)
> >> >> >  {
> >> >> > -  int very_unlikely = REG_BR_PROB_BASE / 100 - 1;
> >> >> >    rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
> >> >> >    rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
> >> >> > -  add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
> >> >> > +  add_int_reg_note (insn, REG_BR_PROB, profile_probability::very_unlikely ());
> >> >>
> >> >> Hmmm isn't this very unlikely to work :) ?
> >> >>
> >> >> I used this as inspiration to do this for the arm ports but
> >> >> add_int_reg_note expects an integer but very_unlikely returns
> >> >> profile_probability  ...
> >> >
> >> > It probably should be converted using to_reg_br_prob_base ?
> >>
> >> The comments in profile-count.h state that this should go away.
> >>
> >> We need advice from Honza about the preferred way to transform these idioms.
> >
> > I plan to change REG_BR_PROB notes to preserve all information from
> > profile_probability (this is needed to make RTL expansion splitting work as
> > expected), but for now they are still just REG_BR_PROB_BASE fixpoint.
> >
> > I think the code can stay as it is.  I will add APIs for emitting/interpretting
> > br_prob_nodes as followup (after debugging fixing issues with profile updating
> > which I can now detect with the new type)
> >
> > Thanks for looking into this.
> 
> Does the computed value of very_unlikely need to change for the new
> scale?  Can the profile machinery provide a helper function or macro
> instead of the current calculation replicated in many ports?

There is PROB_VERY_UNLIKELY macro which should be used in this context.  Not
sure how and whhen this very_unlikely got in.  It is defined as 
(REG_BR_PROB_BASE / 2000 - 1) perhaps 2000 was consider just too strong here?

Honza
> 
> Thanks, David
Jan Hubicka July 1, 2017, 1:34 p.m. UTC | #7
> Does the computed value of very_unlikely need to change for the new
> scale?  Can the profile machinery provide a helper function or macro
> instead of the current calculation replicated in many ports?

And to answer your first question, there is REG_BR_PROB_BASE scale which is not
chnaged by my patch and there is also internal scale for profile_probability
(which is completely captured by the type) which currently is also set to
10000 to let me compare profiles produced before and after the conversion.
I plan to set it to more sane value soon after I am reasonably sure that there
is nothing wrong and we don't have code quality regressions related to the
revamp.

General plan is:
  1) fix issues with updating and add verifier that when profile is available
     all probabilities and counts are initialized
  2) eliminate REG_BR_PROB_BASE uses where it is not necessary (we use it for
     various internal scaling purposes, i.e. when verioning loops)
  3) work on removing frequencies (in favour of counts) for callgraph.
     Because counts have quality now, it is easy to declare that given count
     was determined by static profile estimation and is function local.
  4) remove frequencies from CFG
  5) remove edge counts from CFG and keep only probabilities.  For this
     probabilities will need to get more precise (by increasing the scale)
  6) work on elimination of REG_BR_PROB_BASE representation from RTL
   

Honza
diff mbox

Patch

Index: rs6000.c
===================================================================
--- rs6000.c (revision 249839)
+++ rs6000.c (working copy)
@@ -23514,10 +23514,9 @@ 
 static void
 emit_unlikely_jump (rtx cond, rtx label)
 {
-  int very_unlikely = REG_BR_PROB_BASE / 100 - 1;
   rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
   rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
-  add_int_reg_note (insn, REG_BR_PROB, very_unlikely);
+  add_int_reg_note (insn, REG_BR_PROB, profile_probability::very_unlikely ());
 }

 /* A subroutine of the atomic operation splitters.  Emit a load-locked