diff --git a/lib/Conversion/LoopScheduleToCalyx/LoopScheduleToCalyx.cpp b/lib/Conversion/LoopScheduleToCalyx/LoopScheduleToCalyx.cpp index 06d3357a3903..c7ea6889bff3 100644 --- a/lib/Conversion/LoopScheduleToCalyx/LoopScheduleToCalyx.cpp +++ b/lib/Conversion/LoopScheduleToCalyx/LoopScheduleToCalyx.cpp @@ -1510,11 +1510,10 @@ class LoopScheduleToCalyxPass if (runOnce) config.maxIterations = 1; - /// Can't return applyPatternsAndFoldGreedily. Root isn't + /// Can't return applyPatternsGreedily. Root isn't /// necessarily erased so it will always return failed(). Instead, /// forward the 'succeeded' value from PartialLoweringPatternBase. - (void)applyPatternsAndFoldGreedily(getOperation(), std::move(pattern), - config); + (void)applyPatternsGreedily(getOperation(), std::move(pattern), config); return partialPatternRes; } @@ -1642,8 +1641,8 @@ void LoopScheduleToCalyxPass::runOnOperation() { RewritePatternSet cleanupPatterns(&getContext()); cleanupPatterns.add(&getContext()); - if (failed(applyPatternsAndFoldGreedily(getOperation(), - std::move(cleanupPatterns)))) { + if (failed( + applyPatternsGreedily(getOperation(), std::move(cleanupPatterns)))) { signalPassFailure(); return; } diff --git a/lib/Conversion/SCFToCalyx/SCFToCalyx.cpp b/lib/Conversion/SCFToCalyx/SCFToCalyx.cpp index cb35aa8984fa..d9779eff8aa2 100644 --- a/lib/Conversion/SCFToCalyx/SCFToCalyx.cpp +++ b/lib/Conversion/SCFToCalyx/SCFToCalyx.cpp @@ -2491,11 +2491,10 @@ class SCFToCalyxPass : public circt::impl::SCFToCalyxBase { if (runOnce) config.maxIterations = 1; - /// Can't return applyPatternsAndFoldGreedily. Root isn't + /// Can't return applyPatternsGreedily. Root isn't /// necessarily erased so it will always return failed(). Instead, /// forward the 'succeeded' value from PartialLoweringPatternBase. - (void)applyPatternsAndFoldGreedily(getOperation(), std::move(pattern), - config); + (void)applyPatternsGreedily(getOperation(), std::move(pattern), config); return partialPatternRes; } @@ -2818,8 +2817,8 @@ void SCFToCalyxPass::runOnOperation() { RewritePatternSet cleanupPatterns(&getContext()); cleanupPatterns.add(&getContext()); - if (failed(applyPatternsAndFoldGreedily(getOperation(), - std::move(cleanupPatterns)))) { + if (failed( + applyPatternsGreedily(getOperation(), std::move(cleanupPatterns)))) { signalPassFailure(); return; } diff --git a/lib/Dialect/AIG/Transforms/LowerVariadic.cpp b/lib/Dialect/AIG/Transforms/LowerVariadic.cpp index a5983a89b81b..8590fd06df12 100644 --- a/lib/Dialect/AIG/Transforms/LowerVariadic.cpp +++ b/lib/Dialect/AIG/Transforms/LowerVariadic.cpp @@ -100,6 +100,6 @@ void LowerVariadicPass::runOnOperation() { populateLowerVariadicPatterns(patterns); mlir::FrozenRewritePatternSet frozen(std::move(patterns)); - if (failed(mlir::applyPatternsAndFoldGreedily(getOperation(), frozen))) + if (failed(mlir::applyPatternsGreedily(getOperation(), frozen))) return signalPassFailure(); } diff --git a/lib/Dialect/AIG/Transforms/LowerWordToBits.cpp b/lib/Dialect/AIG/Transforms/LowerWordToBits.cpp index 27cee5ebe7be..20ea3f96d948 100644 --- a/lib/Dialect/AIG/Transforms/LowerWordToBits.cpp +++ b/lib/Dialect/AIG/Transforms/LowerWordToBits.cpp @@ -97,7 +97,7 @@ void LowerWordToBitsPass::runOnOperation() { // Use top-down traversal to reuse bits from `comb.concat`. config.useTopDownTraversal = true; - if (failed(mlir::applyPatternsAndFoldGreedily(getOperation(), frozenPatterns, - config))) + if (failed( + mlir::applyPatternsGreedily(getOperation(), frozenPatterns, config))) return signalPassFailure(); } diff --git a/lib/Dialect/Arc/Transforms/ArcCanonicalizer.cpp b/lib/Dialect/Arc/Transforms/ArcCanonicalizer.cpp index d5dbde51af1c..c97826be7e2c 100644 --- a/lib/Dialect/Arc/Transforms/ArcCanonicalizer.cpp +++ b/lib/Dialect/Arc/Transforms/ArcCanonicalizer.cpp @@ -802,8 +802,8 @@ void ArcCanonicalizerPass::runOnOperation() { symbolPatterns.add( &getContext(), cache, names, statistics, arcMapping); - if (failed(mlir::applyPatternsAndFoldGreedily( - getOperation(), std::move(symbolPatterns), config))) + if (failed(mlir::applyPatternsGreedily(getOperation(), + std::move(symbolPatterns), config))) return signalPassFailure(); numArcArgsRemoved = statistics.removeUnusedArcArgumentsPatternNumArgsRemoved; @@ -817,8 +817,8 @@ void ArcCanonicalizerPass::runOnOperation() { KeepOneVecOp>(&getContext()); // Don't test for convergence since it is often not reached. - (void)mlir::applyPatternsAndFoldGreedily(getOperation(), std::move(patterns), - config); + (void)mlir::applyPatternsGreedily(getOperation(), std::move(patterns), + config); } std::unique_ptr arc::createArcCanonicalizerPass() { diff --git a/lib/Dialect/Arc/Transforms/LatencyRetiming.cpp b/lib/Dialect/Arc/Transforms/LatencyRetiming.cpp index 6c4fa04f948f..bbae40ce50e0 100644 --- a/lib/Dialect/Arc/Transforms/LatencyRetiming.cpp +++ b/lib/Dialect/Arc/Transforms/LatencyRetiming.cpp @@ -198,7 +198,7 @@ void LatencyRetimingPass::runOnOperation() { RewritePatternSet patterns(&getContext()); patterns.add(&getContext(), cache, statistics); - if (failed(applyPatternsAndFoldGreedily(getOperation(), std::move(patterns)))) + if (failed(applyPatternsGreedily(getOperation(), std::move(patterns)))) return signalPassFailure(); numOpsRemoved = statistics.numOpsRemoved; diff --git a/lib/Dialect/ESI/Passes/ESILowerBundles.cpp b/lib/Dialect/ESI/Passes/ESILowerBundles.cpp index 15df675103c0..b5b71b248061 100644 --- a/lib/Dialect/ESI/Passes/ESILowerBundles.cpp +++ b/lib/Dialect/ESI/Passes/ESILowerBundles.cpp @@ -220,8 +220,7 @@ void ESIBundlesPass::runOnOperation() { RewritePatternSet patterns(&ctxt); PackBundleOp::getCanonicalizationPatterns(patterns, &ctxt); UnpackBundleOp::getCanonicalizationPatterns(patterns, &ctxt); - if (failed(mlir::applyPatternsAndFoldGreedily(getOperation(), - std::move(patterns)))) + if (failed(mlir::applyPatternsGreedily(getOperation(), std::move(patterns)))) signalPassFailure(); top.walk([&](PackBundleOp pack) { diff --git a/lib/Dialect/FIRRTL/Transforms/Vectorization.cpp b/lib/Dialect/FIRRTL/Transforms/Vectorization.cpp index 068968270863..e3c938fda7b5 100644 --- a/lib/Dialect/FIRRTL/Transforms/Vectorization.cpp +++ b/lib/Dialect/FIRRTL/Transforms/Vectorization.cpp @@ -96,7 +96,7 @@ void VectorizationPass::runOnOperation() { VectorCreateToLogicElementwise>( &getContext()); mlir::FrozenRewritePatternSet frozenPatterns(std::move(patterns)); - (void)applyPatternsAndFoldGreedily(getOperation(), frozenPatterns); + (void)applyPatternsGreedily(getOperation(), frozenPatterns); } std::unique_ptr circt::firrtl::createVectorizationPass() { diff --git a/lib/Dialect/HW/Transforms/FlattenIO.cpp b/lib/Dialect/HW/Transforms/FlattenIO.cpp index ff3b521e2a9f..7eea0f268049 100644 --- a/lib/Dialect/HW/Transforms/FlattenIO.cpp +++ b/lib/Dialect/HW/Transforms/FlattenIO.cpp @@ -228,6 +228,18 @@ class FlattenIOTypeConverter : public TypeConverter { auto result = builder.create(loc, type, inputs); return result.getResult(); }); + + // In the presence of hw.extern_module which takes struct arguments, we may + // have materialized struct explodes for said arguments (say, e.g., if the + // parent module of the hw.instance had structs in its input, and feeds + // these structs to the hw.instance). + // These struct explodes needs to be converted back to the original struct, + // which persist beyond the conversion. + addSourceMaterialization([](OpBuilder &builder, hw::StructType type, + ValueRange inputs, Location loc) { + auto result = builder.create(loc, type, inputs); + return result.getResult(); + }); } }; diff --git a/lib/Dialect/Handshake/Transforms/SplitMerges.cpp b/lib/Dialect/Handshake/Transforms/SplitMerges.cpp index f6689cca2591..fe14184a594c 100644 --- a/lib/Dialect/Handshake/Transforms/SplitMerges.cpp +++ b/lib/Dialect/Handshake/Transforms/SplitMerges.cpp @@ -132,8 +132,7 @@ struct HandshakeSplitMerges patterns.insert( &getContext()); - if (failed( - applyPatternsAndFoldGreedily(getOperation(), std::move(patterns)))) + if (failed(applyPatternsGreedily(getOperation(), std::move(patterns)))) signalPassFailure(); }; }; diff --git a/lib/Dialect/Verif/Transforms/LowerFormalToHW.cpp b/lib/Dialect/Verif/Transforms/LowerFormalToHW.cpp index f86e8b88f60a..6096bfd64bfc 100644 --- a/lib/Dialect/Verif/Transforms/LowerFormalToHW.cpp +++ b/lib/Dialect/Verif/Transforms/LowerFormalToHW.cpp @@ -71,6 +71,6 @@ void LowerFormalToHWPass::runOnOperation() { RewritePatternSet patterns(&getContext()); patterns.add(patterns.getContext()); - if (failed(applyPatternsAndFoldGreedily(getOperation(), std::move(patterns)))) + if (failed(applyPatternsGreedily(getOperation(), std::move(patterns)))) signalPassFailure(); } diff --git a/lib/Transforms/MemoryBanking.cpp b/lib/Transforms/MemoryBanking.cpp index ccca52dcbde4..064a129beb7f 100644 --- a/lib/Transforms/MemoryBanking.cpp +++ b/lib/Transforms/MemoryBanking.cpp @@ -408,8 +408,8 @@ void MemoryBankingPass::runOnOperation() { GreedyRewriteConfig config; config.strictMode = GreedyRewriteStrictness::ExistingOps; - if (failed(applyPatternsAndFoldGreedily(getOperation(), std::move(patterns), - config))) { + if (failed( + applyPatternsGreedily(getOperation(), std::move(patterns), config))) { signalPassFailure(); } diff --git a/llvm b/llvm index 6a01ac7d06df..560b72c0408a 160000 --- a/llvm +++ b/llvm @@ -1 +1 @@ -Subproject commit 6a01ac7d06df875206f746fc982f58c161249285 +Subproject commit 560b72c0408a8f7e4340a1d4197b164a14cd30b0 diff --git a/test/Conversion/VerifToSMT/verif-to-smt.mlir b/test/Conversion/VerifToSMT/verif-to-smt.mlir index f5774a52ebce..1f4400e963e5 100644 --- a/test/Conversion/VerifToSMT/verif-to-smt.mlir +++ b/test/Conversion/VerifToSMT/verif-to-smt.mlir @@ -36,8 +36,8 @@ func.func @test_lec(%arg0: !smt.bv<1>) -> (i1, i1, i1) { verif.assert %0 : i1 // CHECK: [[EQ:%.+]] = smt.solver() : () -> i1 - // CHECK: [[IN0:%.+]] = smt.declare_fun : !smt.bv<32> - // CHECK: [[IN1:%.+]] = smt.declare_fun : !smt.bv<32> + // CHECK-DAG: [[IN0:%.+]] = smt.declare_fun : !smt.bv<32> + // CHECK-DAG: [[IN1:%.+]] = smt.declare_fun : !smt.bv<32> // CHECK-DAG: [[V0:%.+]] = builtin.unrealized_conversion_cast [[IN0]] : !smt.bv<32> to i32 // CHECK-DAG: [[V1:%.+]] = builtin.unrealized_conversion_cast [[IN1]] : !smt.bv<32> to i32 // CHECK-DAG: [[V2:%.+]]:2 = "some_op"([[V0]], [[V1]]) : (i32, i32) -> (i32, i32) diff --git a/test/Dialect/HW/flatten-io.mlir b/test/Dialect/HW/flatten-io.mlir index cf93bc262d63..992f085f57cd 100644 --- a/test/Dialect/HW/flatten-io.mlir +++ b/test/Dialect/HW/flatten-io.mlir @@ -68,6 +68,13 @@ hw.module @instance_extern2(in %arg0 : i32, in %arg1 : !Struct1, out out : !Stru hw.module.extern @level1_extern(in %arg0 : i32, in %in : !Struct1, in %arg1: i32, out out0 : i32, out out: !Struct1, out out1: i32) +// BASIC-LABEL: hw.module @instance_extern(in %arg0 : i32, in %arg1.a : i1, in %arg1.b : i2, out out.a : i1, out out.b : i2) { +// BASIC-NEXT: %0 = hw.struct_create (%arg1.a, %arg1.b) : !hw.struct +// BASIC-NEXT: %l1.out0, %l1.out, %l1.out1 = hw.instance "l1" @level1_extern(arg0: %arg0: i32, in: %0: !hw.struct, arg1: %arg0: i32) -> (out0: i32, out: !hw.struct, out1: i32) +// BASIC-NEXT: %a, %b = hw.struct_explode %l1.out : !hw.struct +// BASIC-NEXT: hw.output %a, %b : i1, i2 +// BASIC-NEXT: } + // EXTERN-LABEL: hw.module @instance_extern(in %arg0 : i32, in %arg1_a : i1, in %arg1_b : i2, out out_a : i1, out out_b : i2) { // EXTERN-NEXT: %l1.out0, %l1.out_a, %l1.out_b, %l1.out1 = hw.instance "l1" @level1_extern(arg0: %arg0: i32, in_a: %arg1_a: i1, in_b: %arg1_b: i2, arg1: %arg0: i32) -> (out0: i32, out_a: i1, out_b: i2, out1: i32) // EXTERN-NEXT: %0 = hw.struct_create (%l1.out_a, %l1.out_b) : !hw.struct