CXX_FAST_TLS calling convention: fix issue on X86-64.
When we have a single basic block, the explicit copy-back instructions should be inserted right before the terminator. Before this fix, they were wrongly placed at the beginning of the basic block. I will commit fixes to other platforms as well. PR26136 llvm-svn: 257925
This commit is contained in:
parent
285d7bd4e7
commit
4fe01bd8f9
|
|
@ -28908,6 +28908,7 @@ void X86TargetLowering::insertCopiesSplitCSR(
|
|||
|
||||
const TargetInstrInfo *TII = Subtarget->getInstrInfo();
|
||||
MachineRegisterInfo *MRI = &Entry->getParent()->getRegInfo();
|
||||
MachineBasicBlock::iterator MBBI = Entry->begin();
|
||||
for (const MCPhysReg *I = IStart; *I; ++I) {
|
||||
const TargetRegisterClass *RC = nullptr;
|
||||
if (X86::GR64RegClass.contains(*I))
|
||||
|
|
@ -28925,13 +28926,13 @@ void X86TargetLowering::insertCopiesSplitCSR(
|
|||
Attribute::NoUnwind) &&
|
||||
"Function should be nounwind in insertCopiesSplitCSR!");
|
||||
Entry->addLiveIn(*I);
|
||||
BuildMI(*Entry, Entry->begin(), DebugLoc(), TII->get(TargetOpcode::COPY),
|
||||
NewVR)
|
||||
BuildMI(*Entry, MBBI, DebugLoc(), TII->get(TargetOpcode::COPY), NewVR)
|
||||
.addReg(*I);
|
||||
|
||||
// Insert the copy-back instructions right before the terminator.
|
||||
for (auto *Exit : Exits)
|
||||
BuildMI(*Exit, Exit->begin(), DebugLoc(), TII->get(TargetOpcode::COPY),
|
||||
*I)
|
||||
BuildMI(*Exit, Exit->getFirstTerminator(), DebugLoc(),
|
||||
TII->get(TargetOpcode::COPY), *I)
|
||||
.addReg(NewVR);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
@sg = internal thread_local global %struct.S zeroinitializer, align 1
|
||||
@__dso_handle = external global i8
|
||||
@__tls_guard = internal thread_local unnamed_addr global i1 false
|
||||
@sum1 = internal thread_local global i32 0, align 4
|
||||
|
||||
declare void @_ZN1SC1Ev(%struct.S*)
|
||||
declare void @_ZN1SD1Ev(%struct.S*)
|
||||
|
|
@ -50,3 +51,17 @@ init.i:
|
|||
__tls_init.exit:
|
||||
ret %struct.S* @sg
|
||||
}
|
||||
|
||||
; CHECK-LABEL: _ZTW4sum1
|
||||
; CHECK-NOT: pushq %r11
|
||||
; CHECK-NOT: pushq %r10
|
||||
; CHECK-NOT: pushq %r9
|
||||
; CHECK-NOT: pushq %r8
|
||||
; CHECK-NOT: pushq %rsi
|
||||
; CHECK-NOT: pushq %rdx
|
||||
; CHECK-NOT: pushq %rcx
|
||||
; CHECK-NOT: pushq %rbx
|
||||
; CHECK: callq
|
||||
define cxx_fast_tlscc nonnull i32* @_ZTW4sum1() nounwind {
|
||||
ret i32* @sum1
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue