[llvm] [AutoUpgrade] Prevent deletion of call if uses still exist (PR #177606)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 23 08:00:20 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Kshitij Paranjape (kshitijvp)
<details>
<summary>Changes</summary>
The calls to the llvm.x86.sse2.pshuflw are being
deleted due to invalid vector type, even though
uses still exist. Adding checks to prevent deletion of call when uses still exist or even if eraseFromParent() is called ensuring it is called after replaceAllUsesWith().
Fixes: #<!-- -->176674
---
Full diff: https://github.com/llvm/llvm-project/pull/177606.diff
2 Files Affected:
- (modified) llvm/lib/IR/AutoUpgrade.cpp (+4-3)
- (added) llvm/test/Verifier/issue176674.ll (+13)
``````````diff
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 562114c355f9e..64d0b339009cb 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -4944,9 +4944,10 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
llvm_unreachable("Unknown function for CallBase upgrade.");
}
- if (Rep)
+ if (Rep) {
CI->replaceAllUsesWith(Rep);
- CI->eraseFromParent();
+ CI->eraseFromParent();
+ }
return;
}
@@ -5668,7 +5669,7 @@ void llvm::UpgradeCallsToIntrinsic(Function *F) {
UpgradeIntrinsicCall(CB, NewFn);
// Remove old function, no longer used, from the module.
- if (F != NewFn)
+ if (NewFn != nullptr && F != NewFn)
F->eraseFromParent();
}
}
diff --git a/llvm/test/Verifier/issue176674.ll b/llvm/test/Verifier/issue176674.ll
new file mode 100644
index 0000000000000..349950b143fa2
--- /dev/null
+++ b/llvm/test/Verifier/issue176674.ll
@@ -0,0 +1,13 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes=verify -S | FileCheck %s
+define void @test(ptr %a) {
+; CHECK-LABEL: define void @test(
+; CHECK-SAME: ptr [[A:%.*]]) {
+; CHECK-NEXT: [[V:%.*]] = call <4 x i32> @llvm.x86.sse2.pshuflw.128(<4 x i32> zeroinitializer, i8 0)
+; CHECK-NEXT: store <4 x i32> [[V]], ptr [[A]], align 16
+; CHECK-NEXT: ret void
+;
+ %v = call <4 x i32> @llvm.x86.sse2.pshuflw.128(<4 x i32> zeroinitializer, i8 0)
+ store <4 x i32> %v, ptr %a
+ ret void
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/177606
More information about the llvm-commits
mailing list