Skip to content

Commit 1ef7379

Browse files
committed
Implement the logic in NVPTXLowerUnreachablePass instead.
1 parent 76f722a commit 1ef7379

File tree

6 files changed

+52
-22
lines changed

6 files changed

+52
-22
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3226,14 +3226,9 @@ void SelectionDAGBuilder::visitUnreachable(const UnreachableInst &I) {
32263226

32273227
// We may be able to ignore unreachable behind a noreturn call.
32283228
if (DAG.getTarget().Options.NoTrapAfterNoreturn) {
3229-
const BasicBlock &BB = *I.getParent();
3230-
if (&I != &BB.front()) {
3231-
BasicBlock::const_iterator PredI =
3232-
std::prev(BasicBlock::const_iterator(&I));
3233-
if (const CallInst *Call = dyn_cast<CallInst>(&*PredI)) {
3229+
if (const CallInst *Call = dyn_cast_or_null<CallInst>(I.getPrevNode())) {
32343230
if (Call->doesNotReturn())
32353231
return;
3236-
}
32373232
}
32383233
}
32393234

llvm/lib/Target/NVPTX/NVPTX.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ MachineFunctionPass *createNVPTXReplaceImageHandlesPass();
4747
FunctionPass *createNVPTXImageOptimizerPass();
4848
FunctionPass *createNVPTXLowerArgsPass();
4949
FunctionPass *createNVPTXLowerAllocaPass();
50-
FunctionPass *createNVPTXLowerUnreachablePass();
50+
FunctionPass *createNVPTXLowerUnreachablePass(bool TrapUnreachable,
51+
bool NoTrapAfterNoreturn);
5152
MachineFunctionPass *createNVPTXPeephole();
5253
MachineFunctionPass *createNVPTXProxyRegErasurePass();
5354

llvm/lib/Target/NVPTX/NVPTXInstrInfo.td

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,9 +3545,7 @@ def Callseq_End :
35453545
[(callseq_end timm:$amt1, timm:$amt2)]>;
35463546

35473547
// trap instruction
3548-
// Emit an `exit` as well to convey to ptxas that `trap` exits the CFG.
3549-
// This won't be necessary in a future version of ptxas.
3550-
def trapinst : NVPTXInst<(outs), (ins), "trap; exit;", [(trap)]>;
3548+
def trapinst : NVPTXInst<(outs), (ins), "trap;", [(trap)]>;
35513549

35523550
// Call prototype wrapper
35533551
def SDTCallPrototype : SDTypeProfile<0, 1, [SDTCisInt<0>]>;

llvm/lib/Target/NVPTX/NVPTXLowerUnreachable.cpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
#include "llvm/IR/Function.h"
7373
#include "llvm/IR/InlineAsm.h"
7474
#include "llvm/IR/Instructions.h"
75+
#include "llvm/IR/Intrinsics.h"
7576
#include "llvm/IR/Type.h"
7677
#include "llvm/Pass.h"
7778

@@ -83,14 +84,19 @@ void initializeNVPTXLowerUnreachablePass(PassRegistry &);
8384

8485
namespace {
8586
class NVPTXLowerUnreachable : public FunctionPass {
87+
StringRef getPassName() const override;
8688
bool runOnFunction(Function &F) override;
89+
bool shouldEmitTrap(const UnreachableInst &I) const;
8790

8891
public:
8992
static char ID; // Pass identification, replacement for typeid
90-
NVPTXLowerUnreachable() : FunctionPass(ID) {}
91-
StringRef getPassName() const override {
92-
return "add an exit instruction before every unreachable";
93-
}
93+
NVPTXLowerUnreachable(bool TrapUnreachable, bool NoTrapAfterNoreturn)
94+
: FunctionPass(ID), TrapUnreachable(TrapUnreachable),
95+
NoTrapAfterNoreturn(NoTrapAfterNoreturn) {}
96+
97+
private:
98+
bool TrapUnreachable;
99+
bool NoTrapAfterNoreturn;
94100
};
95101
} // namespace
96102

@@ -99,6 +105,24 @@ char NVPTXLowerUnreachable::ID = 1;
99105
INITIALIZE_PASS(NVPTXLowerUnreachable, "nvptx-lower-unreachable",
100106
"Lower Unreachable", false, false)
101107

108+
StringRef NVPTXLowerUnreachable::getPassName() const {
109+
return "add an exit instruction before every unreachable";
110+
}
111+
112+
// =============================================================================
113+
// Returns whether a `trap` intrinsic should be emitted before I.
114+
//
115+
// This is a copy of the logic in SelectionDAGBuilder::visitUnreachable().
116+
// =============================================================================
117+
bool NVPTXLowerUnreachable::shouldEmitTrap(const UnreachableInst &I) const {
118+
if (!TrapUnreachable)
119+
return false;
120+
if (!NoTrapAfterNoreturn)
121+
return true;
122+
const CallInst *Call = dyn_cast_or_null<CallInst>(I.getPrevNode());
123+
return Call && Call->doesNotReturn();
124+
}
125+
102126
// =============================================================================
103127
// Main function for this pass.
104128
// =============================================================================
@@ -109,18 +133,25 @@ bool NVPTXLowerUnreachable::runOnFunction(Function &F) {
109133
LLVMContext &C = F.getContext();
110134
FunctionType *ExitFTy = FunctionType::get(Type::getVoidTy(C), false);
111135
InlineAsm *Exit = InlineAsm::get(ExitFTy, "exit;", "", true);
136+
Function *Trap = nullptr;
112137

113138
bool Changed = false;
114139
for (auto &BB : F)
115140
for (auto &I : BB) {
116141
if (auto unreachableInst = dyn_cast<UnreachableInst>(&I)) {
117-
Changed = true;
142+
if (shouldEmitTrap(*unreachableInst)) {
143+
if (!Trap)
144+
Trap = Intrinsic::getDeclaration(F.getParent(), Intrinsic::trap);
145+
CallInst::Create(Trap, "", unreachableInst);
146+
}
118147
CallInst::Create(ExitFTy, Exit, "", unreachableInst);
148+
Changed = true;
119149
}
120150
}
121151
return Changed;
122152
}
123153

124-
FunctionPass *llvm::createNVPTXLowerUnreachablePass() {
125-
return new NVPTXLowerUnreachable();
154+
FunctionPass *llvm::createNVPTXLowerUnreachablePass(bool TrapUnreachable,
155+
bool NoTrapAfterNoreturn) {
156+
return new NVPTXLowerUnreachable(TrapUnreachable, NoTrapAfterNoreturn);
126157
}

llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,9 @@ void NVPTXPassConfig::addIRPasses() {
403403
addPass(createSROAPass());
404404
}
405405

406-
const auto &options = getNVPTXTargetMachine().Options;
407-
if (!options.TrapUnreachable || options.NoTrapAfterNoreturn)
408-
addPass(createNVPTXLowerUnreachablePass());
406+
const auto &Options = getNVPTXTargetMachine().Options;
407+
addPass(createNVPTXLowerUnreachablePass(Options.TrapUnreachable,
408+
Options.NoTrapAfterNoreturn));
409409
}
410410

411411
bool NVPTXPassConfig::addInstSelector() {

llvm/test/CodeGen/NVPTX/unreachable.ll

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs | FileCheck %s
2-
; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -verify-machineinstrs | FileCheck %s
1+
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs \
2+
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOTRAP
3+
; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -verify-machineinstrs \
4+
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOTRAP
5+
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs -trap-unreachable \
6+
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-TRAP
37
; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -verify-machineinstrs -trap-unreachable \
48
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-TRAP
59
; RUN: %if ptxas && !ptxas-12.0 %{ llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs | %ptxas-verify %}
@@ -15,6 +19,7 @@ define void @kernel_func() {
1519
call void @throw()
1620
; CHECK-TRAP-NOT: exit;
1721
; CHECK-TRAP: trap;
22+
; CHECK-NOTRAP-NOT: trap;
1823
; CHECK: exit;
1924
unreachable
2025
}

0 commit comments

Comments
 (0)