Skip to content

Commit f2e38e8

Browse files
authored
[FIRRTL] Add folder for add (#8200)
1 parent fe170f9 commit f2e38e8

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

include/circt/Dialect/FIRRTL/FIRRTLExpressions.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,8 @@ def IntegerAddOp : IntegerBinaryPrimOp<"integer.add", [Commutative]> {
13931393
!firrtl.integer
13941394
```
13951395
}];
1396+
1397+
let hasFolder = true;
13961398
}
13971399

13981400
def IntegerMulOp : IntegerBinaryPrimOp<"integer.mul", [Commutative]> {

lib/Dialect/FIRRTL/FIRRTLFolds.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -935,8 +935,20 @@ LogicalResult NEQPrimOp::canonicalize(NEQPrimOp op, PatternRewriter &rewriter) {
935935
}
936936

937937
OpFoldResult IntegerAddOp::fold(FoldAdaptor adaptor) {
938-
// TODO: implement constant folding, etc.
939-
// Tracked in https://github.com/llvm/circt/issues/6696.
938+
if (auto rhsCst = getConstant(adaptor.getRhs())) {
939+
// Constant folding
940+
if (auto lhsCst = getConstant(adaptor.getLhs())) {
941+
auto resultWidth =
942+
std::max(lhsCst->getBitWidth(), rhsCst->getBitWidth()) + 1;
943+
APSInt lhsCstExt = (*lhsCst).extend(resultWidth);
944+
APSInt rhsCstExt = (*rhsCst).extend(resultWidth);
945+
return IntegerAttr::get(IntegerType::get(getContext(), resultWidth),
946+
lhsCstExt + rhsCstExt);
947+
}
948+
// x + 0 -> x
949+
if (rhsCst->isZero())
950+
return getLhs();
951+
}
940952
return {};
941953
}
942954

test/Dialect/FIRRTL/canonicalization.mlir

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3576,19 +3576,28 @@ firrtl.module private @Issue7562(in %sel : !firrtl.uint<1>, in %a : !firrtl.cons
35763576
}
35773577

35783578
// CHECK-LABEL: firrtl.class @PropertyArithmetic
3579-
firrtl.class @PropertyArithmetic(in %in: !firrtl.integer, out %out0: !firrtl.integer, out %out1: !firrtl.integer) {
3579+
firrtl.class @PropertyArithmetic(in %in: !firrtl.integer, out %out0: !firrtl.integer, out %out1: !firrtl.integer, out %out2: !firrtl.integer, out %out3: !firrtl.integer) {
3580+
// CHECK: [[C3:%.+]] = firrtl.integer 3
35803581
// CHECK: [[C4:%.+]] = firrtl.integer 4
35813582
%0 = firrtl.integer 0
35823583
%1 = firrtl.integer 1
35833584
%2 = firrtl.integer 2
35843585

3585-
%3 = firrtl.integer.shl %1, %2 : (!firrtl.integer, !firrtl.integer) -> !firrtl.integer
3586-
%4 = firrtl.integer.shl %in, %0 : (!firrtl.integer, !firrtl.integer) -> !firrtl.integer
3586+
%res0 = firrtl.integer.shl %1, %2 : (!firrtl.integer, !firrtl.integer) -> !firrtl.integer
3587+
%res1 = firrtl.integer.shl %in, %0 : (!firrtl.integer, !firrtl.integer) -> !firrtl.integer
35873588

35883589
// CHECK: firrtl.propassign %out0, [[C4]]
35893590
// CHECK: firrtl.propassign %out1, %in
3590-
firrtl.propassign %out0, %3 : !firrtl.integer
3591-
firrtl.propassign %out1, %4 : !firrtl.integer
3591+
firrtl.propassign %out0, %res0 : !firrtl.integer
3592+
firrtl.propassign %out1, %res1 : !firrtl.integer
3593+
3594+
%res2 = firrtl.integer.add %1, %2 : (!firrtl.integer, !firrtl.integer) -> !firrtl.integer
3595+
%res3 = firrtl.integer.add %in, %0 : (!firrtl.integer, !firrtl.integer) -> !firrtl.integer
3596+
3597+
// CHECK: firrtl.propassign %out2, [[C3]]
3598+
// CHECK: firrtl.propassign %out3, %in
3599+
firrtl.propassign %out2, %res2 : !firrtl.integer
3600+
firrtl.propassign %out3, %res3 : !firrtl.integer
35923601
}
35933602

35943603
// CHECK-LABEL: firrtl.module private @LayerBlocks

0 commit comments

Comments
 (0)