[llvm] 012523d - [VPlan] Support VPInstruction for intrinsic calls in live-in folding. (#207836)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 7 07:43:47 PDT 2026
Author: Florian Hahn
Date: 2026-07-07T14:43:42Z
New Revision: 012523d96b30a9a6d7148825fe307919a9c4753c
URL: https://github.com/llvm/llvm-project/commit/012523d96b30a9a6d7148825fe307919a9c4753c
DIFF: https://github.com/llvm/llvm-project/commit/012523d96b30a9a6d7148825fe307919a9c4753c.diff
LOG: [VPlan] Support VPInstruction for intrinsic calls in live-in folding. (#207836)
Use getIntrinsicID in getOpcodeOrIntrinsicID. This enables constant
folding for VPInstructions calling intrinsics.
PR: https://github.com/llvm/llvm-project/pull/207836
Added:
Modified:
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 39e8ae5dd3b8c..0a879d7d92941 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1249,14 +1249,13 @@ static void recursivelyDeleteDeadRecipes(VPValue *V) {
/// an intrinsic ID.
static std::optional<std::pair<bool, unsigned>>
getOpcodeOrIntrinsicID(const VPSingleDefRecipe *R) {
+ if (Intrinsic::ID IID = vputils::getIntrinsicID(R))
+ return std::make_pair(true, IID);
return TypeSwitch<const VPSingleDefRecipe *,
std::optional<std::pair<bool, unsigned>>>(R)
.Case<VPInstruction, VPWidenRecipe, VPWidenCastRecipe, VPWidenGEPRecipe,
VPReplicateRecipe>(
[](auto *I) { return std::make_pair(false, I->getOpcode()); })
- .Case([](const VPWidenIntrinsicRecipe *I) {
- return std::make_pair(true, I->getVectorIntrinsicID());
- })
.Case<VPVectorPointerRecipe, VPPredInstPHIRecipe, VPScalarIVStepsRecipe>(
[](auto *I) {
// For recipes that do not directly map to LLVM IR instructions,
@@ -1294,6 +1293,10 @@ static VPIRValue *tryToFoldLiveIns(VPSingleDefRecipe &R,
auto FoldToIRValue = [&]() -> Value * {
InstSimplifyFolder Folder(DL);
if (OpcodeOrIID->first) {
+ // VPInstructions store the called intrinsic as last operand.
+ if (isa<VPInstruction>(R))
+ Ops.pop_back();
+
auto *RFlags = dyn_cast<VPRecipeWithIRFlags>(&R);
return Folder.FoldIntrinsic(OpcodeOrIID->second, Ops, R.getScalarType(),
RFlags ? RFlags->getFastMathFlagsOrNone()
diff --git a/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll b/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll
index 450dd75332f92..92bb9704c4fd2 100644
--- a/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll
+++ b/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll
@@ -282,7 +282,7 @@ define void @fold_replicating_umax_equal_live_ins(ptr noalias %dst, ptr %cond, i
; CHECK-NEXT: then:
; CHECK-NEXT: EMIT ir<%m> = call ir<%x>, ir<%x>, ir<@llvm.umax.i32>
; CHECK-NEXT: EMIT ir<%gep> = getelementptr ir<%dst>, ir<%iv>
-; CHECK-NEXT: EMIT store ir<%m>, ir<%gep>
+; CHECK-NEXT: EMIT store ir<%x>, ir<%gep>
; CHECK-NEXT: Successor(s): latch
; CHECK-EMPTY:
; CHECK-NEXT: latch:
More information about the llvm-commits
mailing list