From dd7b402d96ebfdf9db5567922a5dce285e99dfc1 Mon Sep 17 00:00:00 2001 From: Liam Jay <145520385+liamslj13@users.noreply.github.com> Date: Fri, 11 Jul 2025 06:50:42 +0900 Subject: [PATCH] [MooreToCore] Lower moore.powu to math.ipowi (#8654) Change PowUOpConversion to call into the MLIR math dialect for unsigned integer exponentiation. --- lib/Conversion/MooreToCore/MooreToCore.cpp | 29 +++++++--------------- test/Conversion/MooreToCore/basic.mlir | 8 +++--- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/lib/Conversion/MooreToCore/MooreToCore.cpp b/lib/Conversion/MooreToCore/MooreToCore.cpp index 6efee48444..350a91587a 100644 --- a/lib/Conversion/MooreToCore/MooreToCore.cpp +++ b/lib/Conversion/MooreToCore/MooreToCore.cpp @@ -1325,29 +1325,18 @@ struct PowUOpConversion : public OpConversionPattern { ConversionPatternRewriter &rewriter) const override { Type resultType = typeConverter->convertType(op.getResult().getType()); - Location loc = op.getLoc(); - auto intType = cast(op.getRhs().getType()); + Location loc = op->getLoc(); - // transform a ** b into scf.for 0 to b step 1 { init *= a }, init = 1 - Type integerType = rewriter.getIntegerType(intType.getWidth()); - Value lowerBound = rewriter.create(loc, integerType, 0); - Value upperBound = - rewriter.create(loc, integerType, op.getRhs()); - Value step = rewriter.create(loc, integerType, 1); + Value zeroVal = rewriter.create(loc, APInt(1, 0)); + // zero extend both LHS & RHS to ensure the unsigned integers are + // interpreted correctly when calculating power + auto lhs = rewriter.create(loc, zeroVal, adaptor.getLhs()); + auto rhs = rewriter.create(loc, zeroVal, adaptor.getRhs()); - Value initVal = rewriter.create(loc, resultType, 1); - Value lhsVal = rewriter.create(loc, resultType, op.getLhs()); - - auto forOp = rewriter.create( - loc, lowerBound, upperBound, step, ValueRange(initVal), - [&](OpBuilder &builder, Location loc, Value i, ValueRange iterArgs) { - Value loopVar = iterArgs.front(); - Value mul = rewriter.create(loc, lhsVal, loopVar); - rewriter.create(loc, ValueRange(mul)); - }); - - rewriter.replaceOp(op, forOp.getResult(0)); + // lower the exponentiation via MLIR's math dialect + auto pow = rewriter.create(loc, lhs, rhs); + rewriter.replaceOpWithNewOp(op, resultType, pow, 0); return success(); } }; diff --git a/test/Conversion/MooreToCore/basic.mlir b/test/Conversion/MooreToCore/basic.mlir index 6c5f22691f..c6df3d449e 100644 --- a/test/Conversion/MooreToCore/basic.mlir +++ b/test/Conversion/MooreToCore/basic.mlir @@ -1111,9 +1111,11 @@ func.func @Conversions(%arg0: !moore.i16, %arg1: !moore.l16) { // CHECK-LABEL: func.func @PowUOp func.func @PowUOp(%arg0: !moore.l32, %arg1: !moore.l32) { - // CHECK: %{{.*}} = scf.for %{{.*}} = %{{.*}} to %arg1 step %{{.*}} iter_args([[VAR:%.+]] = %{{.*}}) -> (i32) : i32 { - // CHECK: [[MUL:%.+]] = comb.mul %arg0, [[VAR]] : i32 - // CHECK: scf.yield [[MUL]] : i32 + // CHECK: %[[ZEROVAL:.*]] = hw.constant false + // CHECK: %[[CONCATA:.*]] = comb.concat %[[ZEROVAL]], %arg0 : i1, i32 + // CHECK: %[[CONCATB:.*]] = comb.concat %[[ZEROVAL]], %arg1 : i1, i32 + // CHECK: %[[RES:.*]] = math.ipowi %[[CONCATA]], %[[CONCATB]] : i33 + // CHECK: comb.extract %[[RES]] from 0 : (i33) -> i32 %0 = moore.powu %arg0, %arg1 : l32 return }