mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
[Local] Do not introduce a new llvm.trap
before unreachable
This is the second attempt to remove the `llvm.trap` insertion after https://reviews.llvm.org/rGe14e7bc4b889dfaffb7180d176a03311df2d4ae6 reverted the first one. It is not clear what the exact issue was back then and it might already be gone by now, it has been >5 years after all. Replaces D106299. Differential Revision: https://reviews.llvm.org/D106308
This commit is contained in:
parent
95f415bd34
commit
4ce16022d3
@ -328,8 +328,7 @@ removeAllNonTerminatorAndEHPadInstructions(BasicBlock *BB);
|
|||||||
|
|
||||||
/// Insert an unreachable instruction before the specified
|
/// Insert an unreachable instruction before the specified
|
||||||
/// instruction, making it and the rest of the code in the block dead.
|
/// instruction, making it and the rest of the code in the block dead.
|
||||||
unsigned changeToUnreachable(Instruction *I, bool UseLLVMTrap,
|
unsigned changeToUnreachable(Instruction *I, bool PreserveLCSSA = false,
|
||||||
bool PreserveLCSSA = false,
|
|
||||||
DomTreeUpdater *DTU = nullptr,
|
DomTreeUpdater *DTU = nullptr,
|
||||||
MemorySSAUpdater *MSSAU = nullptr);
|
MemorySSAUpdater *MSSAU = nullptr);
|
||||||
|
|
||||||
|
@ -984,9 +984,9 @@ void WinEHPrepare::removeImplausibleInstructions(Function &F) {
|
|||||||
BasicBlock::iterator CallI =
|
BasicBlock::iterator CallI =
|
||||||
std::prev(BB->getTerminator()->getIterator());
|
std::prev(BB->getTerminator()->getIterator());
|
||||||
auto *CI = cast<CallInst>(&*CallI);
|
auto *CI = cast<CallInst>(&*CallI);
|
||||||
changeToUnreachable(CI, /*UseLLVMTrap=*/false);
|
changeToUnreachable(CI);
|
||||||
} else {
|
} else {
|
||||||
changeToUnreachable(&I, /*UseLLVMTrap=*/false);
|
changeToUnreachable(&I);
|
||||||
}
|
}
|
||||||
|
|
||||||
// There are no more instructions in the block (except for unreachable),
|
// There are no more instructions in the block (except for unreachable),
|
||||||
@ -1007,7 +1007,7 @@ void WinEHPrepare::removeImplausibleInstructions(Function &F) {
|
|||||||
IsUnreachableCleanupret = CRI->getCleanupPad() != CleanupPad;
|
IsUnreachableCleanupret = CRI->getCleanupPad() != CleanupPad;
|
||||||
if (IsUnreachableRet || IsUnreachableCatchret ||
|
if (IsUnreachableRet || IsUnreachableCatchret ||
|
||||||
IsUnreachableCleanupret) {
|
IsUnreachableCleanupret) {
|
||||||
changeToUnreachable(TI, /*UseLLVMTrap=*/false);
|
changeToUnreachable(TI);
|
||||||
} else if (isa<InvokeInst>(TI)) {
|
} else if (isa<InvokeInst>(TI)) {
|
||||||
if (Personality == EHPersonality::MSVC_CXX && CleanupPad) {
|
if (Personality == EHPersonality::MSVC_CXX && CleanupPad) {
|
||||||
// Invokes within a cleanuppad for the MSVC++ personality never
|
// Invokes within a cleanuppad for the MSVC++ personality never
|
||||||
|
@ -955,7 +955,7 @@ void CoroCloner::create() {
|
|||||||
case coro::ABI::RetconOnce:
|
case coro::ABI::RetconOnce:
|
||||||
// Remove old returns.
|
// Remove old returns.
|
||||||
for (ReturnInst *Return : Returns)
|
for (ReturnInst *Return : Returns)
|
||||||
changeToUnreachable(Return, /*UseLLVMTrap=*/false);
|
changeToUnreachable(Return);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// With multi-suspend continuations, we'll already have eliminated the
|
// With multi-suspend continuations, we'll already have eliminated the
|
||||||
|
@ -361,7 +361,7 @@ void coro::Shape::buildFrom(Function &F) {
|
|||||||
|
|
||||||
// Replace all coro.ends with unreachable instruction.
|
// Replace all coro.ends with unreachable instruction.
|
||||||
for (AnyCoroEndInst *CE : CoroEnds)
|
for (AnyCoroEndInst *CE : CoroEnds)
|
||||||
changeToUnreachable(CE, /*UseLLVMTrap=*/false);
|
changeToUnreachable(CE);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1705,7 +1705,7 @@ ChangeStatus Attributor::cleanupIR() {
|
|||||||
if (!isRunOn(*I->getFunction()))
|
if (!isRunOn(*I->getFunction()))
|
||||||
continue;
|
continue;
|
||||||
CGModifiedFunctions.insert(I->getFunction());
|
CGModifiedFunctions.insert(I->getFunction());
|
||||||
changeToUnreachable(I, /* UseLLVMTrap */ false);
|
changeToUnreachable(I);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &V : ToBeDeletedInsts) {
|
for (auto &V : ToBeDeletedInsts) {
|
||||||
|
@ -251,7 +251,7 @@ static void DeleteBasicBlock(BasicBlock *BB, CallGraphUpdater &CGU) {
|
|||||||
|
|
||||||
if (TokenInst) {
|
if (TokenInst) {
|
||||||
if (!TokenInst->isTerminator())
|
if (!TokenInst->isTerminator())
|
||||||
changeToUnreachable(TokenInst->getNextNode(), /*UseLLVMTrap=*/false);
|
changeToUnreachable(TokenInst->getNextNode());
|
||||||
} else {
|
} else {
|
||||||
// Get the list of successors of this block.
|
// Get the list of successors of this block.
|
||||||
std::vector<BasicBlock *> Succs(succ_begin(BB), succ_end(BB));
|
std::vector<BasicBlock *> Succs(succ_begin(BB), succ_end(BB));
|
||||||
|
@ -526,13 +526,11 @@ bool llvm::runIPSCCP(
|
|||||||
// nodes in executable blocks we found values for. The function's entry
|
// nodes in executable blocks we found values for. The function's entry
|
||||||
// block is not part of BlocksToErase, so we have to handle it separately.
|
// block is not part of BlocksToErase, so we have to handle it separately.
|
||||||
for (BasicBlock *BB : BlocksToErase) {
|
for (BasicBlock *BB : BlocksToErase) {
|
||||||
NumInstRemoved +=
|
NumInstRemoved += changeToUnreachable(BB->getFirstNonPHI(),
|
||||||
changeToUnreachable(BB->getFirstNonPHI(), /*UseLLVMTrap=*/false,
|
/*PreserveLCSSA=*/false, &DTU);
|
||||||
/*PreserveLCSSA=*/false, &DTU);
|
|
||||||
}
|
}
|
||||||
if (!Solver.isBlockExecutable(&F.front()))
|
if (!Solver.isBlockExecutable(&F.front()))
|
||||||
NumInstRemoved += changeToUnreachable(F.front().getFirstNonPHI(),
|
NumInstRemoved += changeToUnreachable(F.front().getFirstNonPHI(),
|
||||||
/*UseLLVMTrap=*/false,
|
|
||||||
/*PreserveLCSSA=*/false, &DTU);
|
/*PreserveLCSSA=*/false, &DTU);
|
||||||
|
|
||||||
for (BasicBlock &BB : F)
|
for (BasicBlock &BB : F)
|
||||||
|
@ -2327,7 +2327,7 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
|
|||||||
// As such, we replace the cleanupret with unreachable.
|
// As such, we replace the cleanupret with unreachable.
|
||||||
if (auto *CleanupRet = dyn_cast<CleanupReturnInst>(BB->getTerminator()))
|
if (auto *CleanupRet = dyn_cast<CleanupReturnInst>(BB->getTerminator()))
|
||||||
if (CleanupRet->unwindsToCaller() && EHPadForCallUnwindsLocally)
|
if (CleanupRet->unwindsToCaller() && EHPadForCallUnwindsLocally)
|
||||||
changeToUnreachable(CleanupRet, /*UseLLVMTrap=*/false);
|
changeToUnreachable(CleanupRet);
|
||||||
|
|
||||||
Instruction *I = BB->getFirstNonPHI();
|
Instruction *I = BB->getFirstNonPHI();
|
||||||
if (!I->isEHPad())
|
if (!I->isEHPad())
|
||||||
|
@ -2110,8 +2110,8 @@ llvm::removeAllNonTerminatorAndEHPadInstructions(BasicBlock *BB) {
|
|||||||
return {NumDeadInst, NumDeadDbgInst};
|
return {NumDeadInst, NumDeadDbgInst};
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned llvm::changeToUnreachable(Instruction *I, bool UseLLVMTrap,
|
unsigned llvm::changeToUnreachable(Instruction *I, bool PreserveLCSSA,
|
||||||
bool PreserveLCSSA, DomTreeUpdater *DTU,
|
DomTreeUpdater *DTU,
|
||||||
MemorySSAUpdater *MSSAU) {
|
MemorySSAUpdater *MSSAU) {
|
||||||
BasicBlock *BB = I->getParent();
|
BasicBlock *BB = I->getParent();
|
||||||
|
|
||||||
@ -2127,14 +2127,6 @@ unsigned llvm::changeToUnreachable(Instruction *I, bool UseLLVMTrap,
|
|||||||
if (DTU)
|
if (DTU)
|
||||||
UniqueSuccessors.insert(Successor);
|
UniqueSuccessors.insert(Successor);
|
||||||
}
|
}
|
||||||
// Insert a call to llvm.trap right before this. This turns the undefined
|
|
||||||
// behavior into a hard fail instead of falling through into random code.
|
|
||||||
if (UseLLVMTrap) {
|
|
||||||
Function *TrapFn =
|
|
||||||
Intrinsic::getDeclaration(BB->getParent()->getParent(), Intrinsic::trap);
|
|
||||||
CallInst *CallTrap = CallInst::Create(TrapFn, "", I);
|
|
||||||
CallTrap->setDebugLoc(I->getDebugLoc());
|
|
||||||
}
|
|
||||||
auto *UI = new UnreachableInst(I->getContext(), I);
|
auto *UI = new UnreachableInst(I->getContext(), I);
|
||||||
UI->setDebugLoc(I->getDebugLoc());
|
UI->setDebugLoc(I->getDebugLoc());
|
||||||
|
|
||||||
@ -2271,7 +2263,7 @@ static bool markAliveBlocks(Function &F,
|
|||||||
if (IntrinsicID == Intrinsic::assume) {
|
if (IntrinsicID == Intrinsic::assume) {
|
||||||
if (match(CI->getArgOperand(0), m_CombineOr(m_Zero(), m_Undef()))) {
|
if (match(CI->getArgOperand(0), m_CombineOr(m_Zero(), m_Undef()))) {
|
||||||
// Don't insert a call to llvm.trap right before the unreachable.
|
// Don't insert a call to llvm.trap right before the unreachable.
|
||||||
changeToUnreachable(CI, false, false, DTU);
|
changeToUnreachable(CI, false, DTU);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2287,8 +2279,7 @@ static bool markAliveBlocks(Function &F,
|
|||||||
// still be useful for widening.
|
// still be useful for widening.
|
||||||
if (match(CI->getArgOperand(0), m_Zero()))
|
if (match(CI->getArgOperand(0), m_Zero()))
|
||||||
if (!isa<UnreachableInst>(CI->getNextNode())) {
|
if (!isa<UnreachableInst>(CI->getNextNode())) {
|
||||||
changeToUnreachable(CI->getNextNode(), /*UseLLVMTrap=*/false,
|
changeToUnreachable(CI->getNextNode(), false, DTU);
|
||||||
false, DTU);
|
|
||||||
Changed = true;
|
Changed = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2296,7 +2287,7 @@ static bool markAliveBlocks(Function &F,
|
|||||||
} else if ((isa<ConstantPointerNull>(Callee) &&
|
} else if ((isa<ConstantPointerNull>(Callee) &&
|
||||||
!NullPointerIsDefined(CI->getFunction())) ||
|
!NullPointerIsDefined(CI->getFunction())) ||
|
||||||
isa<UndefValue>(Callee)) {
|
isa<UndefValue>(Callee)) {
|
||||||
changeToUnreachable(CI, /*UseLLVMTrap=*/false, false, DTU);
|
changeToUnreachable(CI, false, DTU);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2306,7 +2297,7 @@ static bool markAliveBlocks(Function &F,
|
|||||||
// though.
|
// though.
|
||||||
if (!isa<UnreachableInst>(CI->getNextNode())) {
|
if (!isa<UnreachableInst>(CI->getNextNode())) {
|
||||||
// Don't insert a call to llvm.trap right before the unreachable.
|
// Don't insert a call to llvm.trap right before the unreachable.
|
||||||
changeToUnreachable(CI->getNextNode(), false, false, DTU);
|
changeToUnreachable(CI->getNextNode(), false, DTU);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2325,7 +2316,7 @@ static bool markAliveBlocks(Function &F,
|
|||||||
(isa<ConstantPointerNull>(Ptr) &&
|
(isa<ConstantPointerNull>(Ptr) &&
|
||||||
!NullPointerIsDefined(SI->getFunction(),
|
!NullPointerIsDefined(SI->getFunction(),
|
||||||
SI->getPointerAddressSpace()))) {
|
SI->getPointerAddressSpace()))) {
|
||||||
changeToUnreachable(SI, true, false, DTU);
|
changeToUnreachable(SI, false, DTU);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2339,7 +2330,7 @@ static bool markAliveBlocks(Function &F,
|
|||||||
if ((isa<ConstantPointerNull>(Callee) &&
|
if ((isa<ConstantPointerNull>(Callee) &&
|
||||||
!NullPointerIsDefined(BB->getParent())) ||
|
!NullPointerIsDefined(BB->getParent())) ||
|
||||||
isa<UndefValue>(Callee)) {
|
isa<UndefValue>(Callee)) {
|
||||||
changeToUnreachable(II, true, false, DTU);
|
changeToUnreachable(II, false, DTU);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
} else if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(&F)) {
|
} else if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(&F)) {
|
||||||
if (II->use_empty() && II->onlyReadsMemory()) {
|
if (II->use_empty() && II->onlyReadsMemory()) {
|
||||||
|
@ -513,7 +513,7 @@ ReprocessLoop:
|
|||||||
|
|
||||||
// Zap the dead pred's terminator and replace it with unreachable.
|
// Zap the dead pred's terminator and replace it with unreachable.
|
||||||
Instruction *TI = P->getTerminator();
|
Instruction *TI = P->getTerminator();
|
||||||
changeToUnreachable(TI, /*UseLLVMTrap=*/false, PreserveLCSSA,
|
changeToUnreachable(TI, PreserveLCSSA,
|
||||||
/*DTU=*/nullptr, MSSAU);
|
/*DTU=*/nullptr, MSSAU);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
|
@ -739,8 +739,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
|
|||||||
|
|
||||||
// When completely unrolling, the last latch becomes unreachable.
|
// When completely unrolling, the last latch becomes unreachable.
|
||||||
if (!LatchIsExiting && CompletelyUnroll)
|
if (!LatchIsExiting && CompletelyUnroll)
|
||||||
changeToUnreachable(Latches.back()->getTerminator(), /* UseTrap */ false,
|
changeToUnreachable(Latches.back()->getTerminator(), PreserveLCSSA, &DTU);
|
||||||
PreserveLCSSA, &DTU);
|
|
||||||
|
|
||||||
// Merge adjacent basic blocks, if possible.
|
// Merge adjacent basic blocks, if possible.
|
||||||
for (BasicBlock *Latch : Latches) {
|
for (BasicBlock *Latch : Latches) {
|
||||||
|
@ -723,8 +723,8 @@ void llvm::breakLoopBackedge(Loop *L, DominatorTree &DT, ScalarEvolution &SE,
|
|||||||
auto *BackedgeBB = SplitEdge(Latch, Header, &DT, &LI, MSSAU.get());
|
auto *BackedgeBB = SplitEdge(Latch, Header, &DT, &LI, MSSAU.get());
|
||||||
|
|
||||||
DomTreeUpdater DTU(&DT, DomTreeUpdater::UpdateStrategy::Eager);
|
DomTreeUpdater DTU(&DT, DomTreeUpdater::UpdateStrategy::Eager);
|
||||||
(void)changeToUnreachable(BackedgeBB->getTerminator(), /*UseTrap*/false,
|
(void)changeToUnreachable(BackedgeBB->getTerminator(),
|
||||||
/*PreserveLCSSA*/true, &DTU, MSSAU.get());
|
/*PreserveLCSSA*/ true, &DTU, MSSAU.get());
|
||||||
|
|
||||||
// Erase (and destroy) this loop instance. Handles relinking sub-loops
|
// Erase (and destroy) this loop instance. Handles relinking sub-loops
|
||||||
// and blocks within the loop as needed.
|
// and blocks within the loop as needed.
|
||||||
|
@ -731,11 +731,6 @@ define i16 @vmullWithInconsistentExtensions(<8 x i8> %vec) {
|
|||||||
define void @vmull_buildvector() nounwind optsize ssp align 2 {
|
define void @vmull_buildvector() nounwind optsize ssp align 2 {
|
||||||
; CHECK-LABEL: vmull_buildvector:
|
; CHECK-LABEL: vmull_buildvector:
|
||||||
; CHECK: @ %bb.0: @ %entry
|
; CHECK: @ %bb.0: @ %entry
|
||||||
; CHECK-NEXT: mov r0, #0
|
|
||||||
; CHECK-NEXT: cmp r0, #0
|
|
||||||
; CHECK-NEXT: bxne lr
|
|
||||||
; CHECK-NEXT: .LBB55_1: @ %for.body33.lr.ph
|
|
||||||
; CHECK-NEXT: .inst 0xe7ffdefe
|
|
||||||
entry:
|
entry:
|
||||||
br i1 undef, label %for.end179, label %for.body.lr.ph
|
br i1 undef, label %for.end179, label %for.body.lr.ph
|
||||||
|
|
||||||
@ -812,7 +807,6 @@ declare <8 x i8> @llvm.arm.neon.vqmovnu.v8i8(<8 x i16>) nounwind readnone
|
|||||||
define void @no_illegal_types_vmull_sext(<4 x i32> %a) {
|
define void @no_illegal_types_vmull_sext(<4 x i32> %a) {
|
||||||
; CHECK-LABEL: no_illegal_types_vmull_sext:
|
; CHECK-LABEL: no_illegal_types_vmull_sext:
|
||||||
; CHECK: @ %bb.0: @ %entry
|
; CHECK: @ %bb.0: @ %entry
|
||||||
; CHECK-NEXT: .inst 0xe7ffdefe
|
|
||||||
entry:
|
entry:
|
||||||
%wide.load283.i = load <4 x i8>, <4 x i8>* undef, align 1
|
%wide.load283.i = load <4 x i8>, <4 x i8>* undef, align 1
|
||||||
%0 = sext <4 x i8> %wide.load283.i to <4 x i32>
|
%0 = sext <4 x i8> %wide.load283.i to <4 x i32>
|
||||||
@ -825,7 +819,6 @@ entry:
|
|||||||
define void @no_illegal_types_vmull_zext(<4 x i32> %a) {
|
define void @no_illegal_types_vmull_zext(<4 x i32> %a) {
|
||||||
; CHECK-LABEL: no_illegal_types_vmull_zext:
|
; CHECK-LABEL: no_illegal_types_vmull_zext:
|
||||||
; CHECK: @ %bb.0: @ %entry
|
; CHECK: @ %bb.0: @ %entry
|
||||||
; CHECK-NEXT: .inst 0xe7ffdefe
|
|
||||||
entry:
|
entry:
|
||||||
%wide.load283.i = load <4 x i8>, <4 x i8>* undef, align 1
|
%wide.load283.i = load <4 x i8>, <4 x i8>* undef, align 1
|
||||||
%0 = zext <4 x i8> %wide.load283.i to <4 x i32>
|
%0 = zext <4 x i8> %wide.load283.i to <4 x i32>
|
||||||
|
@ -3,6 +3,12 @@
|
|||||||
; RUN: llc -march=hexagon -mcpu=hexagonv65 -O3 -debug-only=pipeliner \
|
; RUN: llc -march=hexagon -mcpu=hexagonv65 -O3 -debug-only=pipeliner \
|
||||||
; RUN: < %s 2>&1 -pipeliner-experimental-cg=true | FileCheck %s
|
; RUN: < %s 2>&1 -pipeliner-experimental-cg=true | FileCheck %s
|
||||||
|
|
||||||
|
; As part of https://reviews.llvm.org/D106308 this test broke.
|
||||||
|
; It is not surprising as the tts is full of UB and run with O3.
|
||||||
|
; FIXME: It is unclear what to do with this test now, replacing null/undef
|
||||||
|
; with pointer arguments could be a way to go.
|
||||||
|
; XFAIL: *
|
||||||
|
|
||||||
; Test that the artificial dependences are ignored while computing the
|
; Test that the artificial dependences are ignored while computing the
|
||||||
; circuits.
|
; circuits.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
; RUN: llc -O2 -o - %s | FileCheck %s
|
; RUN: llc -O2 -arm-atomic-cfg-tidy=0 -o - %s | FileCheck %s
|
||||||
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||||
target triple = "thumbv8-unknown-linux-gnueabihf"
|
target triple = "thumbv8-unknown-linux-gnueabihf"
|
||||||
|
|
||||||
|
@ -13,7 +13,6 @@ declare i32 @fn()
|
|||||||
define i8* @f1() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
define i8* @f1() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||||
; CHECK-LABEL: @f1(
|
; CHECK-LABEL: @f1(
|
||||||
; CHECK-NEXT: entry:
|
; CHECK-NEXT: entry:
|
||||||
; CHECK-NEXT: call void @llvm.trap()
|
|
||||||
; CHECK-NEXT: unreachable
|
; CHECK-NEXT: unreachable
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
@ -34,7 +33,6 @@ lpad:
|
|||||||
define i8* @f2() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
define i8* @f2() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||||
; CHECK-LABEL: @f2(
|
; CHECK-LABEL: @f2(
|
||||||
; CHECK-NEXT: entry:
|
; CHECK-NEXT: entry:
|
||||||
; CHECK-NEXT: call void @llvm.trap()
|
|
||||||
; CHECK-NEXT: unreachable
|
; CHECK-NEXT: unreachable
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
@ -63,7 +61,7 @@ define i8* @f2_no_null_opt() nounwind uwtable ssp #0 personality i8* bitcast (i3
|
|||||||
; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 }
|
; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 }
|
||||||
; CHECK-NEXT: filter [0 x i8*] zeroinitializer
|
; CHECK-NEXT: filter [0 x i8*] zeroinitializer
|
||||||
; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i8*, i32 } [[TMP0]], 0
|
; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i8*, i32 } [[TMP0]], 0
|
||||||
; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[TMP1]]) #[[ATTR6:[0-9]+]]
|
; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[TMP1]]) #[[ATTR5:[0-9]+]]
|
||||||
; CHECK-NEXT: unreachable
|
; CHECK-NEXT: unreachable
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
@ -138,7 +136,7 @@ define i32 @f5(i1 %cond, i8* %a, i8* %b) personality i8* bitcast (i32 (...)* @__
|
|||||||
; CHECK: lpad:
|
; CHECK: lpad:
|
||||||
; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 }
|
; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 }
|
||||||
; CHECK-NEXT: filter [0 x i8*] zeroinitializer
|
; CHECK-NEXT: filter [0 x i8*] zeroinitializer
|
||||||
; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[A:%.*]]) #[[ATTR6]]
|
; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[A:%.*]]) #[[ATTR5]]
|
||||||
; CHECK-NEXT: unreachable
|
; CHECK-NEXT: unreachable
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
; RUN: opt -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s
|
; RUN: opt -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s
|
||||||
; Radar 9342286
|
; Radar 9342286
|
||||||
; Assign DebugLoc to trap instruction.
|
; Assign DebugLoc to unreachable instruction.
|
||||||
define void @foo() nounwind ssp !dbg !0 {
|
define void @foo() nounwind ssp !dbg !0 {
|
||||||
; CHECK: call void @llvm.trap(), !dbg
|
; CHECK: unreachable, !dbg
|
||||||
store i32 42, i32* null, !dbg !5
|
store i32 42, i32* null, !dbg !5
|
||||||
ret void, !dbg !7
|
ret void, !dbg !7
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,6 @@ return: ; preds = %entry
|
|||||||
define void @test2() nounwind {
|
define void @test2() nounwind {
|
||||||
; CHECK-LABEL: @test2(
|
; CHECK-LABEL: @test2(
|
||||||
; CHECK-NEXT: entry:
|
; CHECK-NEXT: entry:
|
||||||
; CHECK-NEXT: call void @llvm.trap()
|
|
||||||
; CHECK-NEXT: unreachable
|
; CHECK-NEXT: unreachable
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
|
@ -623,7 +623,7 @@ TEST(Local, ChangeToUnreachable) {
|
|||||||
|
|
||||||
ASSERT_TRUE(isa<ReturnInst>(&A));
|
ASSERT_TRUE(isa<ReturnInst>(&A));
|
||||||
// One instruction should be affected.
|
// One instruction should be affected.
|
||||||
EXPECT_EQ(changeToUnreachable(&A, /*UseLLVMTrap*/false), 1U);
|
EXPECT_EQ(changeToUnreachable(&A), 1U);
|
||||||
|
|
||||||
Instruction &B = BB.front();
|
Instruction &B = BB.front();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user