[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