[llvm-dev] Redundant load in llvm's codegen compares to gcc when accessing escaped pointer?
Chris Lattner via llvm-dev
llvm-dev at lists.llvm.org
Thu Mar 17 16:35:34 PDT 2016
> On Mar 15, 2016, at 7:58 AM, Chuang-Yu Cheng via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> Hi,
>
> Please look at this c code:
>
> typedef struct _PB {
> void* data; /* required.*/
> int f1_;
> float f2_;
> } PB;
>
> PB** bar(PB** t);
>
> void qux(PB* c) {
> bar(&c); /* c is escaped because of bar */
> c->f1_ = 0;
> c->f2_ = 0.f;
> }
>
> // gcc-5.2.1 with -fno-strict-aliasing -O2 on x86
> call bar
> movq 8(%rsp), %rax
> movl $0, 8(%rax)
> movl $0x00000000, 12(%rax)
>
> // llvm 3.9.0 with -fno-strict-aliasing -O2 on x86
> callq bar
> movq (%rsp), %rax
> movl $0, 8(%rax)
> movq (%rsp), %rax
> movl $0, 12(%rax)
>
> You can see that llvm load "c" twice, but gcc only load "c" once.
> Of course, in bar function, you may do something very dangerous, e.g.
>
> PB** bar(PB** t) {
> *t = (PB*) t;
> }
>
> But gcc doesn't care bar's definition.
> Is llvm too conservative, or gcc too aggressive in this pattern?
In my opinion, in the face of -fno-strict-aliasing, GCC is being too aggressive. It would be interesting to hear what they think.
-Chris
More information about the llvm-dev
mailing list