[llvm] [InstCombine][RISCV] Convert VPIntrinsics with splat operands to splats (PR #65706)

Luke Lau via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 11 10:03:01 PDT 2023


================
@@ -729,6 +730,172 @@ bool VectorCombine::foldBitcastShuf(Instruction &I) {
   return true;
 }
 
+/// VP Intrinsics whose vector operands are both splat values may be simplified
+/// into the scalar version of the operation and the result is splatted. This
+/// can lead to scalarization down the line.
+bool VectorCombine::scalarizeVPIntrinsic(VPIntrinsic &VPI) {
+  Value *Op0 = VPI.getArgOperand(0);
+  Value *Op1 = VPI.getArgOperand(1);
+
+  if (!isSplatValue(Op0) || !isSplatValue(Op1))
+    return false;
+
+  // For the binary VP intrinsics supported here, the result on disabled lanes
+  // is a poison value. For now, only do this simplification if all lanes
+  // are active.
+  // TODO: Relax the condition that all lanes are active by using insertelement
+  // on inactive lanes.
----------------
lukel97 wrote:

Not for this patch, but for reinserting the inactive lanes later maybe we could do something like

```llvm
%x = scalar
%v = splat
%res = @llvm.vp.merge.v16i32(%mask, %v, poison, %evl)
```

https://github.com/llvm/llvm-project/pull/65706


More information about the llvm-commits mailing list