Alexander Potapenko via llvm-dev
2019-Aug-01 14:21 UTC
[llvm-dev] Dead store elimination in the backend for -ftrivial-auto-var-init
Hi folks, When compiling the attached example with -ftrivial-auto-var-init=zero: $ clang -no-integrated-as -mno-sse -m64 -mstack-alignment=8 -O2 -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang -g -o ipt.ll -c ipt.i -w -S -emit-llvm , Clang generates an initialization memset() call for |acpar| in the IR: %0 = bitcast %struct.xt_action_param* %acpar to i8*, !dbg !27 call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %0, i8 0, i64 40, i1 false), !dbg !28 Clang only splits memsets into series of stores under certain conditions, so it's hard to remove redundant stores on the IR level (even with the recent DSE patches: https://reviews.llvm.org/D61879). In the resulting assembly, however, the memset is lowered into a series of MOVQ instructions (see the attached ipt.s file), of which at least the stores to 24(%rsp) and 16(%rsp) are redundant. Given that at MCInst level we already know if a memset is split into a sequence of stores, can we do a better job by making the backend delete these redundant stores for us? Alex -- Alexander Potapenko Software Engineer Google Germany GmbH Erika-Mann-Straße, 33 80636 München Geschäftsführer: Paul Manicle, Halimah DeLaine Prado Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg -------------- next part -------------- A non-text attachment was scrubbed... Name: ipt.i Type: application/octet-stream Size: 461 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190801/b6398a44/attachment.obj> -------------- next part -------------- A non-text attachment was scrubbed... Name: ipt.s Type: application/octet-stream Size: 1880 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190801/b6398a44/attachment-0001.obj>
JF Bastien via llvm-dev
2019-Aug-01 16:08 UTC
[llvm-dev] Dead store elimination in the backend for -ftrivial-auto-var-init
Hi Alexander, The code doesn’t compile. Could you send a godbolt.org link that shows the issue? Thanks, JF> On Aug 1, 2019, at 7:21 AM, Alexander Potapenko <glider at google.com> wrote: > > Hi folks, > > When compiling the attached example with -ftrivial-auto-var-init=zero: > > $ clang -no-integrated-as -mno-sse -m64 -mstack-alignment=8 -O2 > -ftrivial-auto-var-init=zero > -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang > -g -o ipt.ll -c ipt.i -w -S -emit-llvm > > , Clang generates an initialization memset() call for |acpar| in the IR: > > %0 = bitcast %struct.xt_action_param* %acpar to i8*, !dbg !27 > call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %0, i8 0, i64 > 40, i1 false), !dbg !28 > > Clang only splits memsets into series of stores under certain > conditions, so it's hard to remove redundant stores on the IR level > (even with the recent DSE patches: https://reviews.llvm.org/D61879). > In the resulting assembly, however, the memset is lowered into a > series of MOVQ instructions (see the attached ipt.s file), of which at > least the stores to 24(%rsp) and 16(%rsp) are redundant. > > Given that at MCInst level we already know if a memset is split into a > sequence of stores, can we do a better job by making the backend > delete these redundant stores for us? > > Alex > > -- > Alexander Potapenko > Software Engineer > > Google Germany GmbH > Erika-Mann-Straße, 33 > 80636 München > > Geschäftsführer: Paul Manicle, Halimah DeLaine Prado > Registergericht und -nummer: Hamburg, HRB 86891 > Sitz der Gesellschaft: Hamburg > <ipt.i><ipt.s>
Alexander Potapenko via llvm-dev
2019-Aug-01 16:20 UTC
[llvm-dev] Dead store elimination in the backend for -ftrivial-auto-var-init
On Thu, Aug 1, 2019 at 6:09 PM JF Bastien <jfbastien at apple.com> wrote:> > Hi Alexander, > > The code doesn’t compile. Could you send a godbolt.org link that shows the issue?Sorry about that, here's the link: https://godbolt.org/z/-PinQP Lines 4 to 8 are initializing |acpar|. If I'm understanding correctly, the store to 8(%rsp) at line 7 can be removed because of the store at line 35. Same for store to 24(%rsp), which is later overwritten at lines 11 and 16.> Thanks, > > JF > > > On Aug 1, 2019, at 7:21 AM, Alexander Potapenko <glider at google.com> wrote: > > > > Hi folks, > > > > When compiling the attached example with -ftrivial-auto-var-init=zero: > > > > $ clang -no-integrated-as -mno-sse -m64 -mstack-alignment=8 -O2 > > -ftrivial-auto-var-init=zero > > -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang > > -g -o ipt.ll -c ipt.i -w -S -emit-llvm > > > > , Clang generates an initialization memset() call for |acpar| in the IR: > > > > %0 = bitcast %struct.xt_action_param* %acpar to i8*, !dbg !27 > > call void @llvm.memset.p0i8.i64(i8* nonnull align 8 %0, i8 0, i64 > > 40, i1 false), !dbg !28 > > > > Clang only splits memsets into series of stores under certain > > conditions, so it's hard to remove redundant stores on the IR level > > (even with the recent DSE patches: https://reviews.llvm.org/D61879). > > In the resulting assembly, however, the memset is lowered into a > > series of MOVQ instructions (see the attached ipt.s file), of which at > > least the stores to 24(%rsp) and 16(%rsp) are redundant. > > > > Given that at MCInst level we already know if a memset is split into a > > sequence of stores, can we do a better job by making the backend > > delete these redundant stores for us? > > > > Alex > > > > -- > > Alexander Potapenko > > Software Engineer > > > > Google Germany GmbH > > Erika-Mann-Straße, 33 > > 80636 München > > > > Geschäftsführer: Paul Manicle, Halimah DeLaine Prado > > Registergericht und -nummer: Hamburg, HRB 86891 > > Sitz der Gesellschaft: Hamburg > > <ipt.i><ipt.s> >-- Alexander Potapenko Software Engineer Google Germany GmbH Erika-Mann-Straße, 33 80636 München Geschäftsführer: Paul Manicle, Halimah DeLaine Prado Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg
Possibly Parallel Threads
- Dead store elimination in the backend for -ftrivial-auto-var-init
- Dead store elimination in the backend for -ftrivial-auto-var-init
- Dead store elimination in the backend for -ftrivial-auto-var-init
- Interprocedural DSE for -ftrivial-auto-var-init
- Interprocedural DSE for -ftrivial-auto-var-init