mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-21 03:53:04 +02:00
[X86] Correctly model TLS calls w.r.t. frame requirements.
TLS calls need the stack frame to be properly set up and this implies that such calls need ADJUSTSTACK_xxx markers. Fixes PR25820. llvm-svn: 256959
This commit is contained in:
parent
f2a28338f0
commit
1b2176f1f4
@ -12474,8 +12474,12 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
|
||||
// location.
|
||||
SDValue Chain = DAG.getEntryNode();
|
||||
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, DL, true), DL);
|
||||
SDValue Args[] = { Chain, Offset };
|
||||
Chain = DAG.getNode(X86ISD::TLSCALL, DL, NodeTys, Args);
|
||||
Chain =
|
||||
DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, DL, true),
|
||||
DAG.getIntPtrConstant(0, DL, true), SDValue(), DL);
|
||||
|
||||
// TLSCALL will be codegen'ed as call. Inform MFI that function has calls.
|
||||
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
|
@ -1,5 +1,9 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin -enable-shrink-wrap=true | FileCheck --check-prefix=SHRINK %s
|
||||
; TLS function were wrongly model and after fixing that, shrink-wrapping
|
||||
; cannot help here. To achieve the expected lowering, we need to playing
|
||||
; tricks similar to AArch64 fast TLS calling convention (r255821).
|
||||
; Re-enable the following run line when
|
||||
; _RUN_: llc < %s -mtriple=x86_64-apple-darwin -enable-shrink-wrap=true | FileCheck --check-prefix=SHRINK %s
|
||||
%struct.S = type { i8 }
|
||||
|
||||
@sg = internal thread_local global %struct.S zeroinitializer, align 1
|
||||
|
@ -878,4 +878,48 @@ for.end: ; preds = %for.cond.for.end_cr
|
||||
|
||||
declare i32 @varfunc(i8* nocapture readonly)
|
||||
|
||||
@sum1 = external hidden thread_local global i32, align 4
|
||||
|
||||
|
||||
; Function Attrs: nounwind
|
||||
; Make sure the TLS call used to access @sum1 happens after the prologue
|
||||
; and before the epilogue.
|
||||
; TLS calls used to be wrongly model and shrink-wrapping would have inserted
|
||||
; the prologue and epilogue just around the call to doSomething.
|
||||
; PR25820.
|
||||
;
|
||||
; CHECK-LABEL: tlsCall:
|
||||
; CHECK: pushq
|
||||
; CHECK: testb $1, %dil
|
||||
; CHECK: je [[ELSE_LABEL:LBB[0-9_]+]]
|
||||
;
|
||||
; master bb
|
||||
; CHECK: movq _sum1@TLVP(%rip), %rdi
|
||||
; CHECK-NEXT: callq *(%rdi)
|
||||
; CHECK: jmp [[EXIT_LABEL:LBB[0-9_]+]]
|
||||
;
|
||||
; [[ELSE_LABEL]]:
|
||||
; CHECK: callq _doSomething
|
||||
;
|
||||
; [[EXIT_LABEL]]:
|
||||
; CHECK: popq
|
||||
; CHECK-NEXT: retq
|
||||
define i32 @tlsCall(i1 %bool1, i32 %arg, i32* readonly dereferenceable(4) %sum1) #3 {
|
||||
entry:
|
||||
br i1 %bool1, label %master, label %else
|
||||
|
||||
master:
|
||||
%tmp1 = load i32, i32* %sum1, align 4
|
||||
store i32 %tmp1, i32* @sum1, align 4
|
||||
br label %exit
|
||||
|
||||
else:
|
||||
%call = call i32 @doSomething(i32 0, i32* null)
|
||||
br label %exit
|
||||
|
||||
exit:
|
||||
%res = phi i32 [ %arg, %master], [ %call, %else ]
|
||||
ret i32 %res
|
||||
}
|
||||
|
||||
attributes #3 = { nounwind }
|
||||
|
Loading…
Reference in New Issue
Block a user