[llvm-dev] Potential missed optimisation with SEH funclets

Reid Kleckner via llvm-dev llvm-dev at lists.llvm.org
Thu Jun 27 11:34:52 PDT 2019


The main reason it is done is so that frame index resolution just works
inside funclets. Otherwise, we'd have to code up some logic to use a
different base register for stack object offsets inside funclets. Which,
when you say it that way, seems pretty easy to implement. It's just a
matter of changing X86FrameLowering::getFrameIndexReference.

On Thu, Jun 27, 2019 at 5:05 AM David Chisnall via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> A quick skim of this code looks as if we are explicitly disabling frame
> pointer elimination for funclets in the back end.  It looks as if this
> is done because FP-elim sometimes breaks funclets - if anyone has a test
> case for this then that would probably help tracking it down.
>
> David
>
> On 26/06/2019 21:17, Reid Kleckner via llvm-dev wrote:
> > Yes, not much effort has been applied to optimizing Windows exception
> > handling. We were primarily concerned with making it correct, and
> > improving it hasn't been a priority. You can follow the code path
> > through X86FrameLowering::emitPrologue with IsFunclet=true and see that
> > it mechanically emits all the extra instructions mentioned above without
> > any logic to skip such steps when not necessary.
> >
> > However, while the mid-level representation we chose makes it hard to
> > write these types of micro-level code quality optimizations, it allows
> > the optimizers to do a variety of fancy things like heap to stack
> > promotion on unique_ptr in the presence of exceptional control flow.
> >
> > On Tue, Jun 25, 2019 at 4:08 AM Hamza Sood via llvm-dev
> > <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
> >
> >     I’ve been experimenting with SEH handling in LLVM, and it seems like
> >     the unwind funclets generated by LLVM are much larger than those
> >     generated by Microsoft’s CL compiler.
> >
> >     I used the following code as a test:
> >
> >     void test() {
> >        MyClass x;
> >        externalFunction();
> >     }
> >
> >     Compiling with CL, the unwind funclet that destroys ‘x’ is just two
> >     lines of asm:
> >
> >     lea rcx, QWORD PTR x$[rdx]
> >     jmp ??1MyClass@@QEAA at XZ
> >
> >     However when compiling with clang-cl, it seems like it sets up an
> >     entire function frame just for the destructor call:
> >
> >     mov qword ptr [rsp + 16], rdx
> >     push rbp
> >     .seh_pushreg 5
> >     sub rsp, 32
> >     .seh_stackalloc 32
> >     Lea rbp, [rdx + 48]
> >     .seh_endprologue
> >     Lea rcx, [rbp - 16]
> >     call "??1MyClass@@QEAA at XZ> >     nop
> >     add rsp, 32
> >     pop rbp
> >     ret
> >
> >     Both were compiled with “/c /O2 /MD /EHsc”
> >
> >     Is LLVM missing a major optimisation here?
> >     _______________________________________________
> >     LLVM Developers mailing list
> >     llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> >     https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190627/55c40781/attachment.html>


More information about the llvm-dev mailing list