[llvm] [CodeGen] Fix lower constant intrinsics for dead code (PR #102442)

Alexis Engelke via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 8 02:20:51 PDT 2024


https://github.com/aengelke created https://github.com/llvm/llvm-project/pull/102442

lowerConstantIntrinsics does an RPO traveral, which doesn't reach dead blocks. Remove the assertion that all intrinsics are lowered, because some intrinsics might remain.

>From 634021ad45c76fd99ab216e183b115ae7487c860 Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Thu, 8 Aug 2024 09:13:51 +0000
Subject: [PATCH] [CodeGen] Fix lower constant intrinsics for dead code

lowerConstantIntrinsics does an RPO traveral, which doesn't reach dead
blocks. Remove the assertion that all intrinsics are lowered, because
some intrinsics might remain.
---
 llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp |  2 +-
 .../constant-intrinscs-dead-code.ll           | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/Transforms/PreISelIntrinsicLowering/constant-intrinscs-dead-code.ll

diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
index 0d3dd650b8ee6..0df90f402aaf4 100644
--- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
+++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
@@ -349,8 +349,8 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const {
       Changed |= forEachCall(F, [&](CallInst *CI) {
         Function *Parent = CI->getParent()->getParent();
         TargetLibraryInfo &TLI = LookupTLI(*Parent);
+        // Intrinsics in unreachable code are not lowered.
         bool Changed = lowerConstantIntrinsics(*Parent, TLI, /*DT=*/nullptr);
-        assert(Changed && "lowerConstantIntrinsics did not lower intrinsic");
         return Changed;
       });
       break;
diff --git a/llvm/test/Transforms/PreISelIntrinsicLowering/constant-intrinscs-dead-code.ll b/llvm/test/Transforms/PreISelIntrinsicLowering/constant-intrinscs-dead-code.ll
new file mode 100644
index 0000000000000..35de92372cb9f
--- /dev/null
+++ b/llvm/test/Transforms/PreISelIntrinsicLowering/constant-intrinscs-dead-code.ll
@@ -0,0 +1,31 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -S < %s -passes=pre-isel-intrinsic-lowering | FileCheck %s
+
+define void @test_dead() {
+; CHECK-LABEL: define void @test_dead() {
+; CHECK-NEXT:    ret void
+; CHECK:       [[DEAD:.*]]:
+; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.objectsize.i32.p21(ptr addrspace(21) null, i1 false, i1 false, i1 false)
+; CHECK-NEXT:    br label %[[DEAD]]
+;
+  ret void
+
+dead:
+  %x = call i32 @llvm.objectsize.i32.p21(ptr addrspace(21) null, i1 false, i1 false, i1 false)
+  br label %dead
+}
+
+define i32 @test_two() {
+; CHECK-LABEL: define i32 @test_two() {
+; CHECK-NEXT:    ret i32 -1
+; CHECK:       [[DEAD:.*]]:
+; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.objectsize.i32.p21(ptr addrspace(21) null, i1 false, i1 false, i1 false)
+; CHECK-NEXT:    br label %[[DEAD]]
+;
+  %a = call i32 @llvm.objectsize.i32.p21(ptr addrspace(21) null, i1 false, i1 false, i1 false)
+  ret i32 %a
+
+dead:
+  %x = call i32 @llvm.objectsize.i32.p21(ptr addrspace(21) null, i1 false, i1 false, i1 false)
+  br label %dead
+}



More information about the llvm-commits mailing list