<div dir="ltr"><br><div>Thanks, Quentin.</div><div><br></div><div>I will apply the same trick on x86 as AArch64.</div><div><br></div><div>Manman</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 6, 2016 at 11:23 AM, Quentin Colombet <span dir="ltr"><<a href="mailto:qcolombet@apple.com" target="_blank">qcolombet@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Manman,<br>
<br>
Just a heads-up to tell you that the fix for PR25820 landed and as discussed before the holidays, this implies poorer codegen for the cxx fast TLS calling convention on x86 since shrink-wrapping cannot help you anymore. I.e., you need to apply the same tricks that you did for AArch64 on x86.<br>
<br>
Cheers,<br>
-Quentin<br>
<div class="HOEnZb"><div class="h5">> On Jan 6, 2016, at 11:09 AM, Quentin Colombet via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
><br>
> Author: qcolombet<br>
> Date: Wed Jan  6 13:09:26 2016<br>
> New Revision: 256959<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=256959&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=256959&view=rev</a><br>
> Log:<br>
> [X86] Correctly model TLS calls w.r.t. frame requirements.<br>
> TLS calls need the stack frame to be properly set up and this<br>
> implies that such calls need ADJUSTSTACK_xxx markers.<br>
><br>
> Fixes PR25820.<br>
><br>
> Modified:<br>
>    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
>    llvm/trunk/test/CodeGen/X86/cxx_tlscc64.ll<br>
>    llvm/trunk/test/CodeGen/X86/x86-shrink-wrapping.ll<br>
><br>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=256959&r1=256958&r2=256959&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=256959&r1=256958&r2=256959&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Wed Jan  6 13:09:26 2016<br>
> @@ -12474,8 +12474,12 @@ X86TargetLowering::LowerGlobalTLSAddress<br>
>     // location.<br>
>     SDValue Chain = DAG.getEntryNode();<br>
>     SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);<br>
> +    Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, DL, true), DL);<br>
>     SDValue Args[] = { Chain, Offset };<br>
>     Chain = DAG.getNode(X86ISD::TLSCALL, DL, NodeTys, Args);<br>
> +    Chain =<br>
> +        DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, DL, true),<br>
> +                           DAG.getIntPtrConstant(0, DL, true), SDValue(), DL);<br>
><br>
>     // TLSCALL will be codegen'ed as call. Inform MFI that function has calls.<br>
>     MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();<br>
><br>
> Modified: llvm/trunk/test/CodeGen/X86/cxx_tlscc64.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/cxx_tlscc64.ll?rev=256959&r1=256958&r2=256959&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/cxx_tlscc64.ll?rev=256959&r1=256958&r2=256959&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/CodeGen/X86/cxx_tlscc64.ll (original)<br>
> +++ llvm/trunk/test/CodeGen/X86/cxx_tlscc64.ll Wed Jan  6 13:09:26 2016<br>
> @@ -1,5 +1,9 @@<br>
> ; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s<br>
> -; RUN: llc < %s -mtriple=x86_64-apple-darwin -enable-shrink-wrap=true | FileCheck --check-prefix=SHRINK %s<br>
> +; TLS function were wrongly model and after fixing that, shrink-wrapping<br>
> +; cannot help here. To achieve the expected lowering, we need to playing<br>
> +; tricks similar to AArch64 fast TLS calling convention (r255821).<br>
> +; Re-enable the following run line when<br>
> +; _RUN_: llc < %s -mtriple=x86_64-apple-darwin -enable-shrink-wrap=true | FileCheck --check-prefix=SHRINK %s<br>
> %struct.S = type { i8 }<br>
><br>
> @sg = internal thread_local global %struct.S zeroinitializer, align 1<br>
><br>
> Modified: llvm/trunk/test/CodeGen/X86/x86-shrink-wrapping.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x86-shrink-wrapping.ll?rev=256959&r1=256958&r2=256959&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x86-shrink-wrapping.ll?rev=256959&r1=256958&r2=256959&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/CodeGen/X86/x86-shrink-wrapping.ll (original)<br>
> +++ llvm/trunk/test/CodeGen/X86/x86-shrink-wrapping.ll Wed Jan  6 13:09:26 2016<br>
> @@ -878,4 +878,48 @@ for.end:<br>
><br>
> declare i32 @varfunc(i8* nocapture readonly)<br>
><br>
> +@sum1 = external hidden thread_local global i32, align 4<br>
> +<br>
> +<br>
> +; Function Attrs: nounwind<br>
> +; Make sure the TLS call used to access @sum1 happens after the prologue<br>
> +; and before the epilogue.<br>
> +; TLS calls used to be wrongly model and shrink-wrapping would have inserted<br>
> +; the prologue and epilogue just around the call to doSomething.<br>
> +; PR25820.<br>
> +;<br>
> +; CHECK-LABEL: tlsCall:<br>
> +; CHECK: pushq<br>
> +; CHECK: testb $1, %dil<br>
> +; CHECK: je [[ELSE_LABEL:LBB[0-9_]+]]<br>
> +;<br>
> +; master bb<br>
> +; CHECK: movq _sum1@TLVP(%rip), %rdi<br>
> +; CHECK-NEXT: callq *(%rdi)<br>
> +; CHECK: jmp [[EXIT_LABEL:LBB[0-9_]+]]<br>
> +;<br>
> +; [[ELSE_LABEL]]:<br>
> +; CHECK: callq _doSomething<br>
> +;<br>
> +; [[EXIT_LABEL]]:<br>
> +; CHECK: popq<br>
> +; CHECK-NEXT: retq<br>
> +define i32 @tlsCall(i1 %bool1, i32 %arg, i32* readonly dereferenceable(4) %sum1) #3 {<br>
> +entry:<br>
> +  br i1 %bool1, label %master, label %else<br>
> +<br>
> +master:<br>
> +  %tmp1 = load i32, i32* %sum1, align 4<br>
> +  store i32 %tmp1, i32* @sum1, align 4<br>
> +  br label %exit<br>
> +<br>
> +else:<br>
> +  %call = call i32 @doSomething(i32 0, i32* null)<br>
> +  br label %exit<br>
> +<br>
> +exit:<br>
> +  %res = phi i32 [ %arg, %master], [ %call, %else ]<br>
> +  ret i32 %res<br>
> +}<br>
> +<br>
> attributes #3 = { nounwind }<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br>
</div></div></blockquote></div><br></div>