diff --git a/lib/Dialect/ESI/ESIDialect.cpp b/lib/Dialect/ESI/ESIDialect.cpp index 32c9e39e3a..4fcc95bca8 100644 --- a/lib/Dialect/ESI/ESIDialect.cpp +++ b/lib/Dialect/ESI/ESIDialect.cpp @@ -41,14 +41,11 @@ void ESIDialect::initialize() { Operation *ESIDialect::materializeConstant(OpBuilder &builder, Attribute value, Type type, Location loc) { - // Integer constants. - if (auto intType = dyn_cast(type)) - if (auto attrValue = dyn_cast(value)) - return builder.create(loc, attrValue.getType(), - attrValue); if (isa(value)) return builder.create(loc, builder.getI1Type(), 1); - return nullptr; + return builder.getContext() + ->getOrLoadDialect() + ->materializeConstant(builder, value, type, loc); } // Provide implementations for the enums we use. diff --git a/lib/Dialect/ESI/ESIFolds.cpp b/lib/Dialect/ESI/ESIFolds.cpp index b7cd4ac95c..11505d81b7 100644 --- a/lib/Dialect/ESI/ESIFolds.cpp +++ b/lib/Dialect/ESI/ESIFolds.cpp @@ -19,8 +19,10 @@ LogicalResult WrapValidReadyOp::fold(FoldAdaptor, SmallVectorImpl &results) { if (!getChanOutput().getUsers().empty()) return failure(); - results.push_back(NullChannelAttr::get( - getContext(), TypeAttr::get(getChanOutput().getType()))); + OpBuilder builder(getContext()); + results.push_back( + builder.create(getLoc(), getChanOutput().getType()) + .getOut()); results.push_back(IntegerAttr::get(IntegerType::get(getContext(), 1), 1)); return success(); } @@ -44,22 +46,30 @@ LogicalResult UnwrapFIFOOp::canonicalize(UnwrapFIFOOp op, LogicalResult WrapFIFOOp::fold(FoldAdaptor, SmallVectorImpl &results) { - if (getChanOutput().getUsers().empty()) { - results.push_back({}); - results.push_back(IntegerAttr::get( - IntegerType::get(getContext(), 1, IntegerType::Signless), 0)); - return success(); - } - return failure(); + if (!getChanOutput().getUsers().empty()) + return failure(); + + OpBuilder builder(getContext()); + results.push_back( + builder.create(getLoc(), getChanOutput().getType()) + .getOut()); + results.push_back(IntegerAttr::get( + IntegerType::get(getContext(), 1, IntegerType::Signless), 0)); + return success(); } LogicalResult WrapFIFOOp::canonicalize(WrapFIFOOp op, PatternRewriter &rewriter) { - auto unwrap = - dyn_cast_or_null(*op.getChanOutput().getUsers().begin()); + + if (!op.getChanOutput().hasOneUse()) + return rewriter.notifyMatchFailure( + op, "channel output doesn't have exactly one use"); + auto unwrap = dyn_cast_or_null( + op.getChanOutput().getUses().begin()->getOwner()); if (succeeded(UnwrapFIFOOp::mergeAndErase(unwrap, op, rewriter))) return success(); - return failure(); + return rewriter.notifyMatchFailure( + op, "could not find corresponding unwrap for wrap"); } OpFoldResult WrapWindow::fold(FoldAdaptor) { diff --git a/test/Dialect/ESI/canonicalizers.mlir b/test/Dialect/ESI/canonicalizers.mlir new file mode 100644 index 0000000000..6ad6a24a08 --- /dev/null +++ b/test/Dialect/ESI/canonicalizers.mlir @@ -0,0 +1,15 @@ +// RUN: circt-opt %s --canonicalize | FileCheck %s + +// CHECK-LABEL: hw.module @TestDanglingFIFO() { +// CHECK-NEXT: hw.output +hw.module @TestDanglingFIFO() { + %c0 = hw.constant 0 : i1 + %chanOutput, %ready = esi.wrap.fifo %c0, %c0 : !esi.channel +} + +// CHECK-LABEL: hw.module @TestDanglingValidReady() { +// CHECK-NEXT: hw.output +hw.module @TestDanglingValidReady() { + %c0 = hw.constant 0 : i1 + %chanOutput, %ready = esi.wrap.vr %c0, %c0 : i1 +}