[llvm] [VP][EVL] Support select instruction with EVL-vectorization (PR #109614)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 23 11:05:44 PDT 2024
================
@@ -1082,6 +1100,36 @@ void VPWidenSelectRecipe::execute(VPTransformState &State) {
}
}
+void VPWidenSelectEVLRecipe::execute(VPTransformState &State) {
+ State.setDebugLocFrom(getDebugLoc());
+ assert(State.UF == 1 && "Expected only UF == 1 when vectorizing with "
+ "explicit vector length.");
+
+ Value *EVLArg = State.get(getEVL(), 0, /*NeedsScalar=*/true);
+ IRBuilderBase &BuilderIR = State.Builder;
+ VectorBuilder Builder(BuilderIR);
+ Builder.setEVL(EVLArg);
+ // The condition can be loop invariant but still defined inside the
+ // loop. This means that we can't just use the original 'cond' value.
+ // We have to take the 'vectorized' value and pick the first lane.
+ // Instcombine will make this a no-op.
+ auto *InvarCond =
+ isInvariantCond() ? State.get(getCond(), VPIteration(0, 0)) : nullptr;
+
+ Value *Cond = InvarCond ? InvarCond : State.get(getCond(), 0);
+ if (!isa<VectorType>(Cond->getType())) {
+ Cond = BuilderIR.CreateVectorSplat(State.VF, Cond, "splat.cond");
+ }
----------------
alexey-bataev wrote:
Drop braces here
https://github.com/llvm/llvm-project/pull/109614
More information about the llvm-commits
mailing list