[llvm] [VectorCombine] Scalarize binop-like intrinsics (PR #138095)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Fri May 2 05:06:59 PDT 2025


================
@@ -1112,20 +1136,28 @@ bool VectorCombine::scalarizeBinopOrCmp(Instruction &I) {
 
   // vec_op (inselt VecC0, V0, Index), (inselt VecC1, V1, Index) -->
   // inselt NewVecC, (scalar_op V0, V1), Index
-  if (IsCmp)
+  if (isa<CmpInst>(I))
     ++NumScalarCmp;
-  else
+  else if (isa<BinaryOperator>(I))
     ++NumScalarBO;
+  else if (isa<IntrinsicInst>(I))
+    ++NumScalarIntrinsic;
 
   // For constant cases, extract the scalar element, this should constant fold.
   if (IsConst0)
     V0 = ConstantExpr::getExtractElement(VecC0, Builder.getInt64(Index));
   if (IsConst1)
     V1 = ConstantExpr::getExtractElement(VecC1, Builder.getInt64(Index));
 
-  Value *Scalar =
-      IsCmp ? Builder.CreateCmp(Pred, V0, V1)
-            : Builder.CreateBinOp((Instruction::BinaryOps)Opcode, V0, V1);
+  Value *Scalar;
+  if (isa<CmpInst>(I))
+    Scalar = Builder.CreateCmp(Pred, V0, V1);
+  else if (isa<BinaryOperator>(I))
+    Scalar = Builder.CreateBinOp((Instruction::BinaryOps)Opcode, V0, V1);
+  else if (auto *II = dyn_cast<IntrinsicInst>(&I))
+    Scalar = Builder.CreateIntrinsic(ScalarTy, II->getIntrinsicID(), {V0, V1});
+  else
+    llvm_unreachable("Unexpected instruction type");
----------------
RKSimon wrote:

I'd be tempted to simplify this to:
```
  Value *Scalar;
  if (isa<CmpInst>(I))
    Scalar = Builder.CreateCmp(Pred, V0, V1);
  else if (isa<BinaryOperator>(I))
    Scalar = Builder.CreateBinOp((Instruction::BinaryOps)Opcode, V0, V1);
  else
    Scalar = Builder.CreateIntrinsic(ScalarTy, cast<IntrinsicInst>(&I)->getIntrinsicID(), {V0, V1});
```
cast will complain if we somehow don't have IntrinsicInst

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


More information about the llvm-commits mailing list