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

Jack Huang via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 3 21:15:48 PDT 2026


================
@@ -1282,6 +1288,80 @@ 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) {
+  Twine Prefix = OldI->getName() + ".scalar.";
+  switch (Opcode) {
+  case Instruction::Add:
+    return Builder.CreateAdd(LHS, RHS, Prefix + "add",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::Sub:
+    return Builder.CreateSub(LHS, RHS, Prefix + "sub",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::Mul:
+    return Builder.CreateMul(LHS, RHS, Prefix + "mul",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::UDiv:
+    return Builder.CreateUDiv(LHS, RHS, Prefix + "udiv", OldI->isExact());
+  case Instruction::SDiv:
+    return Builder.CreateSDiv(LHS, RHS, Prefix + "sdiv", OldI->isExact());
+  case Instruction::URem:
+    return Builder.CreateURem(LHS, RHS, Prefix + "urem");
+  case Instruction::SRem:
+    return Builder.CreateSRem(LHS, RHS, Prefix + "srem");
+  case Instruction::Shl:
+    return Builder.CreateShl(LHS, RHS, Prefix + "shl",
+                             OldI->hasNoUnsignedWrap(),
+                             OldI->hasNoSignedWrap());
+  case Instruction::LShr:
+    return Builder.CreateLShr(LHS, RHS, Prefix + "lshr", OldI->isExact());
+  case Instruction::AShr:
+    return Builder.CreateAShr(LHS, RHS, Prefix + "ashr", OldI->isExact());
+  case Instruction::And:
+    return Builder.CreateAnd(LHS, RHS, Prefix + "and");
+  case Instruction::Or:
+    return Builder.CreateOr(LHS, RHS, Prefix + "or");
----------------
jackhong12 wrote:

Done. Handled disjoint flag in commit `db77162`.

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


More information about the llvm-commits mailing list