[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