@@ -421,6 +421,38 @@ class ArithOpConversion final : public OpConversionPattern<ArithOp> {
421
421
}
422
422
};
423
423
424
+ template <class ArithOp , class EmitCOp >
425
+ class BinaryUIOpConversion final : public OpConversionPattern<ArithOp> {
426
+ public:
427
+ using OpConversionPattern<ArithOp>::OpConversionPattern;
428
+
429
+ LogicalResult
430
+ matchAndRewrite (ArithOp uiBinOp, typename ArithOp::Adaptor adaptor,
431
+ ConversionPatternRewriter &rewriter) const override {
432
+ Type newRetTy = this ->getTypeConverter ()->convertType (uiBinOp.getType ());
433
+ if (!newRetTy)
434
+ return rewriter.notifyMatchFailure (uiBinOp,
435
+ " converting result type failed" );
436
+ if (!isa<IntegerType>(newRetTy)) {
437
+ return rewriter.notifyMatchFailure (uiBinOp, " expected integer type" );
438
+ }
439
+ Type unsignedType =
440
+ adaptIntegralTypeSignedness (newRetTy, /* needsUnsigned=*/ true );
441
+ if (!unsignedType)
442
+ return rewriter.notifyMatchFailure (uiBinOp,
443
+ " converting result type failed" );
444
+ Value lhsAdapted = adaptValueType (uiBinOp.getLhs (), rewriter, unsignedType);
445
+ Value rhsAdapted = adaptValueType (uiBinOp.getRhs (), rewriter, unsignedType);
446
+
447
+ auto newDivOp =
448
+ rewriter.create <EmitCOp>(uiBinOp.getLoc (), unsignedType,
449
+ ArrayRef<Value>{lhsAdapted, rhsAdapted});
450
+ Value resultAdapted = adaptValueType (newDivOp, rewriter, newRetTy);
451
+ rewriter.replaceOp (uiBinOp, resultAdapted);
452
+ return success ();
453
+ }
454
+ };
455
+
424
456
template <typename ArithOp, typename EmitCOp>
425
457
class IntegerOpConversion final : public OpConversionPattern<ArithOp> {
426
458
public:
@@ -722,6 +754,8 @@ void mlir::populateArithToEmitCPatterns(TypeConverter &typeConverter,
722
754
ArithOpConversion<arith::MulFOp, emitc::MulOp>,
723
755
ArithOpConversion<arith::RemSIOp, emitc::RemOp>,
724
756
ArithOpConversion<arith::SubFOp, emitc::SubOp>,
757
+ BinaryUIOpConversion<arith::DivUIOp, emitc::DivOp>,
758
+ BinaryUIOpConversion<arith::RemUIOp, emitc::RemOp>,
725
759
IntegerOpConversion<arith::AddIOp, emitc::AddOp>,
726
760
IntegerOpConversion<arith::MulIOp, emitc::MulOp>,
727
761
IntegerOpConversion<arith::SubIOp, emitc::SubOp>,
0 commit comments