[cfe-dev] Speculative load optimization

Craig Topper via cfe-dev cfe-dev at lists.llvm.org
Mon Oct 9 16:53:36 PDT 2017


I think ternary is equivalent to an if in that only one side is evaluated.
But I think you're saying that gcc and icc will dereference s for both
sides of the if and then select between the loaded values.  Like this

    struct S* f1(struct S *s, int x)
    {
      struct S *a = s->p1;
      struct S *b = s->p2;
      return (x) ? a : b;
    }

~Craig

On Mon, Oct 9, 2017 at 2:16 PM, Kreitzer, David L via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> This llvm patch, https://reviews.llvm.org/D37289, attempts to do an
> optimization
> that involves speculating loads. The patch itself needs some work
> regardless,
> but we are questioning the legality of the optimization, which is currently
> performed by both gcc and icc. The desired transformation looks like this:
>
>     typedef struct S {
>       char padding[4088];
>       struct S *p1;
>       struct S *p2;
>     } S;
>
>     struct S* f1(struct S *s, int x)
>     {
>       S *r;
>       if (x)
>         r = s->p1;
>       else
>         r = s->p2;
>       return r;
>     }
>
> TO
>
>     struct S* f1(struct S *s, int x)
>     {
>       return (x) ? s->p1 : s->p2;
>     }
>
> The fundamental question seems to be whether loading one member of struct S
> makes it valid to load other members of the same struct. Both gcc & icc
> seem to think so and make a distinction between this case and a similar
> case
> where one field is accessed through an lvalue of a different type:
>
>     typedef struct T {
>       char padding[4088];
>       struct S *p1;
>     } T;
>
>     struct S* f2(struct S *s, int x)
>     {
>       S *r;
>       if (x)
>         r = ((T*)s)->p1;
>       else
>         r = s->p2;
>       return r;
>     }
>
> Neither compiler will transform this case.
>
> Any insight on the validity of this optimization in relation to the C/C++
> standards would be appreciated.
>
> Thanks,
> Dave Kreitzer
> Intel Compilers
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171009/aaa01aa1/attachment.html>


More information about the cfe-dev mailing list