mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 23:18:51 +00:00
ISel: We need to notify FastIS of the IMPLICIT_DEF we created in createSwiftErrorEntriesInEntryBlock
Otherwise, it will insert instructions before it. rdar://30536186 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296395 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2219387eaf
commit
e4e218c802
@ -1306,6 +1306,7 @@ static void setupSwiftErrorVals(const Function &Fn, const TargetLowering *TLI,
|
||||
}
|
||||
|
||||
static void createSwiftErrorEntriesInEntryBlock(FunctionLoweringInfo *FuncInfo,
|
||||
FastISel *FastIS,
|
||||
const TargetLowering *TLI,
|
||||
const TargetInstrInfo *TII,
|
||||
SelectionDAGBuilder *SDB) {
|
||||
@ -1332,6 +1333,11 @@ static void createSwiftErrorEntriesInEntryBlock(FunctionLoweringInfo *FuncInfo,
|
||||
BuildMI(*FuncInfo->MBB, FuncInfo->MBB->getFirstNonPHI(),
|
||||
SDB->getCurDebugLoc(), TII->get(TargetOpcode::IMPLICIT_DEF),
|
||||
VReg);
|
||||
|
||||
// Keep FastIS informed about the value we just inserted.
|
||||
if (FastIS)
|
||||
FastIS->setLastLocalValue(&*std::prev(FuncInfo->InsertPt));
|
||||
|
||||
FuncInfo->setCurrentSwiftErrorVReg(FuncInfo->MBB, SwiftErrorVal, VReg);
|
||||
}
|
||||
}
|
||||
@ -1501,7 +1507,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||
else
|
||||
FastIS->setLastLocalValue(nullptr);
|
||||
}
|
||||
createSwiftErrorEntriesInEntryBlock(FuncInfo, TLI, TII, SDB);
|
||||
createSwiftErrorEntriesInEntryBlock(FuncInfo, FastIS, TLI, TII, SDB);
|
||||
|
||||
// Iterate over all basic blocks in the function.
|
||||
for (const BasicBlock *LLVMBB : RPOT) {
|
||||
|
@ -685,3 +685,30 @@ entry:
|
||||
tail call void @acallee(i8* null)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Make sure we don't crash on this function during -O0.
|
||||
; We used to crash because we would insert an IMPLICIT_DEF for the swifterror at
|
||||
; beginning of the machine basic block but did not inform FastISel of the
|
||||
; inserted instruction. When computing the InsertPoint in the entry block
|
||||
; FastISel would choose an insertion point before the IMPLICIT_DEF causing a
|
||||
; crash later on.
|
||||
declare hidden swiftcc i8* @testFunA()
|
||||
|
||||
%TSb = type <{ i1 }>
|
||||
|
||||
define swiftcc void @dontCrash() {
|
||||
entry:
|
||||
%swifterror = alloca swifterror %swift_error*, align 8
|
||||
store %swift_error* null, %swift_error** %swifterror, align 8
|
||||
%a = call i8* @testFunA()
|
||||
%b = bitcast i8* %a to %TSb*
|
||||
%._value = getelementptr inbounds %TSb, %TSb* %b, i32 0, i32 0
|
||||
%c = load i1, i1* %._value, align 1
|
||||
br i1 %c, label %trueBB, label %falseBB
|
||||
|
||||
trueBB:
|
||||
ret void
|
||||
|
||||
falseBB:
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user