On Tue, 2 Jul, 2019, 3:52 PM Ramana Radhakrishnan, <
ramana....@googlemail.com> wrote:

> On Tue, Jul 2, 2019 at 1:29 AM Akshat Garg <xks...@gmail.com> wrote:
> >
> > On Tue, Jun 25, 2019 at 9:49 PM Akshat Garg <xks...@gmail.com> wrote:
> >>
> >> On Tue, Jun 25, 2019 at 4:04 PM Ramana Radhakrishnan <
> ramana....@googlemail.com> wrote:
> >>>
> >> [CCing gcc mailing list]
> >>
> >> So, shall I start looking over the pointer optimizations only and see
> what information we may be needed on the same examples in the IR itself?
> >>
> >> - Akshat
> >
> > I have coded an example where equality comparison kills dependency from
> the document P0190R4 as shown below :
> >
> > 1. struct rcutest rt = {1, 2, 3};
> > 2. void thread0 ()
> > 3. {
> > 4.     rt.a = -42;
> > 5.     rt.b = -43;
> > 6.     rt.c = -44;
> > 7.     rcu_assign_pointer(gp, &rt);
> > 8. }
> > 9.
> > 10. void thread1 ()
> > 11. {
> > 12.    int i = -1;
> > 13.    int j = -1;
> > 14.    _Dependent_ptr struct rcutest *p;
> > 15.
> > 16.    p = rcu_dereference(gp);
> > 17.    j = p->a;
> > 18.   if (p == &rt)
> > 19.        i = p->b;  /*Dependency breaking point*/
> > 20.   else if(p)
> > 21.       i = p->c;
> > 22.   assert(i<0);
> > 23.   assert(j<0);
> > 24. }
> > The gimple unoptimized code produced for lines 17-24 is shown below
> >
> > 1. if (p_16 == &rt)
> > 2.     goto <bb 3>; [INV]
> > 3.   else
> > 4.    goto <bb 4>; [INV]
> > 5.
> > 6.  <bb 3> :
> > 7.  i_19 = p_16->b;
> > 8.  goto <bb 6>; [INV]
> > 9.
> > 10.  <bb 4> :
> > 11.  if (p_16 != 0B)
> > 12.    goto <bb 5>; [INV]
> > 13.  else
> > 14.    goto <bb 6>; [INV]
> > 15.
> > 16.  <bb 5> :
> > 17.  i_18 = p_16->c;
> > 18.
> > 19.  <bb 6> :
> > 20.  # i_7 = PHI <i_19(3), i_8(4), i_18(5)>
> > 21.  _3 = i_7 < 0;
> > 22.  _4 = (int) _3;
> > 23.  assert (_4);
> > 24.  _5 = j_17 < 0;
> > 25.  _6 = (int) _5;
> > 26.  assert (_6);
> > 27.  return;
> >
> > The optimized code after -O1 is applied for the same lines is hown below
> :
> >
> > 1. if (_2 == &rt)
> > 2.    goto <bb 3>; [30.00%]
> > 3. else
> > 4.    goto <bb 4>; [70.00%]
> > 5.
> > 6.  <bb 3> [local count: 322122547]:
> > 7.   i_12 = rt.b;
> > 8.   goto <bb 6>; [100.00%]
> > 9.
> > 10.  <bb 4> [local count: 751619277]:
> > 11.   if (_1 != 0)
> > 12.   goto <bb 5>; [50.00%]
> > 13.   else
> > 14.    goto <bb 6>; [50.00%]
> > 15.
> > 16.  <bb 5> [local count: 375809638]:
> > 17.   i_11 = MEM[(dependent_ptr struct rcutest *)_2].c;
> > 18.
> > 19.   <bb 6> [local count: 1073741824]:
> > 20.  # i_7 = PHI <i_12(3), i_11(5), -1(4)>
> > 21.   _3 = i_7 < 0;
> > 22.   _4 = (int) _3;
> > 23.   assert (_4);
> > 24.  _5 = j_10 < 0;
> > 25.  _6 = (int) _5;
> > 26.   assert (_6);
> > 27.   return;
> >
> > Statement 19 in the program gets converted from  i_19 = p_16->b; in line
> 7 in unoptimized code to i_12 = rt.b; in line 7 in optimized code which
> breaks the dependency chain. We need to figure out the pass that does that
> and put some handling code in there for the _dependent_ptr qualified
> pointers. Passing simply -fipa-pure-const, -fguess-branch-probability or
> any other option alone does not produce the optimized code that breaks the
> dependency. But applying -O1, i.e., allowing all the optimizations does so.
> As passes are applied in a certain order, we need to figure out upto what
> passes, the code remains same and after what pass the dependency does not
> holds. So, we need to check the translated code after every pass.
> >
>
> It's worth figuring out what passes are doing this - however the worry
> I have is that every pass now needs to be handling this case with
> respect to pointer attributes. Is there some place that you are
> storing said information and what is the transitive nature of
> assignments with these attributes ?
>
> regards
> Ramana
>
I don't understand what information to store, can you explain? I was
thinking of putting some code inside the pass, which breaks the dependency
chains, which will avoid this type of conversions when it finds out  that
the pointer is _Dependent_ptr qualified otherwise don't do anything. Can
you let me know what I am missing on?

In transitive nature, are you talking about the dependent pointer being
assigned to some non-dependent pointer and after further assigned to some
other pointer?

>
> > Does this sounds like a workable plan for ? Let me know your thoughts.
> If this sounds good then, we can do this for all the optimizations that may
> kill the dependencies at somepoint.
> >
> > -Akshat
>

Reply via email to