diff --git a/include/NeuraDialect/NeuraPasses.h b/include/NeuraDialect/NeuraPasses.h index 6627feab..c8a8001c 100644 --- a/include/NeuraDialect/NeuraPasses.h +++ b/include/NeuraDialect/NeuraPasses.h @@ -20,7 +20,7 @@ void registerNeuraConversionPassPipeline(); #include "NeuraDialect/NeuraPasses.h.inc" std::unique_ptr createInsertDataMovPass(); std::unique_ptr createInsertCtrlMovPass(); -std::unique_ptr createFusePatternsPass(); +std::unique_ptr createFusePatternPass(); std::unique_ptr createAssignAcceleratorPass(); std::unique_ptr createTransformCtrlToDataFlowPass(); std::unique_ptr createLeveragePredicatedValuePass(); @@ -29,6 +29,7 @@ std::unique_ptr createGenerateCodePass(); std::unique_ptr createFuseControlFlowPass(); std::unique_ptr createCanonicalizeLiveInPass(); std::unique_ptr createCanonicalizeCastPass(); +std::unique_ptr createFoldConstantPass(); #define GEN_PASS_REGISTRATION #include "NeuraDialect/NeuraPasses.h.inc" diff --git a/include/NeuraDialect/NeuraPasses.td b/include/NeuraDialect/NeuraPasses.td index 9a89e957..31e0356e 100644 --- a/include/NeuraDialect/NeuraPasses.td +++ b/include/NeuraDialect/NeuraPasses.td @@ -14,10 +14,10 @@ def AssignAccelerator : Pass<"assign-accelerator", "ModuleOp"> { let constructor = "neura::createAssignAcceleratorPass()"; } -def FusePatterns : Pass<"fuse-patterns", "ModuleOp"> { +def FusePattern : Pass<"fuse-pattern", "ModuleOp"> { let summary = "Fuses patterns in the Neura dialect"; let description = [{Apply Neura fusion patterns.}]; - let constructor = "neura::createFusePatternsPass()"; + let constructor = "neura::createFusePatternPass()"; } def InsertDataMov : Pass<"insert-data-mov", "ModuleOp"> { @@ -97,4 +97,15 @@ def CanonicalizeCast : Pass<"canonicalize-cast", "ModuleOp"> { let constructor = "neura::createCanonicalizeCastPass()"; } +def FoldConstant : Pass<"fold-constant", "ModuleOp"> { + let summary = "Folds constant operations in the Neura dialect"; + let description = [{ + This pass applies constant folding transformations to Neura dialect operations. + The folding includes: + 1. Folding constant operations. + 2. Removing dead operations. + }]; + let constructor = "neura::createFoldConstantPass()"; +} + #endif // NEURA_PASSES_TD \ No newline at end of file diff --git a/lib/NeuraDialect/Transforms/CMakeLists.txt b/lib/NeuraDialect/Transforms/CMakeLists.txt index d419bf9e..17bf2012 100644 --- a/lib/NeuraDialect/Transforms/CMakeLists.txt +++ b/lib/NeuraDialect/Transforms/CMakeLists.txt @@ -4,7 +4,7 @@ add_mlir_library( MLIRNeuraTransforms InsertDataMovPass.cpp InsertCtrlMovPass.cpp - FusePatternsPass.cpp + FusePatternPass.cpp AssignAcceleratorPass.cpp TransformCtrlToDataFlowPass.cpp LeveragePredicatedValuePass.cpp @@ -13,6 +13,7 @@ add_mlir_library( FuseControlFlowPass.cpp CanonicalizeLiveInPass.cpp CanonicalizeCastPass.cpp + FoldConstantPass.cpp DEPENDS MLIRNeuraTransformsIncGen diff --git a/lib/NeuraDialect/Transforms/FoldConstantPass.cpp b/lib/NeuraDialect/Transforms/FoldConstantPass.cpp new file mode 100644 index 00000000..9e410ed4 --- /dev/null +++ b/lib/NeuraDialect/Transforms/FoldConstantPass.cpp @@ -0,0 +1,91 @@ +#include "NeuraDialect/NeuraOps.h" +#include "mlir/Dialect/Func/IR/FuncOps.h" +#include "mlir/IR/PatternMatch.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" + +using namespace mlir; + +#define GEN_PASS_DEF_FOLDCONSTANT +#include "NeuraDialect/NeuraPasses.h.inc" + +namespace { +struct FuseConstantAndGrantPattern + : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(neura::ConstantOp constant_op, + PatternRewriter &rewriter) const override { + bool made_change = false; + + // Checks if the constant operation is used by a grant_once or grant_always + // operation. + for (auto user : constant_op->getUsers()) { + llvm::errs() << "Checking use: " << *user << "\n"; + if (isa(user) || isa(user)) { + if (neura::GrantOnceOp grant_once_op = + dyn_cast(user)) { + auto new_grant_once_op = rewriter.create( + grant_once_op.getLoc(), grant_once_op.getResult().getType(), + /*value=*/nullptr, constant_op->getAttr("value")); + // Replaces the original constant operation with the new one. + rewriter.replaceOp(grant_once_op, new_grant_once_op); + made_change = true; + } else if (neura::GrantAlwaysOp grant_always_op = + dyn_cast(user)) { + auto new_grant_always_op = rewriter.create( + grant_always_op.getLoc(), grant_always_op.getResult().getType(), + /*value=*/nullptr, constant_op->getAttr("value")); + // Replaces the original constant operation with the new one. + rewriter.replaceOp(grant_always_op, new_grant_always_op); + made_change = true; + } + } + } + + if (constant_op->use_empty()) { + // If the constant operation has no users, it can be removed. + rewriter.eraseOp(constant_op); + made_change = true; + } + + return success(made_change); + } +}; + +struct FoldConstantPass + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FoldConstantPass) + + StringRef getArgument() const override { return "fold-constant"; } + StringRef getDescription() const override { + return "Fold constant operations."; + } + + void runOnOperation() override { + ModuleOp module_op = getOperation(); + RewritePatternSet patterns(&getContext()); + patterns.add(&getContext()); + FrozenRewritePatternSet frozen(std::move(patterns)); + + // Applies to every region inside the module (regardless of func type, + // e.g., mlir func or llvm func). + module_op.walk([&](Operation *op) { + if (!op->getRegions().empty()) { + for (Region ®ion : op->getRegions()) { + if (failed(applyPatternsGreedily(region, frozen))) { + signalPassFailure(); + } + } + } + }); + } +}; + +} // namespace + +namespace mlir::neura { +std::unique_ptr createFoldConstantPass() { + return std::make_unique(); +} +} // namespace mlir::neura diff --git a/lib/NeuraDialect/Transforms/FusePatternsPass.cpp b/lib/NeuraDialect/Transforms/FusePatternPass.cpp similarity index 90% rename from lib/NeuraDialect/Transforms/FusePatternsPass.cpp rename to lib/NeuraDialect/Transforms/FusePatternPass.cpp index cfeea02c..4cc1a407 100644 --- a/lib/NeuraDialect/Transforms/FusePatternsPass.cpp +++ b/lib/NeuraDialect/Transforms/FusePatternPass.cpp @@ -6,7 +6,7 @@ using namespace mlir; -#define GEN_PASS_DEF_FUSEPATTERNS +#define GEN_PASS_DEF_FUSEPATTERN #include "NeuraDialect/NeuraPasses.h.inc" namespace { @@ -95,23 +95,22 @@ struct FuseFMulFAddPattern : public OpRewritePattern { } }; -struct FusePatternsPass - : public PassWrapper> { - MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FusePatternsPass) +struct FusePatternPass + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FusePatternPass) - StringRef getArgument() const override { return "fuse-patterns"; } + StringRef getArgument() const override { return "fuse-pattern"; } StringRef getDescription() const override { return "Apply Neura fusion patterns."; } void runOnOperation() override { + ModuleOp module_op = getOperation(); RewritePatternSet patterns(&getContext()); patterns.add(&getContext(), 2); patterns.add(&getContext(), 3); FrozenRewritePatternSet frozen(std::move(patterns)); - ModuleOp module_op = getOperation(); - // Applies to every region inside the module (regardless of func type, // e.g., mlir func or llvm func). module_op.walk([&](Operation *op) { @@ -129,7 +128,7 @@ struct FusePatternsPass } // namespace namespace mlir::neura { -std::unique_ptr createFusePatternsPass() { - return std::make_unique(); +std::unique_ptr createFusePatternPass() { + return std::make_unique(); } } // namespace mlir::neura diff --git a/test/controflow_fuse/simple_loop/simple_loop.mlir b/test/controflow_fuse/simple_loop/simple_loop.mlir index a56f0b36..d58671b4 100644 --- a/test/controflow_fuse/simple_loop/simple_loop.mlir +++ b/test/controflow_fuse/simple_loop/simple_loop.mlir @@ -41,7 +41,9 @@ // RUN: --canonicalize-live-in \ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ -// RUN: --fuse-control-flow | FileCheck %s -check-prefix=CTRLFUSE +// RUN: --fuse-control-flow \ +// RUN: --fold-constant \ +// RUN: | FileCheck %s -check-prefix=FUSE // RUN: mlir-neura-opt %t-llvm.mlir \ // RUN: --assign-accelerator \ @@ -54,8 +56,9 @@ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ // RUN: --fuse-control-flow \ +// RUN: --fold-constant \ // RUN: --insert-data-mov \ -// RUN: --map-to-accelerator="mapping-strategy=heuristic" | FileCheck %s -check-prefix=CTRLFUSE-MAPPING +// RUN: --map-to-accelerator="mapping-strategy=heuristic" | FileCheck %s -check-prefix=FUSE-MAPPING module attributes {} { func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {llvm.linkage = #llvm.linkage} { @@ -158,92 +161,68 @@ module attributes {} { // CTRL2DATA-NEXT: } -// CTRLFUSE: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CTRLFUSE-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> -// CTRLFUSE-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> -// CTRLFUSE-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CTRLFUSE-NEXT: %5 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data -// CTRLFUSE-NEXT: %6 = "neura.grant_always"(%5) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %7 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i32}> : () -> !neura.data -// CTRLFUSE-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %10 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> !neura.data -// CTRLFUSE-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CTRLFUSE-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %14 = "neura.constant"() <{predicate = true, value = true}> : () -> !neura.data -// CTRLFUSE-NEXT: %15 = "neura.grant_always"(%14) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %15, start = %13, end = %6, step = %7) {iterationType = "increment"} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data -// CTRLFUSE-NEXT: %16 = "neura.not"(%valid) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %17 = neura.grant_predicate %1, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRLFUSE-NEXT: %18 = neura.grant_predicate %11, %valid : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-NEXT: %19 = neura.grant_predicate %9, %valid : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-NEXT: %20 = neura.grant_predicate %3, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRLFUSE-NEXT: %21 = neura.load_indexed %17[%nextindex : !neura.data] !neura.data, i1> : !neura.data -// CTRLFUSE-NEXT: %22 = "neura.mul"(%21, %18) : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-NEXT: %23 = "neura.add"(%22, %19) : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-NEXT: neura.store_indexed %23 to %20[%nextindex : !neura.data] !neura.data, i1> : !neura.data -// CTRLFUSE-NEXT: "neura.return"() : () -> () -// CTRLFUSE-NEXT: } +// FUSE: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// FUSE-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data, i1> +// FUSE-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data, i1> +// FUSE-NEXT: %2 = "neura.grant_always"() <{constant_value = 1 : i64}> : () -> !neura.data +// FUSE-NEXT: %3 = "neura.grant_always"() <{constant_value = 128 : i64}> : () -> !neura.data +// FUSE-NEXT: %4 = "neura.grant_once"() <{constant_value = 1 : i32}> : () -> !neura.data +// FUSE-NEXT: %5 = "neura.grant_once"() <{constant_value = 2 : i32}> : () -> !neura.data +// FUSE-NEXT: %6 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// FUSE-NEXT: %7 = "neura.grant_always"() <{constant_value = true}> : () -> !neura.data +// FUSE-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %7, start = %6, end = %3, step = %2) {iterationType = "increment"} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// FUSE-NEXT: %8 = "neura.not"(%valid) : (!neura.data) -> !neura.data +// FUSE-NEXT: %9 = neura.grant_predicate %0, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-NEXT: %10 = neura.grant_predicate %5, %valid : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %11 = neura.grant_predicate %4, %valid : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %12 = neura.grant_predicate %1, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-NEXT: %13 = neura.load_indexed %9[%nextindex : !neura.data] !neura.data, i1> : !neura.data +// FUSE-NEXT: %14 = "neura.mul"(%13, %10) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %15 = "neura.add"(%14, %11) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: neura.store_indexed %15 to %12[%nextindex : !neura.data] !neura.data, i1> : !neura.data +// FUSE-NEXT: "neura.return"() : () -> () +// FUSE-NEXT: } -// CTRLFUSE-MAPPING: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {CompiledII = 4 : i32, RecMII = 1 : i32, ResMII = 2 : i32, accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CTRLFUSE-MAPPING-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %1 = "neura.data_mov"(%0) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %2 = "neura.grant_once"(%1) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %3 = "neura.constant"() <{predicate = true, value = "%arg1"}> {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : () -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %4 = "neura.data_mov"(%3) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 4 : i32}, {id = 0 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %5 = "neura.grant_once"(%4) {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 6 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %6 = "neura.constant"() <{predicate = true, value = 1 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %7 = "neura.constant"() <{predicate = true, value = 128 : i64}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 1 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %8 = "neura.data_mov"(%7) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %9 = "neura.grant_always"(%8) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%6) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %11 = "neura.grant_always"(%10) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %12 = "neura.constant"() <{predicate = true, value = 1 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %13 = "neura.data_mov"(%12) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %14 = "neura.grant_once"(%13) {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %15 = "neura.constant"() <{predicate = true, value = 2 : i32}> {mapping_locs = [{id = 3 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 0 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %16 = "neura.data_mov"(%15) {mapping_locs = [{id = 8 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %17 = "neura.grant_once"(%16) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %18 = "neura.constant"() <{predicate = true, value = 0 : i64}> {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 3 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %19 = "neura.data_mov"(%18) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %20 = "neura.grant_once"(%19) {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %21 = "neura.constant"() <{predicate = true, value = true}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %22 = "neura.data_mov"(%21) {mapping_locs = [{id = 37 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %23 = "neura.grant_always"(%22) {mapping_locs = [{id = 15 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%23) {mapping_locs = [{id = 46 : i32, resource = "link", time_step = 1 : i32}, {id = 45 : i32, resource = "link", time_step = 2 : i32}, {id = 33 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %25 = "neura.data_mov"(%20) {mapping_locs = [{id = 42 : i32, resource = "link", time_step = 1 : i32}, {id = 29 : i32, resource = "link", time_step = 2 : i32}, {id = 14 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %26 = "neura.data_mov"(%9) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 1 : i32}, {id = 33 : i32, resource = "link", time_step = 2 : i32}, {id = 24 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%11) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 1 : i32}, {id = 7 : i32, resource = "link", time_step = 2 : i32}, {id = 25 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %24, start = %25, end = %26, step = %27) {iterationType = "increment", mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data -// CTRLFUSE-MAPPING-NEXT: %28 = "neura.data_mov"(%valid) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %29 = "neura.not"(%28) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%2) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 2 : i32}, {id = 8 : i32, resource = "register", time_step = 3 : i32}, {id = 8 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %31 = "neura.data_mov"(%valid) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %32 = neura.grant_predicate %30, %31 {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%17) {mapping_locs = [{id = 5 : i32, resource = "link", time_step = 3 : i32}, {id = 4 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %34 = "neura.data_mov"(%valid) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %35 = neura.grant_predicate %33, %34 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %36 = "neura.data_mov"(%14) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 4 : i32}, {id = 16 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %37 = "neura.data_mov"(%valid) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 4 : i32}, {id = 31 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %38 = neura.grant_predicate %36, %37 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %39 = "neura.data_mov"(%5) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 6 : i32}, {id = 3 : i32, resource = "link", time_step = 7 : i32}, {id = 6 : i32, resource = "link", time_step = 8 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %40 = "neura.data_mov"(%valid) {mapping_locs = [{id = 18 : i32, resource = "link", time_step = 4 : i32}, {id = 22 : i32, resource = "link", time_step = 5 : i32}, {id = 12 : i32, resource = "register", time_step = 6 : i32}, {id = 12 : i32, resource = "register", time_step = 7 : i32}, {id = 12 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %41 = neura.grant_predicate %39, %40 {mapping_locs = [{id = 3 : i32, resource = "tile", time_step = 9 : i32, x = 3 : i32, y = 0 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %42 = "neura.data_mov"(%32) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %43 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %44 = neura.load_indexed %42[%43 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data -// CTRLFUSE-MAPPING-NEXT: %45 = "neura.data_mov"(%44) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %46 = "neura.data_mov"(%35) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %47 = "neura.mul"(%45, %46) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %48 = "neura.data_mov"(%47) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %49 = "neura.data_mov"(%38) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %50 = "neura.add"(%48, %49) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %51 = "neura.data_mov"(%50) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 8 : i32}, {id = 33 : i32, resource = "link", time_step = 9 : i32}, {id = 26 : i32, resource = "register", time_step = 10 : i32}, {id = 26 : i32, resource = "register", time_step = 11 : i32}, {id = 26 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %52 = "neura.data_mov"(%41) {mapping_locs = [{id = 9 : i32, resource = "link", time_step = 9 : i32}, {id = 21 : i32, resource = "link", time_step = 10 : i32}, {id = 27 : i32, resource = "register", time_step = 11 : i32}, {id = 27 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// CTRLFUSE-MAPPING-NEXT: %53 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: neura.store_indexed %51 to %52[%53 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 13 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data -// CTRLFUSE-MAPPING-NEXT: "neura.return"() {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : () -> () -// CTRLFUSE-MAPPING-NEXT: } \ No newline at end of file +// FUSE-MAPPING: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {CompiledII = 4 : i32, RecMII = 1 : i32, ResMII = 2 : i32, accelerator = "neura", llvm.linkage = #llvm.linkage} { +// FUSE-MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %2 = "neura.grant_always"() <{constant_value = 1 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %3 = "neura.grant_always"() <{constant_value = 128 : i64}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 1 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %4 = "neura.grant_once"() <{constant_value = 1 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %5 = "neura.grant_once"() <{constant_value = 2 : i32}> {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %6 = "neura.grant_once"() <{constant_value = 0 : i64}> {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 3 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %7 = "neura.grant_always"() <{constant_value = true}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %8 = "neura.data_mov"(%7) {mapping_locs = [{id = 35 : i32, resource = "link", time_step = 0 : i32}, {id = 33 : i32, resource = "link", time_step = 1 : i32}, {id = 24 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %9 = "neura.data_mov"(%6) {mapping_locs = [{id = 41 : i32, resource = "link", time_step = 0 : i32}, {id = 45 : i32, resource = "link", time_step = 1 : i32}, {id = 33 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%3) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 0 : i32}, {id = 25 : i32, resource = "register", time_step = 1 : i32}, {id = 25 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %11 = "neura.data_mov"(%2) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}, {id = 3 : i32, resource = "link", time_step = 1 : i32}, {id = 7 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %8, start = %9, end = %10, step = %11) {iterationType = "increment", mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// FUSE-MAPPING-NEXT: %12 = "neura.data_mov"(%valid) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %13 = "neura.not"(%12) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %14 = "neura.data_mov"(%0) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}, {id = 3 : i32, resource = "link", time_step = 2 : i32}, {id = 7 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %15 = "neura.data_mov"(%valid) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %16 = neura.grant_predicate %14, %15 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %17 = "neura.data_mov"(%5) {mapping_locs = [{id = 38 : i32, resource = "link", time_step = 2 : i32}, {id = 41 : i32, resource = "link", time_step = 3 : i32}, {id = 56 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %18 = "neura.data_mov"(%valid) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 3 : i32}, {id = 34 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %19 = neura.grant_predicate %17, %18 {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 3 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %20 = "neura.data_mov"(%4) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 4 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %21 = "neura.data_mov"(%valid) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 3 : i32}, {id = 15 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %22 = neura.grant_predicate %20, %21 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %23 = "neura.data_mov"(%1) {mapping_locs = [{id = 38 : i32, resource = "link", time_step = 4 : i32}, {id = 42 : i32, resource = "link", time_step = 5 : i32}, {id = 36 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%valid) {mapping_locs = [{id = 18 : i32, resource = "link", time_step = 3 : i32}, {id = 23 : i32, resource = "link", time_step = 4 : i32}, {id = 35 : i32, resource = "link", time_step = 5 : i32}, {id = 31 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %25 = neura.grant_predicate %23, %24 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %26 = "neura.data_mov"(%16) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%nextindex) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 3 : i32}, {id = 8 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %28 = neura.load_indexed %26[%27 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data +// FUSE-MAPPING-NEXT: %29 = "neura.data_mov"(%28) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 5 : i32}, {id = 9 : i32, resource = "link", time_step = 6 : i32}, {id = 28 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%19) {mapping_locs = [{id = 44 : i32, resource = "link", time_step = 5 : i32}, {id = 47 : i32, resource = "link", time_step = 6 : i32}, {id = 36 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %31 = "neura.mul"(%29, %30) {mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 8 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %32 = "neura.data_mov"(%31) {mapping_locs = [{id = 21 : i32, resource = "link", time_step = 8 : i32}, {id = 17 : i32, resource = "link", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%22) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 5 : i32}, {id = 20 : i32, resource = "register", time_step = 6 : i32}, {id = 20 : i32, resource = "register", time_step = 7 : i32}, {id = 20 : i32, resource = "register", time_step = 8 : i32}, {id = 20 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %34 = "neura.add"(%32, %33) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %35 = "neura.data_mov"(%34) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 10 : i32}, {id = 24 : i32, resource = "register", time_step = 11 : i32}, {id = 24 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %36 = "neura.data_mov"(%25) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 7 : i32}, {id = 33 : i32, resource = "link", time_step = 8 : i32}, {id = 26 : i32, resource = "register", time_step = 9 : i32}, {id = 26 : i32, resource = "register", time_step = 10 : i32}, {id = 26 : i32, resource = "register", time_step = 11 : i32}, {id = 26 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %37 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: neura.store_indexed %35 to %36[%37 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 13 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data +// FUSE-MAPPING-NEXT: "neura.return"() {mapping_locs = [{id = 15 : i32, resource = "tile", time_step = 6 : i32, x = 3 : i32, y = 3 : i32}]} : () -> () +// FUSE-MAPPING-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir index fdac5a3f..50e189fb 100644 --- a/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir +++ b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir @@ -40,7 +40,9 @@ // RUN: --canonicalize-live-in \ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ -// RUN: --fuse-control-flow | FileCheck %s -check-prefix=CTRLFUSE +// RUN: --fuse-control-flow \ +// RUN: --fold-constant \ +// RUN: | FileCheck %s -check-prefix=FUSE // RUN: mlir-neura-opt %t-llvm.mlir \ // RUN: --assign-accelerator \ @@ -53,8 +55,9 @@ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ // RUN: --fuse-control-flow \ +// RUN: --fold-constant \ // RUN: --insert-data-mov \ -// RUN: --map-to-accelerator="mapping-strategy=heuristic" | FileCheck %s -check-prefix=CTRLFUSE-MAPPING +// RUN: --map-to-accelerator="mapping-strategy=heuristic" | FileCheck %s -check-prefix=FUSE-MAPPING module attributes {} { func.func @_Z10simpleloopv() -> i32 attributes {llvm.linkage = #llvm.linkage} { @@ -139,68 +142,53 @@ module attributes {} { // CTRL2DATA-NEXT: } -// CTRLFUSE: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CTRLFUSE-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CTRLFUSE-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data -// CTRLFUSE-NEXT: %2 = "neura.grant_always"(%1) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %3 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data -// CTRLFUSE-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CTRLFUSE-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %8 = "neura.constant"() <{predicate = true, value = true}> : () -> !neura.data -// CTRLFUSE-NEXT: %9 = "neura.grant_always"(%8) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %9, start = %7, end = %2, step = %3) {iterationType = "increment"} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data -// CTRLFUSE-NEXT: %10 = "neura.not"(%valid) : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %11 = neura.reserve : !neura.data -// CTRLFUSE-NEXT: %12 = "neura.phi"(%11, %5) : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-NEXT: %13 = neura.grant_predicate %12, %valid : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-NEXT: %14 = neura.grant_predicate %12, %10 : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-NEXT: %15 = "neura.cast"(%nextindex) <{cast_type = "i64_to_i32"}> : (!neura.data) -> !neura.data -// CTRLFUSE-NEXT: %16 = "neura.add"(%13, %15) : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-NEXT: neura.ctrl_mov %16 -> %11 : !neura.data !neura.data -// CTRLFUSE-NEXT: "neura.return"(%14) : (!neura.data) -> () -// CTRLFUSE-NEXT: } +// FUSE: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// FUSE-NEXT: %0 = "neura.grant_always"() <{constant_value = 1 : i64}> : () -> !neura.data +// FUSE-NEXT: %1 = "neura.grant_always"() <{constant_value = 128 : i64}> : () -> !neura.data +// FUSE-NEXT: %2 = "neura.grant_once"() <{constant_value = 0 : i32}> : () -> !neura.data +// FUSE-NEXT: %3 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// FUSE-NEXT: %4 = "neura.grant_always"() <{constant_value = true}> : () -> !neura.data +// FUSE-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %4, start = %3, end = %1, step = %0) {iterationType = "increment"} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// FUSE-NEXT: %5 = "neura.not"(%valid) : (!neura.data) -> !neura.data +// FUSE-NEXT: %6 = neura.reserve : !neura.data +// FUSE-NEXT: %7 = "neura.phi"(%6, %2) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %8 = neura.grant_predicate %7, %valid : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %9 = neura.grant_predicate %7, %5 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %10 = "neura.cast"(%nextindex) <{cast_type = "i64_to_i32"}> : (!neura.data) -> !neura.data +// FUSE-NEXT: %11 = "neura.add"(%8, %10) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %11 -> %6 : !neura.data !neura.data +// FUSE-NEXT: "neura.return"(%9) : (!neura.data) -> () +// FUSE-NEXT: } -// CTRLFUSE-MAPPING: func.func @_Z10simpleloopv() -> i32 attributes {CompiledII = 3 : i32, RecMII = 3 : i32, ResMII = 2 : i32, accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CTRLFUSE-MAPPING-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : i64}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : i64}> {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %2 = "neura.data_mov"(%1) {mapping_locs = [{id = 39 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %3 = "neura.grant_always"(%2) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %4 = "neura.data_mov"(%0) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %5 = "neura.grant_always"(%4) {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %7 = "neura.data_mov"(%6) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %8 = "neura.grant_once"(%7) {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %9 = "neura.constant"() <{predicate = true, value = 0 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%9) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %11 = "neura.grant_once"(%10) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %12 = "neura.constant"() <{predicate = true, value = true}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 2 : i32}]} : () -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %13 = "neura.data_mov"(%12) {mapping_locs = [{id = 29 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %14 = "neura.grant_always"(%13) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %15 = "neura.data_mov"(%14) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %16 = "neura.data_mov"(%11) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 1 : i32}, {id = 20 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %17 = "neura.data_mov"(%3) {mapping_locs = [{id = 24 : i32, resource = "link", time_step = 1 : i32}, {id = 29 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %18 = "neura.data_mov"(%5) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 1 : i32}, {id = 21 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %15, start = %16, end = %17, step = %18) {iterationType = "increment", mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data -// CTRLFUSE-MAPPING-NEXT: %19 = "neura.data_mov"(%valid) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %20 = "neura.not"(%19) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %21 = neura.reserve : !neura.data -// CTRLFUSE-MAPPING-NEXT: %22 = "neura.data_mov"(%8) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 4 : i32, resource = "register", time_step = 3 : i32}, {id = 4 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %23 = "neura.phi"(%21, %22) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%23) {mapping_locs = []} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %25 = "neura.data_mov"(%valid) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 3 : i32}, {id = 5 : i32, resource = "register", time_step = 4 : i32}, {id = 5 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %26 = neura.grant_predicate %24, %25 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%23) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %28 = "neura.data_mov"(%20) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 4 : i32}, {id = 8 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %29 = neura.grant_predicate %27, %28 {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%nextindex) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %31 = "neura.cast"(%30) <{cast_type = "i64_to_i32"}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %32 = "neura.data_mov"(%26) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%31) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 4 : i32}, {id = 33 : i32, resource = "link", time_step = 5 : i32}, {id = 19 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: %34 = "neura.add"(%32, %33) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: neura.ctrl_mov %34 -> %21 {mapping_locs = [{id = 5 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data -// CTRLFUSE-MAPPING-NEXT: %35 = "neura.data_mov"(%29) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// CTRLFUSE-MAPPING-NEXT: "neura.return"(%35) {mapping_locs = [{id = 3 : i32, resource = "tile", time_step = 7 : i32, x = 3 : i32, y = 0 : i32}]} : (!neura.data) -> () -// CTRLFUSE-MAPPING-NEXT: } \ No newline at end of file +// FUSE-MAPPING: func.func @_Z10simpleloopv() -> i32 attributes {CompiledII = 3 : i32, RecMII = 3 : i32, ResMII = 1 : i32, accelerator = "neura", llvm.linkage = #llvm.linkage} { +// FUSE-MAPPING-NEXT: %0 = "neura.grant_always"() <{constant_value = 1 : i64}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %1 = "neura.grant_always"() <{constant_value = 128 : i64}> {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %2 = "neura.grant_once"() <{constant_value = 0 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %3 = "neura.grant_once"() <{constant_value = 0 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %4 = "neura.grant_always"() <{constant_value = true}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 2 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %5 = "neura.data_mov"(%4) {mapping_locs = [{id = 27 : i32, resource = "link", time_step = 0 : i32}, {id = 32 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %6 = "neura.data_mov"(%3) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 0 : i32}, {id = 12 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %7 = "neura.data_mov"(%1) {mapping_locs = [{id = 39 : i32, resource = "link", time_step = 0 : i32}, {id = 33 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %8 = "neura.data_mov"(%0) {mapping_locs = [{id = 12 : i32, resource = "link", time_step = 0 : i32}, {id = 34 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %5, start = %6, end = %7, step = %8) {iterationType = "increment", mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// FUSE-MAPPING-NEXT: %9 = "neura.data_mov"(%valid) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %10 = "neura.not"(%9) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %11 = neura.reserve : !neura.data +// FUSE-MAPPING-NEXT: %12 = "neura.data_mov"(%2) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}, {id = 4 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %13 = "neura.phi"(%11, %12) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %14 = "neura.data_mov"(%13) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %15 = "neura.data_mov"(%valid) {mapping_locs = [{id = 24 : i32, resource = "link", time_step = 2 : i32}, {id = 29 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %16 = neura.grant_predicate %14, %15 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %17 = "neura.data_mov"(%13) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 3 : i32}, {id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %18 = "neura.data_mov"(%10) {mapping_locs = [{id = 25 : i32, resource = "link", time_step = 3 : i32}, {id = 11 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %19 = neura.grant_predicate %17, %18 {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 5 : i32, x = 0 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %20 = "neura.data_mov"(%nextindex) {mapping_locs = [{id = 25 : i32, resource = "link", time_step = 2 : i32}, {id = 16 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %21 = "neura.cast"(%20) <{cast_type = "i64_to_i32"}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %22 = "neura.data_mov"(%16) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %23 = "neura.data_mov"(%21) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %24 = "neura.add"(%22, %23) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: neura.ctrl_mov %24 -> %11 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data +// FUSE-MAPPING-NEXT: %25 = "neura.data_mov"(%19) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 5 : i32}, {id = 4 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: "neura.return"(%25) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> () +// FUSE-MAPPING-NEXT: } \ No newline at end of file diff --git a/test/neura/ctrl/branch_for.mlir b/test/neura/ctrl/branch_for.mlir index 97c91c63..bd7e649e 100644 --- a/test/neura/ctrl/branch_for.mlir +++ b/test/neura/ctrl/branch_for.mlir @@ -25,6 +25,16 @@ // RUN: --canonicalize-live-in \ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ +// RUN: --fold-constant \ +// RUN: | FileCheck %s -check-prefix=FUSE + +// RUN: mlir-neura-opt %s \ +// RUN: --assign-accelerator \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: --fold-constant \ // RUN: --insert-data-mov \ // RUN: | FileCheck %s -check-prefix=MOV @@ -34,8 +44,9 @@ // RUN: --canonicalize-live-in \ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ +// RUN: --fold-constant \ // RUN: --insert-data-mov \ -// RUN: --map-to-accelerator="mapping-strategy=simple" \ +// RUN: --map-to-accelerator="mapping-strategy=heuristic" \ // RUN: | FileCheck %s -check-prefix=MAPPING // RUN: mlir-neura-opt %s \ @@ -44,8 +55,9 @@ // RUN: --canonicalize-live-in \ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ +// RUN: --fold-constant \ // RUN: --insert-data-mov \ -// RUN: --map-to-accelerator="mapping-strategy=simple" \ +// RUN: --map-to-accelerator="mapping-strategy=heuristic" \ // RUN: --generate-code // RUN: FileCheck %s --input-file=generated-instructions.json -check-prefix=INST @@ -139,142 +151,156 @@ func.func @loop_test() -> f32 { // CTRL2DATA-NEXT: "neura.return"(%29) : (!neura.data) -> () // CTRL2DATA-NEXT: } +// FUSE: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { +// FUSE-NEXT: %0 = "neura.grant_once"() <{constant_value = 10 : i64}> : () -> !neura.data +// FUSE-NEXT: %1 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// FUSE-NEXT: %2 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data +// FUSE-NEXT: %3 = "neura.grant_once"() <{constant_value = 3.000000e+00 : f32}> : () -> !neura.data +// FUSE-NEXT: %4 = "neura.grant_once"() <{constant_value = 0.000000e+00 : f32}> : () -> !neura.data +// FUSE-NEXT: %5 = neura.reserve : !neura.data +// FUSE-NEXT: %6 = "neura.phi"(%5, %0) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %7 = neura.reserve : !neura.data +// FUSE-NEXT: %8 = "neura.phi"(%7, %2) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %9 = neura.reserve : !neura.data +// FUSE-NEXT: %10 = "neura.phi"(%9, %3) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %11 = neura.reserve : !neura.data +// FUSE-NEXT: %12 = "neura.phi"(%11, %4) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %13 = neura.reserve : !neura.data +// FUSE-NEXT: %14 = "neura.phi"(%13, %1) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %15 = "neura.fadd"(%12, %10) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %16 = "neura.add"(%14, %8) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %17 = "neura.icmp"(%16, %6) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %18 = neura.grant_predicate %16, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %18 -> %13 : !neura.data !neura.data +// FUSE-NEXT: %19 = neura.grant_predicate %15, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %19 -> %11 : !neura.data !neura.data +// FUSE-NEXT: %20 = neura.grant_predicate %3, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %20 -> %9 : !neura.data !neura.data +// FUSE-NEXT: %21 = neura.grant_predicate %2, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %21 -> %7 : !neura.data !neura.data +// FUSE-NEXT: %22 = neura.grant_predicate %0, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %22 -> %5 : !neura.data !neura.data +// FUSE-NEXT: %23 = "neura.not"(%17) : (!neura.data) -> !neura.data +// FUSE-NEXT: %24 = neura.grant_predicate %15, %23 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: "neura.return"(%24) : (!neura.data) -> () +// FUSE-NEXT: } + // MOV: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { -// MOV-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> : () -> !neura.data -// MOV-NEXT: %1 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// MOV-NEXT: %2 = "neura.grant_once"(%1) : (!neura.data) -> !neura.data -// MOV-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// MOV-NEXT: %4 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data -// MOV-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data -// MOV-NEXT: %6 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// MOV-NEXT: %7 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data -// MOV-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data -// MOV-NEXT: %9 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data -// MOV-NEXT: %10 = "neura.data_mov"(%9) : (!neura.data) -> !neura.data -// MOV-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data -// MOV-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> : () -> !neura.data -// MOV-NEXT: %13 = "neura.data_mov"(%12) : (!neura.data) -> !neura.data -// MOV-NEXT: %14 = "neura.grant_once"(%13) : (!neura.data) -> !neura.data -// MOV-NEXT: %15 = neura.reserve : !neura.data -// MOV-NEXT: %16 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data -// MOV-NEXT: %17 = "neura.phi"(%15, %16) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %18 = neura.reserve : !neura.data -// MOV-NEXT: %19 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data -// MOV-NEXT: %20 = "neura.phi"(%18, %19) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %21 = neura.reserve : !neura.data -// MOV-NEXT: %22 = "neura.data_mov"(%11) : (!neura.data) -> !neura.data -// MOV-NEXT: %23 = "neura.phi"(%21, %22) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %24 = neura.reserve : !neura.data -// MOV-NEXT: %25 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data -// MOV-NEXT: %26 = "neura.phi"(%24, %25) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %27 = neura.reserve : !neura.data -// MOV-NEXT: %28 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// MOV-NEXT: %29 = "neura.phi"(%27, %28) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %30 = "neura.data_mov"(%26) : (!neura.data) -> !neura.data -// MOV-NEXT: %31 = "neura.data_mov"(%23) : (!neura.data) -> !neura.data -// MOV-NEXT: %32 = "neura.fadd"(%30, %31) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %33 = "neura.data_mov"(%29) : (!neura.data) -> !neura.data -// MOV-NEXT: %34 = "neura.data_mov"(%20) : (!neura.data) -> !neura.data -// MOV-NEXT: %35 = "neura.add"(%33, %34) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %36 = "neura.data_mov"(%35) : (!neura.data) -> !neura.data -// MOV-NEXT: %37 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data -// MOV-NEXT: %38 = "neura.icmp"(%36, %37) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %39 = "neura.data_mov"(%35) : (!neura.data) -> !neura.data -// MOV-NEXT: %40 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %41 = neura.grant_predicate %39, %40 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %41 -> %27 : !neura.data !neura.data -// MOV-NEXT: %42 = "neura.data_mov"(%32) : (!neura.data) -> !neura.data -// MOV-NEXT: %43 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %44 = neura.grant_predicate %42, %43 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %44 -> %24 : !neura.data !neura.data -// MOV-NEXT: %45 = "neura.data_mov"(%11) : (!neura.data) -> !neura.data -// MOV-NEXT: %46 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %47 = neura.grant_predicate %45, %46 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %47 -> %21 : !neura.data !neura.data -// MOV-NEXT: %48 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data -// MOV-NEXT: %49 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %50 = neura.grant_predicate %48, %49 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %50 -> %18 : !neura.data !neura.data -// MOV-NEXT: %51 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data -// MOV-NEXT: %52 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %53 = neura.grant_predicate %51, %52 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %53 -> %15 : !neura.data !neura.data -// MOV-NEXT: %54 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %55 = "neura.not"(%54) : (!neura.data) -> !neura.data -// MOV-NEXT: %56 = "neura.data_mov"(%32) : (!neura.data) -> !neura.data -// MOV-NEXT: %57 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// MOV-NEXT: %58 = neura.grant_predicate %56, %57 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: %59 = "neura.data_mov"(%58) : (!neura.data) -> !neura.data -// MOV-NEXT: "neura.return"(%59) : (!neura.data) -> () +// MOV-NEXT: %0 = "neura.grant_once"() <{constant_value = 10 : i64}> : () -> !neura.data +// MOV-NEXT: %1 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// MOV-NEXT: %2 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data +// MOV-NEXT: %3 = "neura.grant_once"() <{constant_value = 3.000000e+00 : f32}> : () -> !neura.data +// MOV-NEXT: %4 = "neura.grant_once"() <{constant_value = 0.000000e+00 : f32}> : () -> !neura.data +// MOV-NEXT: %5 = neura.reserve : !neura.data +// MOV-NEXT: %6 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data +// MOV-NEXT: %7 = "neura.phi"(%5, %6) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %8 = neura.reserve : !neura.data +// MOV-NEXT: %9 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// MOV-NEXT: %10 = "neura.phi"(%8, %9) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %11 = neura.reserve : !neura.data +// MOV-NEXT: %12 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// MOV-NEXT: %13 = "neura.phi"(%11, %12) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %14 = neura.reserve : !neura.data +// MOV-NEXT: %15 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data +// MOV-NEXT: %16 = "neura.phi"(%14, %15) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %17 = neura.reserve : !neura.data +// MOV-NEXT: %18 = "neura.data_mov"(%1) : (!neura.data) -> !neura.data +// MOV-NEXT: %19 = "neura.phi"(%17, %18) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %20 = "neura.data_mov"(%16) : (!neura.data) -> !neura.data +// MOV-NEXT: %21 = "neura.data_mov"(%13) : (!neura.data) -> !neura.data +// MOV-NEXT: %22 = "neura.fadd"(%20, %21) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %23 = "neura.data_mov"(%19) : (!neura.data) -> !neura.data +// MOV-NEXT: %24 = "neura.data_mov"(%10) : (!neura.data) -> !neura.data +// MOV-NEXT: %25 = "neura.add"(%23, %24) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %26 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data +// MOV-NEXT: %27 = "neura.data_mov"(%7) : (!neura.data) -> !neura.data +// MOV-NEXT: %28 = "neura.icmp"(%26, %27) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %29 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data +// MOV-NEXT: %30 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %31 = neura.grant_predicate %29, %30 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %31 -> %17 : !neura.data !neura.data +// MOV-NEXT: %32 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data +// MOV-NEXT: %33 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %34 = neura.grant_predicate %32, %33 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %34 -> %14 : !neura.data !neura.data +// MOV-NEXT: %35 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// MOV-NEXT: %36 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %37 = neura.grant_predicate %35, %36 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %37 -> %11 : !neura.data !neura.data +// MOV-NEXT: %38 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// MOV-NEXT: %39 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %40 = neura.grant_predicate %38, %39 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %40 -> %8 : !neura.data !neura.data +// MOV-NEXT: %41 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data +// MOV-NEXT: %42 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %43 = neura.grant_predicate %41, %42 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %43 -> %5 : !neura.data !neura.data +// MOV-NEXT: %44 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %45 = "neura.not"(%44) : (!neura.data) -> !neura.data +// MOV-NEXT: %46 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data +// MOV-NEXT: %47 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// MOV-NEXT: %48 = neura.grant_predicate %46, %47 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: %49 = "neura.data_mov"(%48) : (!neura.data) -> !neura.data +// MOV-NEXT: "neura.return"(%49) : (!neura.data) -> () // MOV-NEXT: } -// MAPPING: func.func @loop_test() -> f32 attributes {CompiledII = 6 : i32, RecMII = 4 : i32, ResMII = 2 : i32, accelerator = "neura"} { -// MAPPING-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %1 = "neura.data_mov"(%0) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %2 = "neura.grant_once"(%1) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %4 = "neura.data_mov"(%3) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %5 = "neura.grant_once"(%4) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %6 = "neura.constant"() <{predicate = true, value = 1 : i64}> {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 0 : i32, x = 2 : i32, y = 0 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %7 = "neura.data_mov"(%6) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %8 = "neura.grant_once"(%7) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 1 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %9 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 3 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {mapping_locs = [{id = 45 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %11 = "neura.grant_once"(%10) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %13 = "neura.data_mov"(%12) {mapping_locs = [{id = 36 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %14 = "neura.grant_once"(%13) {mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %15 = neura.reserve : !neura.data -// MAPPING-NEXT: %16 = "neura.data_mov"(%2) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %17 = "neura.phi"(%15, %16) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %18 = neura.reserve : !neura.data -// MAPPING-NEXT: %19 = "neura.data_mov"(%8) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %20 = "neura.phi"(%18, %19) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %21 = neura.reserve : !neura.data -// MAPPING-NEXT: %22 = "neura.data_mov"(%11) {mapping_locs = [{id = 34 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %23 = "neura.phi"(%21, %22) {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %24 = neura.reserve : !neura.data -// MAPPING-NEXT: %25 = "neura.data_mov"(%14) {mapping_locs = [{id = 21 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %26 = "neura.phi"(%24, %25) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %27 = neura.reserve : !neura.data -// MAPPING-NEXT: %28 = "neura.data_mov"(%5) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %29 = "neura.phi"(%27, %28) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %30 = "neura.data_mov"(%26) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %31 = "neura.data_mov"(%23) {mapping_locs = [{id = 45 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %32 = "neura.fadd"(%30, %31) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %33 = "neura.data_mov"(%29) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %34 = "neura.data_mov"(%20) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %35 = "neura.add"(%33, %34) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %36 = "neura.data_mov"(%35) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %37 = "neura.data_mov"(%17) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %38 = "neura.icmp"(%36, %37) <{cmpType = "slt"}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %39 = "neura.data_mov"(%35) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %40 = "neura.data_mov"(%38) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %41 = neura.grant_predicate %39, %40 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %41 -> %27 {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 5 : i32}, {id = 20 : i32, resource = "register", time_step = 6 : i32}, {id = 20 : i32, resource = "register", time_step = 7 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %42 = "neura.data_mov"(%32) {mapping_locs = [{id = 33 : i32, resource = "link", time_step = 5 : i32}, {id = 17 : i32, resource = "link", time_step = 6 : i32}, {id = 21 : i32, resource = "register", time_step = 7 : i32}, {id = 21 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %43 = "neura.data_mov"(%38) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %44 = neura.grant_predicate %42, %43 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %44 -> %24 {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 9 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %45 = "neura.data_mov"(%11) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 3 : i32}, {id = 27 : i32, resource = "link", time_step = 4 : i32}, {id = 32 : i32, resource = "register", time_step = 5 : i32}, {id = 32 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %46 = "neura.data_mov"(%38) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 4 : i32}, {id = 12 : i32, resource = "link", time_step = 5 : i32}, {id = 33 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %47 = neura.grant_predicate %45, %46 {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %47 -> %21 {mapping_locs = [{id = 24 : i32, resource = "link", time_step = 7 : i32}, {id = 30 : i32, resource = "link", time_step = 8 : i32}, {id = 41 : i32, resource = "link", time_step = 9 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %48 = "neura.data_mov"(%8) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 1 : i32}, {id = 24 : i32, resource = "register", time_step = 2 : i32}, {id = 24 : i32, resource = "register", time_step = 3 : i32}, {id = 24 : i32, resource = "register", time_step = 4 : i32}, {id = 24 : i32, resource = "register", time_step = 5 : i32}, {id = 24 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %49 = "neura.data_mov"(%38) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 4 : i32}, {id = 28 : i32, resource = "link", time_step = 5 : i32}, {id = 33 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %50 = neura.grant_predicate %48, %49 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %50 -> %18 {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %51 = "neura.data_mov"(%2) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 2 : i32}, {id = 21 : i32, resource = "register", time_step = 3 : i32}, {id = 21 : i32, resource = "register", time_step = 4 : i32}, {id = 21 : i32, resource = "register", time_step = 5 : i32}, {id = 21 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %52 = "neura.data_mov"(%38) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %53 = neura.grant_predicate %51, %52 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %53 -> %15 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 7 : i32}, {id = 4 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %54 = "neura.data_mov"(%38) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %55 = "neura.not"(%54) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %56 = "neura.data_mov"(%32) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 5 : i32}, {id = 36 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %57 = "neura.data_mov"(%55) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 5 : i32}, {id = 16 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %58 = neura.grant_predicate %56, %57 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %59 = "neura.data_mov"(%58) {mapping_locs = [{id = 30 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: "neura.return"(%59) {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 3 : i32}]} : (!neura.data) -> () +// MAPPING: func.func @loop_test() -> f32 attributes {CompiledII = 5 : i32, RecMII = 4 : i32, ResMII = 2 : i32, accelerator = "neura"} { +// MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = 10 : i64}> {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = 0 : i64}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %2 = "neura.grant_once"() <{constant_value = 1 : i64}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %3 = "neura.grant_once"() <{constant_value = 3.000000e+00 : f32}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %4 = "neura.grant_once"() <{constant_value = 0.000000e+00 : f32}> {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %5 = neura.reserve : !neura.data +// MAPPING-NEXT: %6 = "neura.data_mov"(%0) {mapping_locs = [{id = 24 : i32, resource = "link", time_step = 1 : i32}, {id = 36 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %7 = "neura.phi"(%5, %6) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %8 = neura.reserve : !neura.data +// MAPPING-NEXT: %9 = "neura.data_mov"(%2) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %10 = "neura.phi"(%8, %9) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %11 = neura.reserve : !neura.data +// MAPPING-NEXT: %12 = "neura.data_mov"(%3) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %13 = "neura.phi"(%11, %12) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %14 = neura.reserve : !neura.data +// MAPPING-NEXT: %15 = "neura.data_mov"(%4) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %16 = "neura.phi"(%14, %15) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %17 = neura.reserve : !neura.data +// MAPPING-NEXT: %18 = "neura.data_mov"(%1) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %19 = "neura.phi"(%17, %18) {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %20 = "neura.data_mov"(%16) {mapping_locs = [{id = 25 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %21 = "neura.data_mov"(%13) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %22 = "neura.fadd"(%20, %21) {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %23 = "neura.data_mov"(%19) {mapping_locs = [{id = 35 : i32, resource = "link", time_step = 1 : i32}, {id = 40 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %24 = "neura.data_mov"(%10) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %25 = "neura.add"(%23, %24) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %27 = "neura.data_mov"(%7) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %28 = "neura.icmp"(%26, %27) <{cmpType = "slt"}> {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %29 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %30 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %31 = neura.grant_predicate %29, %30 {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %31 -> %17 {mapping_locs = [{id = 32 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %32 = "neura.data_mov"(%22) {mapping_locs = [{id = 12 : i32, resource = "link", time_step = 4 : i32}, {id = 26 : i32, resource = "link", time_step = 5 : i32}, {id = 48 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %33 = "neura.data_mov"(%28) {mapping_locs = [{id = 34 : i32, resource = "link", time_step = 4 : i32}, {id = 43 : i32, resource = "link", time_step = 5 : i32}, {id = 40 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %34 = neura.grant_predicate %32, %33 {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 3 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %34 -> %14 {mapping_locs = [{id = 39 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %35 = "neura.data_mov"(%3) {mapping_locs = [{id = 11 : i32, resource = "link", time_step = 2 : i32}, {id = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 3 : i32, resource = "link", time_step = 4 : i32}, {id = 7 : i32, resource = "link", time_step = 5 : i32}, {id = 24 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %36 = "neura.data_mov"(%28) {mapping_locs = [{id = 32 : i32, resource = "link", time_step = 4 : i32}, {id = 36 : i32, resource = "link", time_step = 5 : i32}, {id = 21 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %37 = neura.grant_predicate %35, %36 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %37 -> %11 {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %38 = "neura.data_mov"(%2) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 0 : i32}, {id = 41 : i32, resource = "register", time_step = 1 : i32}, {id = 41 : i32, resource = "register", time_step = 2 : i32}, {id = 41 : i32, resource = "register", time_step = 3 : i32}, {id = 41 : i32, resource = "register", time_step = 4 : i32}, {id = 41 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %39 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %40 = neura.grant_predicate %38, %39 {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %40 -> %8 {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 6 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %41 = "neura.data_mov"(%0) {mapping_locs = [{id = 26 : i32, resource = "link", time_step = 1 : i32}, {id = 38 : i32, resource = "link", time_step = 2 : i32}, {id = 42 : i32, resource = "link", time_step = 3 : i32}, {id = 36 : i32, resource = "register", time_step = 4 : i32}, {id = 36 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %42 = "neura.data_mov"(%28) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 4 : i32}, {id = 37 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %43 = neura.grant_predicate %41, %42 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %43 -> %5 {mapping_locs = []} : !neura.data !neura.data +// MAPPING-NEXT: %44 = "neura.data_mov"(%28) {mapping_locs = [{id = 33 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %45 = "neura.not"(%44) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %46 = "neura.data_mov"(%22) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 4 : i32}, {id = 14 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %47 = "neura.data_mov"(%45) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %48 = neura.grant_predicate %46, %47 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %49 = "neura.data_mov"(%48) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.return"(%49) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data) -> () // MAPPING-NEXT: } // INST: "name": "neura.fadd", diff --git a/test/neura/fadd_fadd.mlir b/test/neura/fadd_fadd.mlir index 87ca3f8e..3d022772 100644 --- a/test/neura/fadd_fadd.mlir +++ b/test/neura/fadd_fadd.mlir @@ -1,5 +1,5 @@ // Applies pattern fusion before mov insertion. -// RUN: mlir-neura-opt --assign-accelerator --lower-arith-to-neura --fuse-patterns --insert-data-mov %s | FileCheck %s +// RUN: mlir-neura-opt --assign-accelerator --lower-arith-to-neura --fuse-pattern --insert-data-mov %s | FileCheck %s func.func @test(%a: f32, %b: f32) -> f32 { %c = arith.constant 2.0 : f32 @@ -7,4 +7,4 @@ func.func @test(%a: f32, %b: f32) -> f32 { %res = arith.addf %temp, %c : f32 // CHECK: neura.fadd_fadd return %res : f32 -} +} \ No newline at end of file diff --git a/test/neura/for_loop/test.mlir b/test/neura/for_loop/test.mlir index 618b887d..a4bfd59b 100644 --- a/test/neura/for_loop/test.mlir +++ b/test/neura/for_loop/test.mlir @@ -17,7 +17,8 @@ // RUN: --canonicalize-live-in \ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ -// RUN: --fuse-patterns \ +// RUN: --fold-constant \ +// RUN: --fuse-pattern \ // RUN: | FileCheck %s --check-prefix=CHECK-FUSED // RUN: mlir-neura-opt %t-kernel.mlir\ @@ -26,7 +27,8 @@ // RUN: --canonicalize-live-in \ // RUN: --leverage-predicated-value \ // RUN: --transform-ctrl-to-data-flow \ -// RUN: --fuse-patterns \ +// RUN: --fold-constant \ +// RUN: --fuse-pattern \ // RUN: --insert-data-mov \ // RUN: | FileCheck %s --check-prefix=CHECK-MOV @@ -55,157 +57,141 @@ // CHECK-NEXT: } // Verifies the neura ops are generated. And fusion happens. -// CHECK-FUSED: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { -// CHECK-FUSED-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data) -> !neura.data +// CHECK-FUSED: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { +// CHECK-FUSED-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data +// CHECK-FUSED-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data // CHECK-FUSED-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %4 = "neura.constant"() <{predicate = true, value = "%arg2"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %10 = "neura.constant"() <{predicate = true, value = 32 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %12 = "neura.load"(%2) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %14 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %15 = "neura.phi"(%14, %11) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %16 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %17 = "neura.phi"(%16, %9) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %18 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %19 = "neura.phi"(%18, %3) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %20 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %21 = "neura.phi"(%20, %5) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %22 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %23 = "neura.phi"(%22, %1) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %24 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %25 = "neura.phi"(%24, %13) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %26 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %27 = "neura.phi"(%26, %7) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %28 = "neura.gep"(%23, %27) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %29 = "neura.load"(%28) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %30 = "neura.gep"(%21, %27) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %31 = "neura.load"(%30) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %32 = "neura.fmul_fadd"(%29, %31, %25) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: "neura.store"(%32, %19) : (!neura.data, !neura.data) -> () -// CHECK-FUSED-NEXT: %33 = "neura.add"(%27, %17) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %34 = "neura.icmp"(%33, %15) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %35 = "neura.not"(%34) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %36 = neura.grant_predicate %33, %35 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %36 -> %26 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %37 = neura.grant_predicate %32, %35 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %37 -> %24 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %38 = neura.grant_predicate %1, %35 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %38 -> %22 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %39 = neura.grant_predicate %5, %35 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %39 -> %20 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %40 = neura.grant_predicate %3, %35 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %40 -> %18 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %41 = neura.grant_predicate %9, %35 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %41 -> %16 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %42 = neura.grant_predicate %11, %35 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %42 -> %14 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %3 = "neura.grant_once"() <{constant_value = "%arg2"}> : () -> !neura.data +// CHECK-FUSED-NEXT: %4 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// CHECK-FUSED-NEXT: %5 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data +// CHECK-FUSED-NEXT: %6 = "neura.grant_once"() <{constant_value = 32 : i64}> : () -> !neura.data +// CHECK-FUSED-NEXT: %7 = "neura.load"(%2) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %9 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %10 = "neura.phi"(%9, %6) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %11 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %12 = "neura.phi"(%11, %5) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %13 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %14 = "neura.phi"(%13, %1) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %15 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %16 = "neura.phi"(%15, %3) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %17 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %18 = "neura.phi"(%17, %0) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %19 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %20 = "neura.phi"(%19, %8) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %21 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %22 = "neura.phi"(%21, %4) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %23 = "neura.gep"(%18, %22) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %24 = "neura.load"(%23) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %25 = "neura.gep"(%16, %22) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %26 = "neura.load"(%25) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %27 = "neura.fmul_fadd"(%24, %26, %20) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: "neura.store"(%27, %14) : (!neura.data, !neura.data) -> () +// CHECK-FUSED-NEXT: %28 = "neura.add"(%22, %12) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %29 = "neura.icmp"(%28, %10) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %30 = "neura.not"(%29) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %31 = neura.grant_predicate %28, %30 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %31 -> %21 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %32 = neura.grant_predicate %27, %30 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %32 -> %19 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %33 = neura.grant_predicate %0, %30 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %33 -> %17 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %34 = neura.grant_predicate %3, %30 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %34 -> %15 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %35 = neura.grant_predicate %1, %30 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %35 -> %13 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %36 = neura.grant_predicate %5, %30 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %36 -> %11 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %37 = neura.grant_predicate %6, %30 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %37 -> %9 : !neura.data !neura.data // CHECK-FUSED-NEXT: "neura.return"() : () -> () // CHECK-FUSED-NEXT: } -// CHECK-MOV: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { -// CHECK-MOV-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data -// CHECK-MOV-NEXT: %1 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %2 = "neura.grant_once"(%1) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %3 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data -// CHECK-MOV-NEXT: %4 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %6 = "neura.constant"() <{predicate = true, value = "%arg2"}> : () -> !neura.data -// CHECK-MOV-NEXT: %7 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %9 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %10 = "neura.data_mov"(%9) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %12 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %13 = "neura.data_mov"(%12) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %14 = "neura.grant_once"(%13) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %15 = "neura.constant"() <{predicate = true, value = 32 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %16 = "neura.data_mov"(%15) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %17 = "neura.grant_once"(%16) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %18 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %19 = "neura.load"(%18) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %20 = "neura.data_mov"(%19) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %21 = "neura.grant_once"(%20) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %22 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %23 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %24 = "neura.phi"(%22, %23) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %25 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %26 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %27 = "neura.phi"(%25, %26) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %28 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %29 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %30 = "neura.phi"(%28, %29) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %31 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %32 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %33 = "neura.phi"(%31, %32) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %34 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %35 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %36 = "neura.phi"(%34, %35) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %37 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %38 = "neura.data_mov"(%21) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %39 = "neura.phi"(%37, %38) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %40 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %41 = "neura.data_mov"(%11) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %42 = "neura.phi"(%40, %41) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %43 = "neura.data_mov"(%36) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %44 = "neura.data_mov"(%42) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %45 = "neura.gep"(%43, %44) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %46 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %47 = "neura.load"(%46) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %48 = "neura.data_mov"(%33) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %49 = "neura.data_mov"(%42) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %50 = "neura.gep"(%48, %49) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %51 = "neura.data_mov"(%50) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %52 = "neura.load"(%51) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %53 = "neura.data_mov"(%47) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %54 = "neura.data_mov"(%52) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %55 = "neura.data_mov"(%39) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %56 = "neura.fmul_fadd"(%53, %54, %55) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %57 = "neura.data_mov"(%56) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %58 = "neura.data_mov"(%30) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: "neura.store"(%57, %58) : (!neura.data, !neura.data) -> () -// CHECK-MOV-NEXT: %59 = "neura.data_mov"(%42) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %60 = "neura.data_mov"(%27) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %61 = "neura.add"(%59, %60) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %62 = "neura.data_mov"(%61) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %63 = "neura.data_mov"(%24) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %64 = "neura.icmp"(%62, %63) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %65 = "neura.data_mov"(%64) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %66 = "neura.not"(%65) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %67 = "neura.data_mov"(%61) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %68 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %69 = neura.grant_predicate %67, %68 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %69 -> %40 : !neura.data !neura.data -// CHECK-MOV-NEXT: %70 = "neura.data_mov"(%56) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %71 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %72 = neura.grant_predicate %70, %71 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %72 -> %37 : !neura.data !neura.data -// CHECK-MOV-NEXT: %73 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %74 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %75 = neura.grant_predicate %73, %74 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %75 -> %34 : !neura.data !neura.data -// CHECK-MOV-NEXT: %76 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %77 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %78 = neura.grant_predicate %76, %77 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %78 -> %31 : !neura.data !neura.data -// CHECK-MOV-NEXT: %79 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %80 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %81 = neura.grant_predicate %79, %80 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %81 -> %28 : !neura.data !neura.data -// CHECK-MOV-NEXT: %82 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %83 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %84 = neura.grant_predicate %82, %83 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %84 -> %25 : !neura.data !neura.data -// CHECK-MOV-NEXT: %85 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %86 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %87 = neura.grant_predicate %85, %86 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %87 -> %22 : !neura.data !neura.data +// CHECK-MOV: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { +// CHECK-MOV-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data +// CHECK-MOV-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data +// CHECK-MOV-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data +// CHECK-MOV-NEXT: %3 = "neura.grant_once"() <{constant_value = "%arg2"}> : () -> !neura.data +// CHECK-MOV-NEXT: %4 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// CHECK-MOV-NEXT: %5 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data +// CHECK-MOV-NEXT: %6 = "neura.grant_once"() <{constant_value = 32 : i64}> : () -> !neura.data +// CHECK-MOV-NEXT: %7 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %8 = "neura.load"(%7) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %9 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %11 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %12 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %13 = "neura.phi"(%11, %12) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %14 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %15 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %16 = "neura.phi"(%14, %15) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %17 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %18 = "neura.data_mov"(%1) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %19 = "neura.phi"(%17, %18) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %20 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %21 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %22 = "neura.phi"(%20, %21) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %23 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %24 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %25 = "neura.phi"(%23, %24) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %26 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %27 = "neura.data_mov"(%10) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %28 = "neura.phi"(%26, %27) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %29 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %30 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %31 = "neura.phi"(%29, %30) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %32 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %33 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %34 = "neura.gep"(%32, %33) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %35 = "neura.data_mov"(%34) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %36 = "neura.load"(%35) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %37 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %38 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %39 = "neura.gep"(%37, %38) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %40 = "neura.data_mov"(%39) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %41 = "neura.load"(%40) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %42 = "neura.data_mov"(%36) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %43 = "neura.data_mov"(%41) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %44 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %45 = "neura.fmul_fadd"(%42, %43, %44) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %46 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %47 = "neura.data_mov"(%19) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: "neura.store"(%46, %47) : (!neura.data, !neura.data) -> () +// CHECK-MOV-NEXT: %48 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %49 = "neura.data_mov"(%16) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %50 = "neura.add"(%48, %49) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %51 = "neura.data_mov"(%50) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %52 = "neura.data_mov"(%13) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %53 = "neura.icmp"(%51, %52) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %54 = "neura.data_mov"(%53) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %55 = "neura.not"(%54) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %56 = "neura.data_mov"(%50) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %57 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %58 = neura.grant_predicate %56, %57 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %58 -> %29 : !neura.data !neura.data +// CHECK-MOV-NEXT: %59 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %60 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %61 = neura.grant_predicate %59, %60 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %61 -> %26 : !neura.data !neura.data +// CHECK-MOV-NEXT: %62 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %63 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %64 = neura.grant_predicate %62, %63 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %64 -> %23 : !neura.data !neura.data +// CHECK-MOV-NEXT: %65 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %66 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %67 = neura.grant_predicate %65, %66 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %67 -> %20 : !neura.data !neura.data +// CHECK-MOV-NEXT: %68 = "neura.data_mov"(%1) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %69 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %70 = neura.grant_predicate %68, %69 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %70 -> %17 : !neura.data !neura.data +// CHECK-MOV-NEXT: %71 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %72 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %73 = neura.grant_predicate %71, %72 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %73 -> %14 : !neura.data !neura.data +// CHECK-MOV-NEXT: %74 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %75 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %76 = neura.grant_predicate %74, %75 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %76 -> %11 : !neura.data !neura.data // CHECK-MOV-NEXT: "neura.return"() : () -> () // CHECK-MOV-NEXT: } \ No newline at end of file