[llvm] [VectorCombine] Pass flags during IR creation (PR #193271)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 10 02:15:10 PDT 2026


================
@@ -1293,6 +1299,92 @@ bool VectorCombine::scalarizeVPIntrinsic(Instruction &I) {
   return true;
 }
 
+Value *VectorCombine::createUnaryOp(Instruction::UnaryOps Opcode,
+                                    Value *Operand, UnaryOperator *OldI) {
+  switch (Opcode) {
+  case Instruction::FNeg:
+    return Builder.CreateFNegFMF(Operand, OldI,
+                                 OldI->getName() + ".scalar.fneg");
+  case Instruction::UnaryOpsEnd:
+    llvm_unreachable("Invalid unary opcode");
+  }
+  llvm_unreachable("Invalid unary opcode");
+}
+
+Value *VectorCombine::createBinaryOp(Instruction::BinaryOps Opcode, Value *LHS,
+                                     Value *RHS, BinaryOperator *OldI) {
+  switch (Opcode) {
+  case Instruction::Add:
+    return Builder.CreateAdd(LHS, RHS, OldI->getName() + ".scalar.add",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::Sub:
+    return Builder.CreateSub(LHS, RHS, OldI->getName() + ".scalar.sub",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::Mul:
+    return Builder.CreateMul(LHS, RHS, OldI->getName() + ".scalar.mul",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::UDiv:
+    return Builder.CreateUDiv(LHS, RHS, OldI->getName() + ".scalar.udiv",
+                              OldI->isExact());
+  case Instruction::SDiv:
+    return Builder.CreateSDiv(LHS, RHS, OldI->getName() + ".scalar.sdiv",
+                              OldI->isExact());
+  case Instruction::URem:
+    return Builder.CreateURem(LHS, RHS, OldI->getName() + ".scalar.urem");
+  case Instruction::SRem:
+    return Builder.CreateSRem(LHS, RHS, OldI->getName() + ".scalar.srem");
+  case Instruction::Shl:
+    return Builder.CreateShl(LHS, RHS, OldI->getName() + ".scalar.shl",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::LShr:
+    return Builder.CreateLShr(LHS, RHS, OldI->getName() + ".scalar.lshr",
+                              OldI->isExact());
+  case Instruction::AShr:
+    return Builder.CreateAShr(LHS, RHS, OldI->getName() + ".scalar.ashr",
+                              OldI->isExact());
+  case Instruction::And:
+    return Builder.CreateAnd(LHS, RHS, OldI->getName() + ".scalar.and");
+  case Instruction::Or: {
+    PossiblyDisjointInst *PDI = dyn_cast<PossiblyDisjointInst>(OldI);
----------------
arsenm wrote:

This can't fail, it's the single opcode check 

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


More information about the llvm-commits mailing list