[Mlir-commits] [mlir] b8c18e9 - [mlir][ArithToLLVM] Lower arith.subui_extended (#197737)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Jun 4 00:06:18 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-06-04T09:06:13+02:00
New Revision: b8c18e9aa7f273a786a0dd09a4fcab822438e975

URL: https://github.com/llvm/llvm-project/commit/b8c18e9aa7f273a786a0dd09a4fcab822438e975
DIFF: https://github.com/llvm/llvm-project/commit/b8c18e9aa7f273a786a0dd09a4fcab822438e975.diff

LOG: [mlir][ArithToLLVM] Lower arith.subui_extended (#197737)

Added: 
    

Modified: 
    mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
    mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
index 2624420cf5318..6bf0fe85bb62f 100644
--- a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
+++ b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
@@ -256,6 +256,15 @@ struct AddUIExtendedOpLowering
                   ConversionPatternRewriter &rewriter) const override;
 };
 
+struct SubUIExtendedOpLowering
+    : public ConvertOpToLLVMPattern<arith::SubUIExtendedOp> {
+  using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern;
+
+  LogicalResult
+  matchAndRewrite(arith::SubUIExtendedOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override;
+};
+
 template <typename ArithMulOp, bool IsSigned>
 struct MulIExtendedOpLowering : public ConvertOpToLLVMPattern<ArithMulOp> {
   using ConvertOpToLLVMPattern<ArithMulOp>::ConvertOpToLLVMPattern;
@@ -481,6 +490,45 @@ LogicalResult AddUIExtendedOpLowering::matchAndRewrite(
                                      "ND vector types are not supported yet");
 }
 
+//===----------------------------------------------------------------------===//
+// SubUIExtendedOpLowering
+//===----------------------------------------------------------------------===//
+
+LogicalResult SubUIExtendedOpLowering::matchAndRewrite(
+    arith::SubUIExtendedOp op, OpAdaptor adaptor,
+    ConversionPatternRewriter &rewriter) const {
+  Type operandType = adaptor.getLhs().getType();
+  Type 
diff ResultType = op.getDiff().getType();
+  Type borrowResultType = op.getBorrow().getType();
+
+  if (!LLVM::isCompatibleType(operandType))
+    return failure();
+
+  MLIRContext *ctx = rewriter.getContext();
+  Location loc = op.getLoc();
+
+  // Handle the scalar and 1D vector cases.
+  if (!isa<LLVM::LLVMArrayType>(operandType)) {
+    Type newBorrowType = typeConverter->convertType(borrowResultType);
+    Type structType =
+        LLVM::LLVMStructType::getLiteral(ctx, {
diff ResultType, newBorrowType});
+    Value subOverflow = LLVM::USubWithOverflowOp::create(
+        rewriter, loc, structType, adaptor.getLhs(), adaptor.getRhs());
+    Value 
diff Extracted =
+        LLVM::ExtractValueOp::create(rewriter, loc, subOverflow, 0);
+    Value borrowExtracted =
+        LLVM::ExtractValueOp::create(rewriter, loc, subOverflow, 1);
+    rewriter.replaceOp(op, {
diff Extracted, borrowExtracted});
+    return success();
+  }
+
+  if (!isa<VectorType>(
diff ResultType))
+    return rewriter.notifyMatchFailure(loc, "expected vector result types");
+
+  return rewriter.notifyMatchFailure(loc,
+                                     "ND vector types are not supported yet");
+}
+
 //===----------------------------------------------------------------------===//
 // MulIExtendedOpLowering
 //===----------------------------------------------------------------------===//
@@ -728,6 +776,7 @@ void mlir::arith::populateArithToLLVMConversionPatterns(
     AddIOpLowering,
     AndIOpLowering,
     AddUIExtendedOpLowering,
+    SubUIExtendedOpLowering,
     BitcastOpLowering,
     ConstantOpLowering,
     CmpFOpLowering,

diff  --git a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
index df58d4ffcaf51..43f21561e6544 100644
--- a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
+++ b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
@@ -608,6 +608,30 @@ func.func @addui_extended_vector1d(%arg0: vector<3xi16>, %arg1: vector<3xi16>) -
 
 // -----
 
+// CHECK-LABEL: @subui_extended_scalar
+// CHECK-SAME:    ([[ARG0:%.+]]: i32, [[ARG1:%.+]]: i32) -> (i32, i1)
+func.func @subui_extended_scalar(%arg0: i32, %arg1: i32) -> (i32, i1) {
+  // CHECK-NEXT: [[RES:%.+]] = "llvm.intr.usub.with.overflow"([[ARG0]], [[ARG1]]) : (i32, i32) -> !llvm.struct<(i32, i1)>
+  // CHECK-NEXT: [[DIFF:%.+]] = llvm.extractvalue [[RES]][0] : !llvm.struct<(i32, i1)>
+  // CHECK-NEXT: [[BORROW:%.+]] = llvm.extractvalue [[RES]][1] : !llvm.struct<(i32, i1)>
+  %
diff , %borrow = arith.subui_extended %arg0, %arg1 : i32, i1
+  // CHECK-NEXT: return [[DIFF]], [[BORROW]] : i32, i1
+  return %
diff , %borrow : i32, i1
+}
+
+// CHECK-LABEL: @subui_extended_vector1d
+// CHECK-SAME:    ([[ARG0:%.+]]: vector<3xi16>, [[ARG1:%.+]]: vector<3xi16>) -> (vector<3xi16>, vector<3xi1>)
+func.func @subui_extended_vector1d(%arg0: vector<3xi16>, %arg1: vector<3xi16>) -> (vector<3xi16>, vector<3xi1>) {
+  // CHECK-NEXT: [[RES:%.+]] = "llvm.intr.usub.with.overflow"([[ARG0]], [[ARG1]]) : (vector<3xi16>, vector<3xi16>) -> !llvm.struct<(vector<3xi16>, vector<3xi1>)>
+  // CHECK-NEXT: [[DIFF:%.+]] = llvm.extractvalue [[RES]][0] : !llvm.struct<(vector<3xi16>, vector<3xi1>)>
+  // CHECK-NEXT: [[BORROW:%.+]] = llvm.extractvalue [[RES]][1] : !llvm.struct<(vector<3xi16>, vector<3xi1>)>
+  %
diff , %borrow = arith.subui_extended %arg0, %arg1 : vector<3xi16>, vector<3xi1>
+  // CHECK-NEXT: return [[DIFF]], [[BORROW]] : vector<3xi16>, vector<3xi1>
+  return %
diff , %borrow : vector<3xi16>, vector<3xi1>
+}
+
+// -----
+
 // CHECK-LABEL: @mulsi_extended_scalar
 // CHECK-SAME:    ([[ARG0:%.+]]: i32, [[ARG1:%.+]]: i32) -> (i32, i32)
 func.func @mulsi_extended_scalar(%arg0: i32, %arg1: i32) -> (i32, i32) {


        


More information about the Mlir-commits mailing list