[llvm] b2df007 - [FastISel] Support unreachable with NoTrapAfterNoReturn (#118296)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 3 03:54:30 PST 2024
Author: Nikita Popov
Date: 2024-12-03T12:54:26+01:00
New Revision: b2df0074134add80ba3a483a479601b00a9f9fc7
URL: https://github.com/llvm/llvm-project/commit/b2df0074134add80ba3a483a479601b00a9f9fc7
DIFF: https://github.com/llvm/llvm-project/commit/b2df0074134add80ba3a483a479601b00a9f9fc7.diff
LOG: [FastISel] Support unreachable with NoTrapAfterNoReturn (#118296)
Currently FastISel triggers a fallback if there is an unreachable
terminator and the TrapUnreachable option is enabled (the ISD::TRAP
selection does not actually work).
Add handling for NoTrapAfterNoReturn, in which case we don't actually
need to emit a trap. The test is just there to make sure there is no
FastISel fallback (which is why I'm not testing the case without
noreturn). We have other tests that check the actual unreachable codegen
variations.
Added:
llvm/test/CodeGen/X86/no-trap-after-noreturn-fastisel.ll
Modified:
llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
index eede879e7e80d1..d5551758c073e9 100644
--- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
@@ -1851,11 +1851,19 @@ bool FastISel::selectOperator(const User *I, unsigned Opcode) {
return false;
}
- case Instruction::Unreachable:
- if (TM.Options.TrapUnreachable)
+ case Instruction::Unreachable: {
+ if (TM.Options.TrapUnreachable) {
+ if (TM.Options.NoTrapAfterNoreturn) {
+ const auto *Call =
+ dyn_cast_or_null<CallInst>(cast<Instruction>(I)->getPrevNode());
+ if (Call && Call->doesNotReturn())
+ return true;
+ }
+
return fastEmit_(MVT::Other, MVT::Other, ISD::TRAP) != 0;
- else
- return true;
+ }
+ return true;
+ }
case Instruction::Alloca:
// FunctionLowering has the static-sized case covered.
diff --git a/llvm/test/CodeGen/X86/no-trap-after-noreturn-fastisel.ll b/llvm/test/CodeGen/X86/no-trap-after-noreturn-fastisel.ll
new file mode 100644
index 00000000000000..5149209f79d156
--- /dev/null
+++ b/llvm/test/CodeGen/X86/no-trap-after-noreturn-fastisel.ll
@@ -0,0 +1,13 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -O0 -trap-unreachable -no-trap-after-noreturn -fast-isel-abort=3 < %s | FileCheck %s
+
+declare void @foo()
+
+define void @noreturn_unreachable() nounwind {
+; CHECK-LABEL: noreturn_unreachable:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: callq foo at PLT
+ call void @foo() noreturn
+ unreachable
+}
More information about the llvm-commits
mailing list