[llvm] [VPlan] Fix `pseudoprobe` being treated a vector intrinsic (PR #185347)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 8 22:31:54 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-vectorizers
Author: Henry Jiang (mustartt)
<details>
<summary>Changes</summary>
Fix assertion when `llvm.pseudoprobe` in VPlan's native path is being treated as a `WIDEN-INTRINSIC`.
Reproducer: https://godbolt.org/z/GsPYobvYs
---
Full diff: https://github.com/llvm/llvm-project/pull/185347.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp (+7-1)
- (added) llvm/test/Transforms/LoopVectorize/pseudo-probe-crash.ll (+36)
``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index dc0edb178efbb..80f0b5d6a3b8b 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -92,7 +92,13 @@ bool VPlanTransforms::tryToConvertVPInstructionsToVPRecipes(
Ingredient.getDebugLoc());
} else if (CallInst *CI = dyn_cast<CallInst>(Inst)) {
Intrinsic::ID VectorID = getVectorIntrinsicIDForCall(CI, &TLI);
- if (VectorID == Intrinsic::not_intrinsic)
+ if (VectorID == Intrinsic::not_intrinsic ||
+ VectorID == Intrinsic::assume ||
+ VectorID == Intrinsic::lifetime_end ||
+ VectorID == Intrinsic::lifetime_start ||
+ VectorID == Intrinsic::sideeffect ||
+ VectorID == Intrinsic::pseudoprobe ||
+ VectorID == Intrinsic::experimental_noalias_scope_decl)
return false;
NewRecipe = new VPWidenIntrinsicRecipe(
*CI, getVectorIntrinsicIDForCall(CI, &TLI),
diff --git a/llvm/test/Transforms/LoopVectorize/pseudo-probe-crash.ll b/llvm/test/Transforms/LoopVectorize/pseudo-probe-crash.ll
new file mode 100644
index 0000000000000..f4298d3c5d770
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/pseudo-probe-crash.ll
@@ -0,0 +1,36 @@
+; REQUIRES: asserts
+; RUN: opt -S -passes=loop-vectorize -enable-vplan-native-path -force-vector-width=2 -debug-only=loop-vectorize -mtriple=aarch64 < %s 2>&1 | FileCheck %s
+
+; Verify that llvm.pseudoprobe present in the outer loop does not crash the
+; VPlan native path and is not treated as a widenable intrinsic.
+; CHECK-NOT: WIDEN-INTRINSIC
+
+define i32 @main() {
+entry:
+ br label %outer.header
+
+outer.header:
+ %j = phi i64 [ 0, %entry ], [ %j.next, %outer.latch ]
+ br label %inner
+
+outer.latch:
+ %j.next = add i64 %j, 1
+ call void @llvm.pseudoprobe(i64 0, i64 0, i32 0, i64 0)
+ %outer.cond = icmp eq i64 %j, 100
+ br i1 %outer.cond, label %exit, label %outer.header, !llvm.loop !0
+
+inner:
+ %k = phi i64 [ 0, %outer.header ], [ %k.next, %inner ]
+ %k.next = add i64 %k, 1
+ %inner.cond = icmp eq i64 %k.next, 0
+ br i1 %inner.cond, label %outer.latch, label %inner
+
+exit:
+ ret i32 0
+}
+
+declare void @llvm.pseudoprobe(i64, i64, i32, i64)
+
+!0 = distinct !{!0, !1, !2}
+!1 = !{!"llvm.loop.mustprogress"}
+!2 = !{!"llvm.loop.vectorize.enable", i1 true}
``````````
</details>
https://github.com/llvm/llvm-project/pull/185347
More information about the llvm-commits
mailing list