diff --git a/include/NeuraDialect/Mapping/mapping_util.h b/include/NeuraDialect/Mapping/mapping_util.h index cf85d2a2..0a36d476 100644 --- a/include/NeuraDialect/Mapping/mapping_util.h +++ b/include/NeuraDialect/Mapping/mapping_util.h @@ -46,8 +46,10 @@ getOpsInAlapLevels(const std::vector &sorted_ops, const std::set &critical_ops); // Flattens the level buckets into a vector of pairs (operation, level). +// Within each ALAP level, critical ops are prioritized before non-critical ops. std::vector> flatten_level_buckets( - const std::vector> &level_buckets); + const std::vector> &level_buckets, + const std::set &critical_ops); // Gets the physical hops from the producers to the tile, which is used for // estimating the award of a location for placement. @@ -80,6 +82,11 @@ bool tryRouteBackwardMove(Operation *mov_op, MappingLoc src_loc, // ctrl_mov users found. llvm::SmallVector getCtrlMovUsers(Operation *op); +// Identifies operations on the critical path (i.e., operations with zero slack). +// Returns pair of: (critical_ops_set, asap_level_map) +std::pair, llvm::DenseMap> +identifyCriticalPathOps(const std::vector &sorted_ops); + // Maps a materialized operation to the accelerator, and routes the dataflow // from the producers to the given op. bool placeAndRoute(Operation *op, const MappingLoc &target_loc, diff --git a/lib/NeuraDialect/Mapping/mapping_util.cpp b/lib/NeuraDialect/Mapping/mapping_util.cpp index df4de446..f5b7a86d 100644 --- a/lib/NeuraDialect/Mapping/mapping_util.cpp +++ b/lib/NeuraDialect/Mapping/mapping_util.cpp @@ -15,10 +15,14 @@ using namespace mlir; using namespace mlir::neura; // Constants for award calculation. -static const int AWARD_PROXIMITY_SCALE = 1; -static const int AWARD_BACKWARD_PROXIMITY_SCALE = 1; -static const int AWARD_BASE_MULTIPLIER = 1; -static const int AWARD_CRITICAL_BONUS_DIV = 1; +constexpr int kAwardProximityScale = 1; +constexpr int kAwardBackwardProximityScale = 1; +constexpr int kAwardBaseMultiplier = 1; +constexpr int kAwardCriticalBonusDiv = 1; + +// Congestion penalty coefficients (tunable). +constexpr int kStrongCongestionPenalty = 60; // used for high fan-in ops (>=3) +constexpr int kWeakCongestionPenalty = 15; // used for low fan-in ops namespace mlir { namespace neura { @@ -394,12 +398,53 @@ mlir::neura::getOpsInAlapLevels(const std::vector &sorted_ops, } std::vector> mlir::neura::flatten_level_buckets( - const std::vector> &level_buckets) { + const std::vector> &level_buckets, + const std::set &critical_ops) { std::vector> result; for (int level = 0; level < static_cast(level_buckets.size()); ++level) { - for (Operation *op : level_buckets[level]) { - result.emplace_back(op, level); + // Collects ops with their current index to ensure stable sorting. + std::vector> ops_with_index; + for (int i = 0; i < (int)level_buckets[level].size(); ++i) { + ops_with_index.push_back({level_buckets[level][i], i}); + } + + // Sorts with criticality as PRIMARY criterion within the same ALAP level. + // This addresses tancheng's feedback: critical ops should map before + // high-degree non-critical ops in the same level. + std::sort(ops_with_index.begin(), ops_with_index.end(), + [&critical_ops](const std::pair &a_pair, + const std::pair &b_pair) { + Operation *a = a_pair.first; + Operation *b = b_pair.first; + + bool a_is_critical = critical_ops.count(a) > 0; + bool b_is_critical = critical_ops.count(b) > 0; + + // Priority 1: Critical ops come first (within same ALAP level). + if (a_is_critical != b_is_critical) + return a_is_critical > b_is_critical; + + // Priority 2: Degree (connectivity) - higher degree first. + int degree_a = a->getNumOperands(); + int degree_b = b->getNumOperands(); + for (Value res : a->getResults()) { + degree_a += std::distance(res.getUsers().begin(), + res.getUsers().end()); + } + for (Value res : b->getResults()) { + degree_b += std::distance(res.getUsers().begin(), + res.getUsers().end()); + } + if (degree_a != degree_b) + return degree_a > degree_b; + + // Priority 3: Original index (stability tie-breaker). + return a_pair.second < b_pair.second; + }); + + for (const auto &p : ops_with_index) { + result.emplace_back(p.first, level); } } @@ -628,8 +673,6 @@ bool mlir::neura::tryRouteDataMove(Operation *mov_op, MappingLoc src_loc, continue; } - // Explores two routing options from current tile: - // Option 1: Moves to adjacent tile through link. for (Link *out_link : current_state.current_tile->getOutLinks()) { MappingLoc link_loc = {out_link, current_state.current_time}; @@ -923,7 +966,7 @@ mlir::neura::calculateAward(Operation *op, std::set &critical_ops, (architecture.getPerCgraRows() + architecture.getPerCgraColumns() - 2); int max_hops = static_cast(producers.size()) * kMaxDist; int proximity_bonus = - std::max(0, max_hops - hops_to_producers) * AWARD_PROXIMITY_SCALE; + std::max(0, max_hops - hops_to_producers) * kAwardProximityScale; tile_award += proximity_bonus; // Computes proximity bonus to backward users. Closer is better for @@ -934,7 +977,7 @@ mlir::neura::calculateAward(Operation *op, std::set &critical_ops, int backward_hops = std::abs(backward_tile->getX() - tile->getX()) + std::abs(backward_tile->getY() - tile->getY()); tile_award += std::max(0, (kMaxDist - backward_hops) * - AWARD_BACKWARD_PROXIMITY_SCALE); + kAwardBackwardProximityScale); } } @@ -943,11 +986,11 @@ mlir::neura::calculateAward(Operation *op, std::set &critical_ops, // Keep the original critical bonuses but allow tuning via division. tile_award += (mapping_state.getII() + static_cast(tile->getDstTiles().size())) / - std::max(1, AWARD_CRITICAL_BONUS_DIV); + std::max(1, kAwardCriticalBonusDiv); } // Apply base multiplier to amplify or dampen tile-based award. - tile_award *= AWARD_BASE_MULTIPLIER; + tile_award *= kAwardBaseMultiplier; // === Time-based award === for (int t = earliest_start_time_step; t < latest_end_time_step; t += 1) { @@ -972,7 +1015,41 @@ mlir::neura::calculateAward(Operation *op, std::set &critical_ops, if (meet_producer_constraint && meet_backward_user_constraint) { // Earlier time steps get higher scores. int time_bonus = latest_end_time_step - t; - int total_award = tile_award + time_bonus; + + // === Balanced Link congestion penalty === + // A conservative penalty to guide the mapper away from hotspots + // without being too restrictive for small IIs. + int total_in = tile->getInLinks().size(); + int total_out = tile->getOutLinks().size(); + int occupied_in = 0; + int occupied_out = 0; + + for (auto *link : tile->getInLinks()) { + if (!mapping_state.isAvailableAcrossTime({link, t})) { + occupied_in++; + } + } + for (auto *link : tile->getOutLinks()) { + if (!mapping_state.isAvailableAcrossTime({link, t})) { + occupied_out++; + } + } + + float in_ratio = (total_in > 0) ? (float)occupied_in / total_in : 0; + float out_ratio = (total_out > 0) ? (float)occupied_out / total_out : 0; + + // Adaptive penalty strategy: + // - Use very strong penalty (60) only for high fan-in ops (>= 3 producers) + // - Use weak penalty (15) for low fan-in ops + // This optimizes fuse-pattern (II=11 target) without breaking iter-merge + int base_penalty_coeff = (producers.size() >= 3) + ? kStrongCongestionPenalty + : kWeakCongestionPenalty; + + int congestion_penalty = static_cast(in_ratio * in_ratio * base_penalty_coeff) + + static_cast(out_ratio * out_ratio * base_penalty_coeff); + + int total_award = tile_award + time_bonus - congestion_penalty; updateAward(locs_with_award, tile_loc_candidate, total_award); } } @@ -983,11 +1060,17 @@ mlir::neura::calculateAward(Operation *op, std::set &critical_ops, std::vector> locs_award_vec( locs_with_award.begin(), locs_with_award.end()); - // Sorts by award (descending). + // Sorts by award (descending). Use stable sort/tie-breaker logic + // to minimize noise in mapping results. std::sort( locs_award_vec.begin(), locs_award_vec.end(), [](const std::pair &a, - const std::pair &b) { return a.second > b.second; }); + const std::pair &b) { + if (a.second != b.second) + return a.second > b.second; + // Tie-breaker: earlier time step first. + return a.first.time_step < b.first.time_step; + }); // TODO: Needs to handle tie case and prioritize lower resource utilization, // however, compiled II becomes worse after adding this tie-breaker: // https://github.com/coredac/dataflow/issues/59. diff --git a/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp b/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp index 35a6f59f..cf0c295c 100644 --- a/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp +++ b/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp @@ -745,7 +745,7 @@ struct MapToAcceleratorPass } } std::vector> sorted_ops_with_alap_levels = - flatten_level_buckets(level_buckets); + flatten_level_buckets(level_buckets, critical_ops); for (const auto &[op, level] : sorted_ops_with_alap_levels) { llvm::outs() << "[MapToAcceleratorPass] ALAP sorted op: " << *op << " (ALAP level: " << level << ")\n"; diff --git a/test/c2llvm2mlir/nested_loop/test.mlir b/test/c2llvm2mlir/nested_loop/test.mlir index ee5b9131..924e15fc 100644 --- a/test/c2llvm2mlir/nested_loop/test.mlir +++ b/test/c2llvm2mlir/nested_loop/test.mlir @@ -30,4 +30,4 @@ // CHECK-LLVM2NEURA: %188 = neura.sext %187 : !neura.data -> !neura.data // CHECK-LLVM2NEURA: %207 = "neura.mul"(%205, %206) : (!neura.data, !neura.data) -> !neura.data -// CHECK-LLVM2NEURA-MAP: func.func @_Z6kernelPiS_S_(%arg0: !llvm.ptr {llvm.noundef}, %arg1: !llvm.ptr {llvm.noundef}, %arg2: !llvm.ptr {llvm.noundef}) -> !llvm.void attributes {CConv = #llvm.cconv, accelerator = "neura", dataflow_mode = "predicate", frame_pointer = #llvm.framePointerKind, linkage = #llvm.linkage, mapping_info = {compiled_ii = 13 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 9 : i32, res_mii = 6 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}, no_inline, no_unwind, optimize_none, passthrough = ["mustprogress", ["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", unnamed_addr = 0 : i64, visibility_ = 0 : i64} { \ No newline at end of file +// CHECK-LLVM2NEURA-MAP: func.func @_Z6kernelPiS_S_(%arg0: !llvm.ptr {llvm.noundef}, %arg1: !llvm.ptr {llvm.noundef}, %arg2: !llvm.ptr {llvm.noundef}) -> !llvm.void attributes {CConv = #llvm.cconv, accelerator = "neura", dataflow_mode = "predicate", frame_pointer = #llvm.framePointerKind, linkage = #llvm.linkage, mapping_info = {compiled_ii = 11 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 9 : i32, res_mii = 6 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}, no_inline, no_unwind, optimize_none, passthrough = ["mustprogress", ["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", unnamed_addr = 0 : i64, visibility_ = 0 : i64} { \ No newline at end of file diff --git a/test/code_gen/test_code_generate.mlir b/test/code_gen/test_code_generate.mlir index a2520b21..a9671b86 100644 --- a/test/code_gen/test_code_generate.mlir +++ b/test/code_gen/test_code_generate.mlir @@ -32,136 +32,135 @@ func.func @loop_test() -> f32 { ^exit(%result: f32): return %result : f32 } - -// MAPPING: func.func @loop_test() -> f32 attributes {accelerator = "neura", dataflow_mode = "predicate", mapping_info = {compiled_ii = 5 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 4 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { - -// Each core represents a processing element in the CGRA array -// Example: column: 1, row: 1 represents the core at position (1,1) in the 4x4 grid -// Each core contains multiple entries (execution contexts) with instructions -// Instructions are organized by timestep and include source/destination operands -// Tile (1,1) : per-cycle schedule and routing summary. -// -// entry0 @ t=2: -// PHI_START merges tokens arriving from EAST and SOUTH, then forwards the selected -// value out to EAST. -// -// entry1 @ t=4: -// ICMP consumes EAST and SOUTH, then BROADCASTS its result: -// - to EAST / NORTH / SOUTH (for downstream tiles), -// - and into local registers $22, $21, $20 (to retain the value for later use). -// -// entry2 @ t=5: -// NOT reads temporary $20 and forwards the negated value to EAST. -// -// entry3 @ t=6: -// GRANT_PREDICATE uses a control input from WEST together with predicate -// state latched in $21, and forwards the grant out to EAST. -// -// entry4 @ t=6: -// DATA_MOV performs a register deposit: value arriving from SOUTH is written -// into local register $20. -// -// entry5 @ t=7: -// GRANT_PREDICATE combines the recently updated $20 with $22 to produce a -// new grant and forwards it to EAST. -// -// entry6 @ t=7: -// CTRL_MOV performs a control deposit: control token arriving from WEST is -// written into local register $20. -// +// MAPPING: module { +// MAPPING: func.func @loop_test() -> f32 attributes {accelerator = "neura", dataflow_mode = "predicate", mapping_info = {compiled_ii = 4 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 4 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { +// MAPPING: %0 = "neura.constant"() <{value = 10 : i64}> {dfg_id = 0 : i32, mapping_locs = [{id = 3 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 0 : i32}]} : () -> !neura.data +// MAPPING: %1 = "neura.data_mov"(%0) {dfg_id = 11 : i32, mapping_locs = [{id = 96 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %2 = "neura.grant_once"(%1) {dfg_id = 16 : i32, mapping_locs = [{id = 3 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %3 = "neura.constant"() <{value = 0 : i64}> {dfg_id = 1 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// MAPPING: %4 = "neura.data_mov"(%3) {dfg_id = 12 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %5 = "neura.grant_once"(%4) {dfg_id = 17 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %6 = "neura.constant"() <{value = 1 : i64}> {dfg_id = 2 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 1 : i32}]} : () -> !neura.data +// MAPPING: %7 = "neura.data_mov"(%6) {dfg_id = 13 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %8 = "neura.grant_once"(%7) {dfg_id = 18 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %9 = "neura.constant"() <{value = 3.000000e+00 : f32}> {dfg_id = 3 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data +// MAPPING: %10 = "neura.data_mov"(%9) {dfg_id = 14 : i32, mapping_locs = [{id = 128 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %11 = "neura.grant_once"(%10) {dfg_id = 19 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %12 = "neura.constant"() <{value = 0.000000e+00 : f32}> {dfg_id = 4 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data +// MAPPING: %13 = "neura.data_mov"(%12) {dfg_id = 15 : i32, mapping_locs = [{id = 384 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %14 = "neura.grant_once"(%13) {dfg_id = 20 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %15 = neura.reserve {dfg_id = 5 : i32} : !neura.data +// MAPPING: %16 = "neura.data_mov"(%2) {dfg_id = 21 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %17 = neura.phi_start %16, %15 {dfg_id = 26 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: %18 = neura.reserve {dfg_id = 6 : i32} : !neura.data +// MAPPING: %19 = "neura.data_mov"(%8) {dfg_id = 23 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %20 = neura.phi_start %19, %18 {dfg_id = 28 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: %21 = neura.reserve {dfg_id = 7 : i32} : !neura.data +// MAPPING: %22 = "neura.data_mov"(%11) {dfg_id = 24 : i32, mapping_locs = [{id = 128 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %23 = neura.phi_start %22, %21 {dfg_id = 29 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: %24 = neura.reserve {dfg_id = 8 : i32} : !neura.data +// MAPPING: %25 = "neura.data_mov"(%14) {dfg_id = 25 : i32, mapping_locs = [{id = 39 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %26 = neura.phi_start %25, %24 {dfg_id = 30 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: %27 = neura.reserve {dfg_id = 9 : i32} : !neura.data +// MAPPING: %28 = "neura.data_mov"(%5) {dfg_id = 22 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %29 = neura.phi_start %28, %27 {dfg_id = 27 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: %30 = "neura.data_mov"(%26) {dfg_id = 38 : i32, mapping_locs = [{id = 25 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %31 = "neura.data_mov"(%23) {dfg_id = 37 : i32, mapping_locs = [{id = 128 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %32 = "neura.fadd"(%30, %31) {dfg_id = 40 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING: %33 = "neura.data_mov"(%29) {dfg_id = 33 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %34 = "neura.data_mov"(%20) {dfg_id = 35 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %35 = "neura.add"(%33, %34) {dfg_id = 39 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING: %36 = "neura.data_mov"(%35) {dfg_id = 42 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %37 = "neura.data_mov"(%17) {dfg_id = 32 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %38 = "neura.icmp"(%36, %37) <{cmpType = "slt"}> {dfg_id = 45 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING: %39 = "neura.data_mov"(%35) {dfg_id = 41 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 3 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %40 = "neura.data_mov"(%38) {dfg_id = 51 : i32, mapping_locs = [{id = 19 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %41 = neura.grant_predicate %39, %40 {dfg_id = 57 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: neura.ctrl_mov %41 -> %27 {dfg_id = 63 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data +// MAPPING: %42 = "neura.data_mov"(%32) {dfg_id = 44 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 24 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %43 = "neura.data_mov"(%38) {dfg_id = 50 : i32, mapping_locs = [{id = 20 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}, {id = 31 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 288 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %44 = neura.grant_predicate %42, %43 {dfg_id = 56 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: neura.ctrl_mov %44 -> %24 {dfg_id = 62 : i32, mapping_locs = [{id = 27 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data +// MAPPING: %45 = "neura.data_mov"(%23) {dfg_id = 36 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}, {id = 0 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 0 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %46 = "neura.data_mov"(%38) {dfg_id = 49 : i32, mapping_locs = [{id = 17 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}, {id = 13 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %47 = neura.grant_predicate %45, %46 {dfg_id = 55 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: neura.ctrl_mov %47 -> %21 {dfg_id = 61 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data +// MAPPING: %48 = "neura.data_mov"(%20) {dfg_id = 34 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 192 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 192 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %49 = "neura.data_mov"(%38) {dfg_id = 48 : i32, mapping_locs = [{id = 194 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %50 = neura.grant_predicate %48, %49 {dfg_id = 54 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: neura.ctrl_mov %50 -> %18 {dfg_id = 60 : i32, mapping_locs = [{id = 17 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data +// MAPPING: %51 = "neura.data_mov"(%17) {dfg_id = 31 : i32, mapping_locs = [{id = 64 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 7 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}, {id = 192 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %52 = "neura.data_mov"(%38) {dfg_id = 47 : i32, mapping_locs = [{id = 193 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}, {id = 193 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %53 = neura.grant_predicate %51, %52 {dfg_id = 53 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: neura.ctrl_mov %53 -> %15 {dfg_id = 59 : i32, mapping_locs = [{id = 19 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : !neura.data !neura.data +// MAPPING: %54 = "neura.data_mov"(%38) {dfg_id = 46 : i32, mapping_locs = [{id = 18 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %55 = "neura.not"(%54) {dfg_id = 52 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %56 = "neura.data_mov"(%32) {dfg_id = 43 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 16 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}, {id = 288 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %57 = "neura.data_mov"(%55) {dfg_id = 58 : i32, mapping_locs = [{id = 21 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 17 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}, {id = 16 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: %58 = neura.grant_predicate %56, %57 {dfg_id = 64 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING: %59 = "neura.data_mov"(%58) {dfg_id = 65 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING: neura.return_value %59 : !neura.data {dfg_id = 66 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 2 : i32}]} +// MAPPING: neura.yield {dfg_id = 10 : i32} +// MAPPING: } +// MAPPING: } // YAML: array_config: // YAML-NEXT: columns: 4 // YAML-NEXT: rows: 4 -// YAML-NEXT: compiled_ii: 5 +// YAML-NEXT: compiled_ii: 4 // YAML-NEXT: cores: -// YAML-NEXT: - column: 1 -// YAML-NEXT: row: 0 -// YAML-NEXT: core_id: "1" -// YAML-NEXT: entries: -// YAML-NEXT: - entry_id: "entry0" -// YAML-NEXT: instructions: -// YAML-NEXT: - index_per_ii: 3 -// YAML-NEXT: operations: -// YAML-NEXT: - opcode: "RETURN_VALUE" -// YAML-NEXT: id: 66 -// YAML-NEXT: time_step: 8 -// YAML-NEXT: invalid_iterations: 1 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 0 -// YAML-NEXT: row: 1 -// YAML-NEXT: core_id: "4" +// YAML-NEXT: row: 0 +// YAML-NEXT: core_id: "0" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: // YAML-NEXT: - index_per_ii: 0 // YAML-NEXT: operations: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: id: 37 -// YAML-NEXT: time_step: 5 -// YAML-NEXT: invalid_iterations: 1 +// YAML-NEXT: - opcode: "CONSTANT" +// YAML-NEXT: id: 1 +// YAML-NEXT: time_step: 0 +// YAML-NEXT: invalid_iterations: 0 // YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: - operand: "#0" // YAML-NEXT: color: "RED" // YAML-NEXT: dst_operands: // YAML-NEXT: - operand: "$0" // YAML-NEXT: color: "RED" +// YAML-NEXT: - index_per_ii: 1 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: id: 17 +// YAML-NEXT: time_step: 1 +// YAML-NEXT: invalid_iterations: 0 +// YAML-NEXT: src_operands: -// ASM: # Compiled II: 5 -// ASM: PE(1,0): -// ASM-NEXT: { -// ASM-NEXT: RETURN_VALUE, [NORTH, RED] (t=8, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=3) -// ASM: PE(0,1): +// ASM: # Compiled II: 4 +// ASM: PE(0,0): // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=5, inv_iters=1) +// ASM-NEXT: CONSTANT, [#0] -> [$0] (t=0, inv_iters=0) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: FADD, [NORTH, RED], [$0] -> [$1], [EAST, RED] (t=6, inv_iters=1) +// ASM-NEXT: GRANT_ONCE, [$0] -> [EAST, RED] (t=1, inv_iters=0) +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: CONSTANT, [#3.000000] -> [$0] (t=2, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=2) -// ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [$0] -> [EAST, RED] (t=3, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=3) -// ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$1], [EAST, RED] -> [NORTH, RED] (t=9, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=4) -// ASM: PE(1,1): -// ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [WEST, RED], [EAST, RED] -> [SOUTH, RED] (t=7, inv_iters=1) -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$1] (t=7, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=2) -// ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [$0] (t=8, inv_iters=1) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [WEST, RED] (t=8, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [$0], [NORTH, RED] -> [NORTH, RED] (t=7, inv_iters=1) // ASM-NEXT: } (idx_per_ii=3) +// ASM: PE(1,0): // ASM-NEXT: { -// ASM-NEXT: PHI_START, [WEST, RED], [$0] -> [WEST, RED], [$0] (t=4, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=4) -// ASM: PE(2,1): -// ASM-NEXT: { -// ASM-NEXT: NOT, [NORTH, RED] -> [WEST, RED] (t=6, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=1) +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=4, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [WEST, RED] (t=7, inv_iters=1) +// ASM-NEXT: PHI_START, [WEST, RED], [EAST, RED] -> [NORTH, RED] (t=2, inv_iters=0) // ASM-NEXT: } (idx_per_ii=2) -// ASM: PE(0,2): +// ASM: PE(2,0): // ASM-NEXT: { -// ASM-NEXT: PHI_START, [$0], [SOUTH, RED] -> [SOUTH, RED] (t=5, inv_iters=1) +// ASM-NEXT: DATA_MOV, [$0] -> [NORTH, RED] (t=4, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: CONSTANT, [#10] -> [$0] (t=1, inv_iters=0) +// ASM-NEXT: GRANT_PREDICATE, [WEST, RED], [NORTH, RED] -> [WEST, RED] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: CONSTANT, [#0.000000] -> [$1] (t=2, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=2) -// ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [$0] -> [EAST, RED] (t=3, inv_iters=0) +// ASM-NEXT: PHI_START, [EAST, RED], [NORTH, RED] -> [NORTH, RED], [$0] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) -// ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [$1] -> [$0] (t=4, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=4) diff --git a/test/controflow_fuse/perfect_nested/perfect_nested.mlir b/test/controflow_fuse/perfect_nested/perfect_nested.mlir index 0e76c4fe..a664bb16 100644 --- a/test/controflow_fuse/perfect_nested/perfect_nested.mlir +++ b/test/controflow_fuse/perfect_nested/perfect_nested.mlir @@ -200,4 +200,4 @@ module attributes {} { // CTRL2DATA-NEXT: neura.yield // CTRL2DATA-NEXT: } -// MAPPING: func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", dataflow_mode = "predicate", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 10 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 8 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { \ No newline at end of file +// MAPPING: func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", dataflow_mode = "predicate", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 8 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 8 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32} 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 5eabc8a7..3619db45 100644 --- a/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir +++ b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir @@ -178,4 +178,4 @@ module attributes {} { // FUSE-NEXT: } -// FUSE-MAPPING: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", dataflow_mode = "predicate", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 4 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 3 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { \ No newline at end of file +// FUSE-MAPPING: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", dataflow_mode = "predicate", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 3 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 3 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32} diff --git a/test/e2e/bicg/bicg_kernel.mlir b/test/e2e/bicg/bicg_kernel.mlir index 41bd3f46..51d30224 100644 --- a/test/e2e/bicg/bicg_kernel.mlir +++ b/test/e2e/bicg/bicg_kernel.mlir @@ -160,14 +160,227 @@ // AFTER_CANONICALIZE-NEXT: "neura.return"() : () -> () // AFTER_CANONICALIZE-NEXT: } -//MAPPING: func.func @kernel -//MAPPING-SAME: accelerator = "neura", dataflow_mode = "predicate" -//MAPPING-SAME: mapping_info = {compiled_ii = 13 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 9 : i32, res_mii = 6 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32} + +// MAPPING: func.func @kernel(%arg0: i32 {llvm.noundef}, %arg1: i32 {llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg3: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg4: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg5: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg6: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) -> !llvm.void attributes {CConv = #llvm.cconv, accelerator = "neura", dataflow_mode = "predicate", linkage = #llvm.linkage, mapping_info = {compiled_ii = 10 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 9 : i32, res_mii = 6 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}, memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["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", unnamed_addr = 1 : i64, visibility_ = 0 : i64} { +// MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> {dfg_id = 0 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 5 : i32, x = 0 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %1 = "neura.constant"() <{value = "%arg0"}> {dfg_id = 1 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %2 = "neura.grant_once"() <{constant_value = "%arg1"}> {dfg_id = 2 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 1 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %3 = "neura.grant_once"() <{constant_value = "%arg3"}> {dfg_id = 3 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 3 : i32, y = 3 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %4 = "neura.grant_once"() <{constant_value = "%arg4"}> {dfg_id = 4 : i32, mapping_locs = [{id = 3 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 3 : i32, y = 0 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %5 = "neura.grant_once"() <{constant_value = 0 : i8}> {dfg_id = 5 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %6 = "neura.grant_once"() <{constant_value = 0 : i64}> {dfg_id = 6 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 3 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %7 = "neura.data_mov"(%1) {dfg_id = 16 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %8 = "neura.icmp"(%7) <{cmpType = "sgt"}> {dfg_id = 24 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}], rhs_value = 0 : i32} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %9 = "neura.data_mov"(%8) {dfg_id = 25 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %10 = "neura.grant_once"(%9) {dfg_id = 26 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %11 = "neura.data_mov"(%0) {dfg_id = 15 : i32, mapping_locs = [{id = 256 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %12 = "neura.data_mov"(%10) {dfg_id = 32 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}, {id = 1 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 12 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 257 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %13 = neura.grant_predicate %11, %12 {dfg_id = 38 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 6 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %14 = "neura.data_mov"(%3) {dfg_id = 19 : i32, mapping_locs = [{id = 46 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 43 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %15 = "neura.data_mov"(%10) {dfg_id = 31 : i32, mapping_locs = [{id = 3 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 2 : i32}, {id = 0 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 1 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 12 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 5 : i32}, {id = 24 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 6 : i32}, {id = 30 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 7 : i32}, {id = 417 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}, {id = 417 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}, {id = 417 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}, {id = 417 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}, {id = 417 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 12 : i32}, {id = 417 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 13 : i32}, {id = 417 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %16 = neura.grant_predicate %14, %15 {dfg_id = 37 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 1 : i32, y = 3 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %17 = "neura.data_mov"(%5) {dfg_id = 21 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}, {id = 352 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %18 = "neura.data_mov"(%10) {dfg_id = 30 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 2 : i32}, {id = 0 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 3 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 6 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 5 : i32}, {id = 9 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 6 : i32}, {id = 23 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 7 : i32}, {id = 353 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}, {id = 353 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}, {id = 353 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}, {id = 353 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}, {id = 353 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 12 : i32}, {id = 353 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %19 = neura.grant_predicate %17, %18 {dfg_id = 36 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 3 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %20 = "neura.data_mov"(%2) {dfg_id = 17 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %21 = "neura.data_mov"(%10) {dfg_id = 29 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %22 = neura.grant_predicate %20, %21 {dfg_id = 35 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %23 = "neura.data_mov"(%6) {dfg_id = 23 : i32, mapping_locs = [{id = 42 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %24 = "neura.data_mov"(%10) {dfg_id = 28 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 160 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %25 = neura.grant_predicate %23, %24 {dfg_id = 34 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %26 = "neura.data_mov"(%10) {dfg_id = 27 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 2 : i32}, {id = 1 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 3 : i32}, {id = 1 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}, {id = 1 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}, {id = 1 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}, {id = 1 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}, {id = 1 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %27 = "neura.not"(%26) {dfg_id = 33 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 9 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %28 = "neura.data_mov"(%2) {dfg_id = 18 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 128 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 128 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}, {id = 128 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 128 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}, {id = 128 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 128 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}, {id = 128 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %29 = "neura.data_mov"(%27) {dfg_id = 41 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %30 = neura.grant_predicate %28, %29 {dfg_id = 51 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 10 : i32, x = 0 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %31 = "neura.data_mov"(%4) {dfg_id = 20 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %32 = "neura.data_mov"(%27) {dfg_id = 40 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}, {id = 0 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}, {id = 32 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}, {id = 3 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {dfg_id = 50 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %34 = "neura.data_mov"(%5) {dfg_id = 22 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %35 = "neura.data_mov"(%27) {dfg_id = 39 : i32, mapping_locs = [{id = 0 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}, {id = 3 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}, {id = 6 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 9 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %36 = neura.grant_predicate %34, %35 {dfg_id = 49 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %37 = "neura.data_mov"(%30) {dfg_id = 57 : i32, mapping_locs = [{id = 128 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %38 = "neura.icmp"(%37) <{cmpType = "sgt"}> {dfg_id = 63 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 11 : i32, x = 0 : i32, y = 1 : i32}], rhs_value = 0 : i32} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %39 = "neura.data_mov"(%38) {dfg_id = 72 : i32, mapping_locs = [{id = 128 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}, {id = 12 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %40 = "neura.not"(%39) {dfg_id = 83 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %41 = "neura.data_mov"(%40) {dfg_id = 93 : i32, mapping_locs = [{id = 256 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %42 = "neura.data_mov"(%40) {dfg_id = 94 : i32, mapping_locs = [{id = 257 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %43 = neura.grant_predicate %41, %42 {dfg_id = 104 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %44 = "neura.data_mov"(%30) {dfg_id = 56 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}, {id = 256 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %45 = "neura.data_mov"(%38) {dfg_id = 71 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %46 = neura.grant_predicate %44, %45 {dfg_id = 82 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %47 = "neura.data_mov"(%33) {dfg_id = 55 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 35 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 14 : i32}, {id = 35 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %48 = "neura.data_mov"(%38) {dfg_id = 70 : i32, mapping_locs = [{id = 129 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}, {id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}, {id = 15 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 36 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 4 : i32, resource = "register", time_step = 14 : i32}, {id = 36 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 4 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %49 = neura.grant_predicate %47, %48 {dfg_id = 81 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 16 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %50 = "neura.data_mov"(%36) {dfg_id = 54 : i32, mapping_locs = [{id = 225 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 13 : i32}, {id = 225 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %51 = "neura.data_mov"(%38) {dfg_id = 69 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 162 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 12 : i32}, {id = 14 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 18 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %52 = neura.grant_predicate %50, %51 {dfg_id = 80 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %53 = "neura.data_mov"(%46) {dfg_id = 92 : i32, mapping_locs = [{id = 26 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}, {id = 384 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %54 = neura.zext %53 {dfg_id = 103 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 0 : i32, y = 3 : i32}]} : !neura.data -> !neura.data +// MAPPING-NEXT: %55 = "neura.data_mov"(%54) {dfg_id = 111 : i32, mapping_locs = [{id = 384 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %56 = "neura.shl"(%55) {dfg_id = 127 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 0 : i32, y = 3 : i32}], rhs_value = 3 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %57 = "neura.data_mov"(%49) {dfg_id = 91 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}, {id = 1 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 17 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %58 = "neura.data_mov"(%52) {dfg_id = 90 : i32, mapping_locs = [{id = 21 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 17 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}, {id = 13 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 17 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %59 = "neura.data_mov"(%56) {dfg_id = 137 : i32, mapping_locs = [{id = 39 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 25 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}, {id = 129 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 17 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.memset"(%57, %58, %59) <{is_volatile = false}> {dfg_id = 150 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 8 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 18 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data, !neura.data, !neura.data) -> () +// MAPPING-NEXT: %60 = "neura.data_mov"(%56) {dfg_id = 136 : i32, mapping_locs = [{id = 384 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 15 : i32}, {id = 384 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: neura.return_void %60 : !neura.data {dfg_id = 149 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 17 : i32, x = 0 : i32, y = 3 : i32}]} +// MAPPING-NEXT: %61 = "neura.data_mov"(%13) {dfg_id = 48 : i32, mapping_locs = [{id = 26 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 6 : i32}, {id = 384 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 384 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}, {id = 384 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}, {id = 384 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}, {id = 384 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}, {id = 384 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %62 = neura.zext %61 {dfg_id = 53 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 0 : i32, y = 3 : i32}]} : !neura.data -> !neura.data +// MAPPING-NEXT: %63 = "neura.data_mov"(%62) {dfg_id = 62 : i32, mapping_locs = [{id = 38 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 42 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %64 = "neura.shl"(%63) {dfg_id = 68 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 1 : i32, y = 2 : i32}], rhs_value = 3 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %65 = "neura.data_mov"(%16) {dfg_id = 46 : i32, mapping_locs = [{id = 41 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 448 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %66 = "neura.data_mov"(%19) {dfg_id = 45 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 34 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 449 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %67 = "neura.data_mov"(%64) {dfg_id = 79 : i32, mapping_locs = [{id = 30 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 41 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.memset"(%65, %66, %67) <{is_volatile = false}> {dfg_id = 89 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 17 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, !neura.data, !neura.data) -> () +// MAPPING-NEXT: %68 = "neura.data_mov"(%22) {dfg_id = 44 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %69 = "neura.icmp"(%68) <{cmpType = "sgt"}> {dfg_id = 52 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}], rhs_value = 0 : i32} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %70 = "neura.data_mov"(%69) {dfg_id = 61 : i32, mapping_locs = [{id = 34 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 4 : i32}, {id = 4 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 5 : i32}, {id = 16 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 6 : i32}, {id = 288 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 288 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}, {id = 288 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}, {id = 288 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}, {id = 288 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %71 = "neura.not"(%70) {dfg_id = 67 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %72 = "neura.data_mov"(%22) {dfg_id = 43 : i32, mapping_locs = [{id = 33 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 3 : i32}, {id = 33 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}, {id = 33 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}, {id = 33 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %73 = "neura.data_mov"(%69) {dfg_id = 60 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}, {id = 32 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 32 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %74 = neura.grant_predicate %72, %73 {dfg_id = 66 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %75 = "neura.data_mov"(%13) {dfg_id = 47 : i32, mapping_locs = [{id = 256 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %76 = "neura.data_mov"(%69) {dfg_id = 59 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 1 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 5 : i32}, {id = 12 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %77 = neura.grant_predicate %75, %76 {dfg_id = 65 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %78 = "neura.data_mov"(%25) {dfg_id = 42 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %79 = "neura.data_mov"(%69) {dfg_id = 58 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 161 : i32, index_per_ii = 5 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %80 = neura.grant_predicate %78, %79 {dfg_id = 64 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %81 = "neura.data_mov"(%71) {dfg_id = 77 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}, {id = 288 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %82 = "neura.data_mov"(%71) {dfg_id = 78 : i32, mapping_locs = [{id = 290 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 12 : i32}, {id = 290 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %83 = neura.grant_predicate %81, %82 {dfg_id = 88 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %84 = "neura.data_mov"(%74) {dfg_id = 76 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %85 = neura.zext %84 {dfg_id = 87 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data -> !neura.data +// MAPPING-NEXT: %86 = "neura.data_mov"(%77) {dfg_id = 75 : i32, mapping_locs = [{id = 256 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %87 = neura.zext %86 {dfg_id = 86 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data -> !neura.data +// MAPPING-NEXT: %88 = neura.reserve {dfg_id = 7 : i32} : !neura.data +// MAPPING-NEXT: %89 = "neura.data_mov"(%85) {dfg_id = 101 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %90 = neura.phi_start %89, %88 {dfg_id = 110 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %91 = neura.reserve {dfg_id = 8 : i32} : !neura.data +// MAPPING-NEXT: %92 = "neura.data_mov"(%80) {dfg_id = 74 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %93 = neura.phi_start %92, %91 {dfg_id = 85 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %94 = neura.reserve {dfg_id = 9 : i32} : !neura.data +// MAPPING-NEXT: %95 = "neura.data_mov"(%80) {dfg_id = 73 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 6 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 6 : i32}, {id = 192 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %96 = neura.phi_start %95, %94 {dfg_id = 84 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 8 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %97 = "neura.data_mov"(%96) {dfg_id = 97 : i32, mapping_locs = [{id = 20 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 8 : i32}, {id = 320 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}, {id = 320 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}, {id = 320 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %98 = "neura.gep"(%97) <{operandSegmentSizes = array}> {dfg_id = 107 : i32, lhs_value = "%arg4", mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %99 = "neura.data_mov"(%98) {dfg_id = 119 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}, {id = 32 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 352 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.store"(%99) {dfg_id = 130 : i32, lhs_value = 0.000000e+00 : f64, mapping_locs = [{id = 11 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> () +// MAPPING-NEXT: %100 = "neura.data_mov"(%96) {dfg_id = 96 : i32, mapping_locs = [{id = 193 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}, {id = 20 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}, {id = 34 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}, {id = 448 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %101 = "neura.gep"(%100) <{operandSegmentSizes = array}> {dfg_id = 106 : i32, lhs_value = "%arg6", mapping_locs = [{id = 14 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %102 = neura.reserve {dfg_id = 10 : i32} : !neura.data +// MAPPING-NEXT: %103 = "neura.data_mov"(%93) {dfg_id = 99 : i32, mapping_locs = [{id = 16 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 7 : i32}, {id = 28 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 8 : i32}, {id = 321 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}, {id = 321 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}, {id = 321 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}, {id = 321 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %104 = neura.phi_start %103, %102 {dfg_id = 109 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %105 = neura.reserve {dfg_id = 11 : i32} : !neura.data +// MAPPING-NEXT: %106 = "neura.data_mov"(%90) {dfg_id = 126 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %107 = neura.phi_start %106, %105 {dfg_id = 135 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %108 = neura.reserve {dfg_id = 12 : i32} : !neura.data +// MAPPING-NEXT: %109 = "neura.data_mov"(%96) {dfg_id = 95 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %110 = neura.phi_start %109, %108 {dfg_id = 105 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 9 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %111 = neura.reserve {dfg_id = 13 : i32} : !neura.data +// MAPPING-NEXT: %112 = "neura.data_mov"(%93) {dfg_id = 98 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 7 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %113 = neura.phi_start %112, %111 {dfg_id = 108 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %114 = "neura.data_mov"(%113) {dfg_id = 123 : i32, mapping_locs = [{id = 16 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 8 : i32}, {id = 30 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}, {id = 416 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}, {id = 416 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %115 = "neura.gep"(%114) <{operandSegmentSizes = array}> {dfg_id = 134 : i32, lhs_value = "%arg3", mapping_locs = [{id = 13 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 1 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %116 = "neura.data_mov"(%115) {dfg_id = 146 : i32, mapping_locs = [{id = 41 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}, {id = 448 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %117 = "neura.load"(%116) {dfg_id = 155 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %118 = "neura.data_mov"(%101) {dfg_id = 116 : i32, mapping_locs = [{id = 448 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %119 = "neura.load"(%118) {dfg_id = 128 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %120 = "neura.data_mov"(%110) {dfg_id = 115 : i32, mapping_locs = [{id = 18 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}, {id = 224 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}, {id = 224 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %121 = "neura.data_mov"(%113) {dfg_id = 122 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 8 : i32}, {id = 193 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}, {id = 18 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}, {id = 225 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %122 = "neura.gep"(%120, %121) <{operandSegmentSizes = array}> {dfg_id = 133 : i32, lhs_value = "%arg2", mapping_locs = [{id = 7 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %123 = "neura.data_mov"(%122) {dfg_id = 144 : i32, mapping_locs = [{id = 224 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}, {id = 224 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %124 = "neura.load"(%123) {dfg_id = 154 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %125 = "neura.data_mov"(%119) {dfg_id = 138 : i32, mapping_locs = [{id = 44 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 480 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 14 : i32}, {id = 480 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %126 = "neura.data_mov"(%124) {dfg_id = 162 : i32, mapping_locs = [{id = 23 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 37 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %127 = "neura.data_mov"(%117) {dfg_id = 163 : i32, mapping_locs = [{id = 44 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 481 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %128 = "neura.fmul_fadd"(%125, %126, %127) {dfg_id = 169 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 16 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data, !neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %129 = "neura.data_mov"(%128) {dfg_id = 179 : i32, mapping_locs = [{id = 480 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %130 = "neura.data_mov"(%115) {dfg_id = 145 : i32, mapping_locs = [{id = 42 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}, {id = 28 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 34 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 44 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 481 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.store"(%129, %130) {dfg_id = 186 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 17 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data, !neura.data) -> () +// MAPPING-NEXT: %131 = "neura.data_mov"(%98) {dfg_id = 118 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %132 = "neura.load"(%131) {dfg_id = 129 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %133 = "neura.data_mov"(%122) {dfg_id = 143 : i32, mapping_locs = [{id = 22 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %134 = "neura.load"(%133) {dfg_id = 153 : i32, mapping_locs = [{id = 3 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 3 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %135 = "neura.data_mov"(%113) {dfg_id = 121 : i32, mapping_locs = [{id = 161 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}, {id = 16 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}, {id = 289 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}, {id = 289 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}, {id = 289 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %136 = "neura.gep"(%135) <{operandSegmentSizes = array}> {dfg_id = 132 : i32, lhs_value = "%arg5", mapping_locs = [{id = 9 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %137 = "neura.data_mov"(%136) {dfg_id = 142 : i32, mapping_locs = [{id = 30 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %138 = "neura.load"(%137) {dfg_id = 152 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 1 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %139 = "neura.data_mov"(%134) {dfg_id = 161 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 7 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 20 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %140 = "neura.data_mov"(%138) {dfg_id = 160 : i32, mapping_locs = [{id = 41 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 45 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %141 = "neura.data_mov"(%132) {dfg_id = 139 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 14 : i32}, {id = 320 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %142 = "neura.fmul_fadd"(%139, %140, %141) {dfg_id = 168 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 16 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data, !neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %143 = "neura.data_mov"(%142) {dfg_id = 178 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %144 = "neura.data_mov"(%98) {dfg_id = 117 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}, {id = 289 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 13 : i32}, {id = 289 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 14 : i32}, {id = 289 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 15 : i32}, {id = 289 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.store"(%143, %144) {dfg_id = 185 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 17 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> () +// MAPPING-NEXT: %145 = "neura.data_mov"(%113) {dfg_id = 120 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %146 = "neura.add"(%145) {dfg_id = 131 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 1 : i32}], rhs_value = 1 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %147 = "neura.data_mov"(%146) {dfg_id = 141 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %148 = "neura.data_mov"(%87) {dfg_id = 100 : i32, mapping_locs = [{id = 24 : i32, index_per_ii = 8 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 8 : i32}, {id = 29 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %149 = "neura.icmp"(%147, %148) <{cmpType = "eq"}> {dfg_id = 151 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %150 = "neura.data_mov"(%149) {dfg_id = 159 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %151 = "neura.not"(%150) {dfg_id = 167 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 11 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %152 = "neura.data_mov"(%146) {dfg_id = 140 : i32, mapping_locs = [{id = 161 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}, {id = 161 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}, {id = 161 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}, {id = 161 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %153 = "neura.data_mov"(%151) {dfg_id = 177 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}, {id = 160 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %154 = neura.grant_predicate %152, %153 {dfg_id = 184 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %154 -> %111 {dfg_id = 192 : i32, mapping_locs = [{id = 162 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 13 : i32}, {id = 162 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 14 : i32}, {id = 162 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 15 : i32}, {id = 162 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 16 : i32}, {id = 162 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 17 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %155 = "neura.data_mov"(%110) {dfg_id = 114 : i32, mapping_locs = [{id = 19 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 9 : i32}, {id = 65 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}, {id = 65 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}, {id = 65 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 12 : i32}, {id = 65 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 13 : i32}, {id = 65 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 14 : i32}, {id = 65 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %156 = "neura.data_mov"(%151) {dfg_id = 176 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}, {id = 2 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 13 : i32}, {id = 0 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 3 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %157 = neura.grant_predicate %155, %156 {dfg_id = 183 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 16 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %157 -> %108 {dfg_id = 191 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}, {id = 194 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 17 : i32}, {id = 194 : i32, index_per_ii = 8 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 18 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %158 = "neura.data_mov"(%107) {dfg_id = 148 : i32, mapping_locs = [{id = 37 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 10 : i32}, {id = 37 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 11 : i32}, {id = 37 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 12 : i32}, {id = 37 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 13 : i32}, {id = 37 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %159 = "neura.data_mov"(%151) {dfg_id = 175 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 38 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 6 : i32, resource = "register", time_step = 12 : i32}, {id = 38 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 6 : i32, resource = "register", time_step = 13 : i32}, {id = 38 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 6 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %160 = neura.grant_predicate %158, %159 {dfg_id = 182 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %160 -> %105 {dfg_id = 190 : i32, mapping_locs = [{id = 37 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 15 : i32}, {id = 37 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 16 : i32}, {id = 37 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 17 : i32}, {id = 37 : i32, index_per_ii = 8 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 18 : i32}, {id = 37 : i32, index_per_ii = 9 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 19 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %161 = "neura.data_mov"(%104) {dfg_id = 125 : i32, mapping_locs = [{id = 33 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 196 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 4 : i32, resource = "register", time_step = 14 : i32}, {id = 196 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 4 : i32, resource = "register", time_step = 15 : i32}, {id = 196 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 4 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %162 = "neura.data_mov"(%151) {dfg_id = 174 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 197 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 12 : i32}, {id = 197 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 13 : i32}, {id = 197 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 14 : i32}, {id = 197 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 15 : i32}, {id = 197 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 5 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %163 = neura.grant_predicate %161, %162 {dfg_id = 181 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 17 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %163 -> %102 {dfg_id = 189 : i32, mapping_locs = [{id = 20 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 17 : i32}, {id = 323 : i32, index_per_ii = 8 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 18 : i32}, {id = 323 : i32, index_per_ii = 9 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 19 : i32}, {id = 323 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 20 : i32}, {id = 323 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 21 : i32}, {id = 323 : i32, index_per_ii = 2 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 22 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %164 = "neura.data_mov"(%110) {dfg_id = 113 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 9 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}, {id = 192 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %165 = "neura.data_mov"(%149) {dfg_id = 158 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %166 = neura.grant_predicate %164, %165 {dfg_id = 166 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 11 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %167 = "neura.data_mov"(%107) {dfg_id = 147 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %168 = "neura.data_mov"(%149) {dfg_id = 157 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %169 = neura.grant_predicate %167, %168 {dfg_id = 165 : i32, mapping_locs = [{id = 1 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 11 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %170 = "neura.data_mov"(%104) {dfg_id = 124 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %171 = "neura.data_mov"(%149) {dfg_id = 156 : i32, mapping_locs = [{id = 16 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 10 : i32}, {id = 28 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 322 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 12 : i32}, {id = 322 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %172 = neura.grant_predicate %170, %171 {dfg_id = 164 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %173 = "neura.data_mov"(%166) {dfg_id = 173 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %174 = "neura.add"(%173) {dfg_id = 180 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 12 : i32, x = 2 : i32, y = 1 : i32}], rhs_value = 1 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %175 = "neura.data_mov"(%174) {dfg_id = 188 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %176 = "neura.data_mov"(%169) {dfg_id = 172 : i32, mapping_locs = [{id = 3 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 7 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %177 = "neura.icmp"(%175, %176) <{cmpType = "eq"}> {dfg_id = 193 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 13 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %178 = "neura.data_mov"(%177) {dfg_id = 196 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %179 = "neura.not"(%178) {dfg_id = 198 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 14 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %180 = "neura.data_mov"(%174) {dfg_id = 187 : i32, mapping_locs = [{id = 195 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 12 : i32}, {id = 195 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 13 : i32}, {id = 195 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 14 : i32}, {id = 195 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 3 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %181 = "neura.data_mov"(%179) {dfg_id = 202 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 14 : i32}, {id = 192 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %182 = neura.grant_predicate %180, %181 {dfg_id = 206 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 16 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %182 -> %94 {dfg_id = 210 : i32, mapping_locs = [{id = 193 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 16 : i32}, {id = 193 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 17 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %183 = "neura.data_mov"(%172) {dfg_id = 170 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 288 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %184 = "neura.data_mov"(%179) {dfg_id = 201 : i32, mapping_locs = [{id = 17 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 16 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %185 = neura.grant_predicate %183, %184 {dfg_id = 205 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 16 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %185 -> %91 {dfg_id = 209 : i32, mapping_locs = [{id = 29 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %186 = "neura.data_mov"(%169) {dfg_id = 171 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 11 : i32}, {id = 14 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 12 : i32}, {id = 19 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 13 : i32}, {id = 64 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %187 = "neura.data_mov"(%179) {dfg_id = 200 : i32, mapping_locs = [{id = 19 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %188 = neura.grant_predicate %186, %187 {dfg_id = 204 : i32, mapping_locs = [{id = 2 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %188 -> %88 {dfg_id = 208 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 34 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 16 : i32}, {id = 34 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 17 : i32}, {id = 34 : i32, index_per_ii = 8 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 18 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %189 = "neura.data_mov"(%177) {dfg_id = 194 : i32, mapping_locs = [{id = 193 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 13 : i32}, {id = 193 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %190 = "neura.data_mov"(%177) {dfg_id = 195 : i32, mapping_locs = [{id = 194 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 13 : i32}, {id = 194 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 14 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %191 = neura.grant_predicate %189, %190 {dfg_id = 197 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 15 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %192 = "neura.data_mov"(%83) {dfg_id = 102 : i32, mapping_locs = [{id = 28 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 321 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 15 : i32}, {id = 321 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %193 = "neura.data_mov"(%43) {dfg_id = 112 : i32, mapping_locs = [{id = 24 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 14 : i32}, {id = 28 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 15 : i32}, {id = 320 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %194 = "neura.data_mov"(%191) {dfg_id = 199 : i32, mapping_locs = [{id = 193 : i32, index_per_ii = 5 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 15 : i32}, {id = 20 : i32, index_per_ii = 6 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 16 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %195 = "neura.phi"(%192, %193, %194) {dfg_id = 203 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 17 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data, !neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %196 = "neura.data_mov"(%195) {dfg_id = 207 : i32, mapping_locs = [{id = 34 : i32, index_per_ii = 7 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 17 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: neura.return_void %196 : !neura.data {dfg_id = 211 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 8 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 18 : i32, x = 2 : i32, y = 3 : i32}]} +// MAPPING-NEXT: neura.yield {dfg_id = 14 : i32} +// MAPPING-NEXT: } +// MAPPING-NEXT: } // YAML: array_config: // YAML-NEXT: columns: 4 // YAML-NEXT: rows: 4 -// YAML-NEXT: compiled_ii: 13 +// YAML-NEXT: compiled_ii: 10 // YAML-NEXT: cores: // YAML-NEXT: - column: 0 // YAML-NEXT: row: 0 @@ -188,8 +401,8 @@ // YAML-NEXT: - operand: "$0" // YAML-NEXT: color: "RED" // YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: id: 700000 -// YAML-NEXT: time_step: 13 +// YAML-NEXT: id: 400000 +// YAML-NEXT: time_step: 10 // YAML-NEXT: invalid_iterations: 1 // YAML-NEXT: src_operands: // YAML-NEXT: - operand: "$0" @@ -204,58 +417,53 @@ // YAML-NEXT: time_step: 1 // YAML-NEXT: invalid_iterations: 0 // YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "#0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" - -// ASM: # Compiled II: 13 +// ASM: # Compiled II: 10 // ASM: PE(0,0): // ASM-NEXT: { // ASM-NEXT: CONSTANT, [arg0] -> [$0] (t=0, inv_iters=0) -// ASM-NEXT: DATA_MOV, [$0] -> [EAST, RED] (t=13, inv_iters=1) +// ASM-NEXT: DATA_MOV, [$0] -> [EAST, RED] (t=10, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: ICMP_SGT, [$0], [#0] -> [NORTH, RED] (t=1, inv_iters=0) +// ASM-NEXT: ICMP_SGT, [$0], [#0] -> [$0] (t=1, inv_iters=0) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [arg1] -> [NORTH, RED], [$0] (t=2, inv_iters=0) +// ASM-NEXT: GRANT_ONCE, [$0] -> [$0], [$2], [EAST, RED], [NORTH, RED], [$1] (t=2, inv_iters=0) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=3, inv_iters=0) +// ASM-NEXT: DATA_MOV, [$0] -> [NORTH, RED] (t=3, inv_iters=0) +// ASM-NEXT: DATA_MOV, [$2] -> [EAST, RED] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [NORTH, RED] -> [$0], [$1] (t=10, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=10) +// ASM-NEXT: DATA_MOV, [$0] -> [NORTH, RED] (t=4, inv_iters=0) +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=14, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=4) +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=5, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=5) // ASM-NEXT: { -// ASM-NEXT: ICMP_SGT, [$0], [#0] -> [EAST, RED], [$0], [NORTH, RED] (t=11, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=11) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=17, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=7) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$1], [$0] -> [EAST, RED] (t=12, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=12) +// ASM-NEXT: NOT, [$1] -> [NORTH, RED], [$0], [EAST, RED] (t=9, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=9) // ASM: PE(1,0): // ASM-NEXT: { -// ASM-NEXT: ZEXT, [WEST, RED] -> [EAST, RED] (t=13, inv_iters=1) +// ASM-NEXT: PHI_START, [$0], [$5] -> [$5], [$0] (t=10, inv_iters=1) +// ASM-NEXT: DATA_MOV, [WEST, RED] -> [EAST, RED] (t=10, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [NORTH, RED] (t=14, inv_iters=1) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=14, inv_iters=1) -// ASM-NEXT: DATA_MOV, [WEST, RED] -> [$1] (t=14, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [$0], [NORTH, RED] -> [EAST, RED], [NORTH, RED] (t=11, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [EAST, RED] (t=15, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=2) -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [WEST, RED] -> [EAST, RED] (t=4, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=4) -// ASM-NEXT: { -// ASM-NEXT: NOT, [WEST, RED] -> [$0], [$1] (t=12, inv_iters=0) -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=12, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=12) + + + + + + + + // RUN: mlir-neura-opt %t-kernel.mlir --view-op-graph 2>&1 | sed -n '/^digraph G {/,/^}$/p' > bicg_kernel_original.dot // RUN: dot -Tpng bicg_kernel_original.dot -o bicg_kernel_original.png diff --git a/test/e2e/fir/fir_kernel.mlir b/test/e2e/fir/fir_kernel.mlir index e210e825..6b476a36 100644 --- a/test/e2e/fir/fir_kernel.mlir +++ b/test/e2e/fir/fir_kernel.mlir @@ -3,7 +3,9 @@ // RUN: llvm-extract --rfunc=".*kernel.*" %t-kernel-full.ll -o %t-kernel-only.ll // RUN: mlir-translate --import-llvm %t-kernel-only.ll -o %t-kernel.mlir -// RUN: mlir-neura-opt %t-kernel.mlir \ +// RUN: mkdir -p %t.dir +// RUN: cp %t-kernel.mlir %t.dir/ +// RUN: cd %t.dir && mlir-neura-opt %t-kernel.mlir \ // RUN: --assign-accelerator \ // RUN: --lower-llvm-to-neura \ // RUN: --promote-func-arg-to-const \ @@ -15,65 +17,69 @@ // RUN: --fold-constant \ // RUN: --insert-data-mov \ // RUN: --map-to-accelerator="mapping-strategy=heuristic" \ -// RUN: --architecture-spec=../../arch_spec/architecture.yaml \ -// RUN: --generate-code -o %t-mapping.mlir +// RUN: --architecture-spec=%S/../../arch_spec/architecture.yaml \ +// RUN: --generate-code -o %t-mapping.mlir +// RUN: cp %t.dir/tmp-generated-instructions.yaml %t-generated-instructions.yaml +// RUN: cp %t.dir/tmp-generated-instructions.asm %t-generated-instructions.asm // RUN: FileCheck %s --input-file=%t-mapping.mlir -check-prefix=MAPPING -// RUN: FileCheck %s --input-file=tmp-generated-instructions.yaml --check-prefix=YAML -// RUN: FileCheck %s --input-file=tmp-generated-instructions.asm --check-prefix=ASM +// RUN: FileCheck %s --input-file=%t-generated-instructions.yaml --check-prefix=YAML +// RUN: FileCheck %s --input-file=%t-generated-instructions.asm --check-prefix=ASM + +// MAPPING: func.func +// MAPPING-SAME: compiled_ii = 5 : i32 +// MAPPING-SAME: mapping_mode = "spatial-temporal" +// MAPPING-SAME: mapping_strategy = "heuristic" +// MAPPING-SAME: rec_mii = 5 : i32 +// MAPPING-SAME: res_mii = 2 : i32 +// MAPPING-SAME: x_tiles = 4 : i32 +// MAPPING-SAME: y_tiles = 4 : i32 +// +// MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = 0 : i64}> {dfg_id = 0 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = 0 : i32}> {dfg_id = 1 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %2 = neura.reserve {dfg_id = 2 : i32} : !neura.data +// MAPPING-NEXT: %3 = "neura.data_mov"(%1) {dfg_id = 6 : i32, mapping_locs = [{id = 256 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %4 = neura.phi_start %3, %2 {dfg_id = 8 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %5 = neura.reserve {dfg_id = 3 : i32} : !neura.data +// MAPPING-NEXT: %6 = "neura.data_mov"(%0) {dfg_id = 5 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %7 = neura.phi_start %6, %5 {dfg_id = 7 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %8 = "neura.data_mov"(%7) {dfg_id = 11 : i32, mapping_locs = [{id = 33 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %9 = "neura.gep"(%8) <{operandSegmentSizes = array}> {dfg_id = 15 : i32, lhs_value = "%arg0", mapping_locs = [{id = 6 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {dfg_id = 19 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %11 = "neura.load"(%10) {dfg_id = 22 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %12 = "neura.data_mov"(%7) {dfg_id = 10 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %13 = "neura.gep"(%12) <{operandSegmentSizes = array}> {dfg_id = 14 : i32, lhs_value = "%arg2", mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {dfg_id = 18 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %15 = "neura.load"(%14) {dfg_id = 21 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %16 = "neura.data_mov"(%15) {dfg_id = 25 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %17 = "neura.data_mov"(%11) {dfg_id = 26 : i32, mapping_locs = [{id = 18 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %18 = "neura.mul"(%16, %17) {dfg_id = 28 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %19 = "neura.data_mov"(%18) {dfg_id = 31 : i32, mapping_locs = [{id = 21 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 17 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %20 = "neura.data_mov"(%4) {dfg_id = 12 : i32, mapping_locs = [{id = 24 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 29 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %21 = "neura.add"(%19, %20) {dfg_id = 33 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %22 = "neura.data_mov"(%7) {dfg_id = 9 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %23 = "neura.add"(%22) {dfg_id = 13 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 1 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %24 = "neura.data_mov"(%23) {dfg_id = 17 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %25 = "neura.icmp"(%24) <{cmpType = "eq"}> {dfg_id = 20 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 32 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {dfg_id = 24 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %27 = "neura.not"(%26) {dfg_id = 27 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %28 = "neura.data_mov"(%23) {dfg_id = 16 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 2 : i32}, {id = 321 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 3 : i32}, {id = 321 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %29 = "neura.data_mov"(%27) {dfg_id = 30 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %30 = neura.grant_predicate %28, %29 {dfg_id = 32 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %30 -> %5 {dfg_id = 34 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %31 = "neura.data_mov"(%21) {dfg_id = 36 : i32, mapping_locs = [{id = 160 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %32 = "neura.data_mov"(%27) {dfg_id = 29 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 289 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}, {id = 29 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {dfg_id = 38 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %33 -> %2 {dfg_id = 40 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 7 : i32}, {id = 12 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %34 = "neura.data_mov"(%21) {dfg_id = 35 : i32, mapping_locs = [{id = 16 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %35 = "neura.data_mov"(%25) {dfg_id = 23 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 288 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}, {id = 288 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 288 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %36 = neura.grant_predicate %34, %35 {dfg_id = 37 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %37 = "neura.data_mov"(%36) {dfg_id = 39 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: neura.return_value %37 : !neura.data {dfg_id = 41 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 2 : i32}]} +// MAPPING-NEXT: neura.yield {dfg_id = 4 : i32} + -// MAPPING: func.func -// MAPPING-SAME: compiled_ii = 5 -// MAPPING-SAME: mapping_mode = "spatial-temporal" -// MAPPING-SAME: mapping_strategy = "heuristic" -// MAPPING-SAME: rec_mii = 5 -// MAPPING-SAME: res_mii = 2 -// MAPPING-SAME: x_tiles = 4 -// MAPPING-SAME: y_tiles = 4 -// MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = 0 : i64}> {dfg_id = 0 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = 0 : i32}> {dfg_id = 1 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %2 = neura.reserve {dfg_id = 2 : i32} : !neura.data -// MAPPING-NEXT: %3 = "neura.data_mov"(%1) {dfg_id = 6 : i32, mapping_locs = [{id = 128 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %4 = neura.phi_start %3, %2 {dfg_id = 8 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %5 = neura.reserve {dfg_id = 3 : i32} : !neura.data -// MAPPING-NEXT: %6 = "neura.data_mov"(%0) {dfg_id = 5 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %7 = neura.phi_start %6, %5 {dfg_id = 7 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %8 = "neura.data_mov"(%7) {dfg_id = 11 : i32, mapping_locs = [{id = 37 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %9 = "neura.gep"(%8) <{operandSegmentSizes = array}> {dfg_id = 15 : i32, lhs_value = "%arg0", mapping_locs = [{id = 15 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {dfg_id = 19 : i32, mapping_locs = [{id = 480 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %11 = "neura.load"(%10) {dfg_id = 22 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %12 = "neura.data_mov"(%7) {dfg_id = 10 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %13 = "neura.gep"(%12) <{operandSegmentSizes = array}> {dfg_id = 14 : i32, lhs_value = "%arg2", mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {dfg_id = 18 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %15 = "neura.load"(%14) {dfg_id = 21 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %16 = "neura.data_mov"(%15) {dfg_id = 25 : i32, mapping_locs = [{id = 34 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %17 = "neura.data_mov"(%11) {dfg_id = 26 : i32, mapping_locs = [{id = 46 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %18 = "neura.mul"(%16, %17) {dfg_id = 28 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %19 = "neura.data_mov"(%18) {dfg_id = 31 : i32, mapping_locs = [{id = 43 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 42 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %20 = "neura.data_mov"(%4) {dfg_id = 12 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 16 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %21 = "neura.add"(%19, %20) {dfg_id = 33 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %22 = "neura.data_mov"(%7) {dfg_id = 9 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %23 = "neura.add"(%22) {dfg_id = 13 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 1 : i64} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %24 = "neura.data_mov"(%23) {dfg_id = 17 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %25 = "neura.icmp"(%24) <{cmpType = "eq"}> {dfg_id = 20 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 32 : i64} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {dfg_id = 24 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %27 = "neura.not"(%26) {dfg_id = 27 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %28 = "neura.data_mov"(%23) {dfg_id = 16 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %29 = "neura.data_mov"(%27) {dfg_id = 30 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %30 = neura.grant_predicate %28, %29 {dfg_id = 32 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %30 -> %5 {dfg_id = 34 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %31 = "neura.data_mov"(%21) {dfg_id = 36 : i32, mapping_locs = [{id = 29 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %32 = "neura.data_mov"(%27) {dfg_id = 29 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 29 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 160 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {dfg_id = 38 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %33 -> %2 {dfg_id = 40 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 7 : i32}, {id = 129 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %34 = "neura.data_mov"(%21) {dfg_id = 35 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %35 = "neura.data_mov"(%25) {dfg_id = 23 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 35 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 31 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 289 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %36 = neura.grant_predicate %34, %35 {dfg_id = 37 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %37 = "neura.data_mov"(%36) {dfg_id = 39 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: neura.return_value %37 : !neura.data {dfg_id = 41 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 2 : i32}]} -// MAPPING-NEXT: neura.yield {dfg_id = 4 : i32} -// MAPPING-NEXT: } -// YAML: array_config: +// YAML: array_config: // YAML-NEXT: columns: 4 // YAML-NEXT: rows: 4 // YAML-NEXT: compiled_ii: 5 @@ -86,89 +92,98 @@ // YAML-NEXT: instructions: // YAML-NEXT: - index_per_ii: 3 // YAML-NEXT: operations: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: id: 1 -// YAML-NEXT: time_step: 3 -// YAML-NEXT: invalid_iterations: 0 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "#0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$0" -// YAML-NEXT: color: "RED" // YAML-NEXT: - opcode: "CTRL_MOV" -// YAML-NEXT: id: 40 +// YAML-NEXT: id: 400001 // YAML-NEXT: time_step: 8 // YAML-NEXT: invalid_iterations: 1 // YAML-NEXT: src_operands: // YAML-NEXT: - operand: "EAST" // YAML-NEXT: color: "RED" // YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$1" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - index_per_ii: 4 -// YAML-NEXT: operations: -// YAML-NEXT: - opcode: "PHI_START" -// YAML-NEXT: id: 8 -// YAML-NEXT: time_step: 4 -// YAML-NEXT: invalid_iterations: 0 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$1" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: - operand: "NORTH" // YAML-NEXT: color: "RED" +// YAML-NEXT: - column: 1 +// YAML-NEXT: row: 1 +// YAML-NEXT: core_id: "5" +// YAML-NEXT: entries: +// YAML-NEXT: - entry_id: "entry0" +// YAML-NEXT: instructions: + // YAML-NEXT: - index_per_ii: 1 + // YAML-NEXT: operations: + // YAML-NEXT: - opcode: "ADD" + // YAML-NEXT: id: 33 + // YAML-NEXT: time_step: 6 + // YAML-NEXT: invalid_iterations: 1 + // YAML-NEXT: src_operands: + // YAML-NEXT: - operand: "EAST" + // YAML-NEXT: color: "RED" + // ASM: # Compiled II: 5 // ASM: PE(0,1): // ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [#0] -> [$0] (t=3, inv_iters=0) -// ASM-NEXT: CTRL_MOV, [EAST, RED] -> [$1] (t=8, inv_iters=1) +// ASM-NEXT: CTRL_MOV, [EAST, RED] -> [NORTH, RED] (t=8, inv_iters=1) // ASM-NEXT: } (idx_per_ii=3) -// ASM-NEXT: { -// ASM-NEXT: PHI_START, [$0], [$1] -> [EAST, RED] (t=4, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=4) // ASM: PE(1,1): // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [WEST, RED] -> [NORTH, RED] (t=5, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=0) -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=6, inv_iters=1) +// ASM-NEXT: ADD, [EAST, RED], [NORTH, RED] -> [$0], [NORTH, RED] (t=6, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [NORTH, RED], [$0] -> [WEST, RED] (t=7, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [$0], [NORTH, RED] -> [WEST, RED] (t=7, inv_iters=1) // ASM-NEXT: } (idx_per_ii=2) +// ASM: PE(2,1): +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [WEST, RED] (t=5, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=0) +// ASM-NEXT: { +// ASM-NEXT: GEP, [NORTH, RED] -> [$0] (t=2, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=2) +// ASM-NEXT: { +// ASM-NEXT: LOAD, [$0] -> [EAST, RED] (t=3, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=3) +// ASM: PE(3,1): +// ASM-NEXT: { +// ASM-NEXT: MUL, [NORTH, RED], [WEST, RED] -> [WEST, RED] (t=4, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=4) +// ASM: PE(0,2): +// ASM-NEXT: { +// ASM-NEXT: GRANT_ONCE, [#0] -> [$0] (t=3, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=3) +// ASM-NEXT: { +// ASM-NEXT: PHI_START, [$0], [SOUTH, RED] -> [EAST, RED] (t=4, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=4) // ASM: PE(1,2): // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [SOUTH, RED] (t=5, inv_iters=1) +// ASM-NEXT: DATA_MOV, [WEST, RED] -> [SOUTH, RED] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: ADD, [NORTH, RED], [SOUTH, RED] -> [SOUTH, RED], [$0] (t=6, inv_iters=1) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$1] (t=6, inv_iters=1) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [SOUTH, RED] (t=6, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [$0] (t=7, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [SOUTH, RED], [$0] -> [$0] (t=7, inv_iters=1) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { // ASM-NEXT: RETURN_VALUE, [$0] (t=8, inv_iters=1) // ASM-NEXT: } (idx_per_ii=3) +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=4, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=4) // ASM: PE(2,2): // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [EAST, RED] (t=5, inv_iters=1) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [WEST, RED] (t=5, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [$1], [$0] -> [$0] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: GEP, [EAST, RED] -> [$0] (t=2, inv_iters=0) +// ASM-NEXT: PHI_START, [EAST, RED], [$0] -> [SOUTH, RED], [EAST, RED], [$0] (t=1, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=1) +// ASM-NEXT: { +// ASM-NEXT: ADD, [$0], [#1] -> [$0], [$1] (t=2, inv_iters=0) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: LOAD, [$0] -> [NORTH, RED] (t=3, inv_iters=0) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=3, inv_iters=0) +// ASM-NEXT: ICMP_EQ, [$0], [#32] -> [$0], [WEST, RED] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) // ASM-NEXT: { -// ASM-NEXT: NOT, [EAST, RED] -> [$1], [WEST, RED] (t=4, inv_iters=0) +// ASM-NEXT: NOT, [$0] -> [$0], [WEST, RED] (t=4, inv_iters=0) // ASM-NEXT: } (idx_per_ii=4) // RUN: mlir-neura-opt %t-kernel.mlir --view-op-graph 2>&1 | sed -n '/^digraph G {/,/^}$/p' > fir_kernel_original.dot diff --git a/test/e2e/fir/fir_kernel_vec.mlir b/test/e2e/fir/fir_kernel_vec.mlir index 47dc3619..2c0e8207 100644 --- a/test/e2e/fir/fir_kernel_vec.mlir +++ b/test/e2e/fir/fir_kernel_vec.mlir @@ -18,62 +18,63 @@ // RUN: --architecture-spec=../../arch_spec/architecture.yaml \ // RUN: --generate-code -o %t-mapping.mlir // RUN: FileCheck %s --input-file=%t-mapping.mlir -check-prefix=MAPPING -// RUN: FileCheck %s --input-file=tmp-generated-instructions.yaml --check-prefix=YAML -// RUN: FileCheck %s --input-file=tmp-generated-instructions.asm --check-prefix=ASM +// RUN: cp tmp-generated-instructions.yaml %t-generated-instructions.yaml +// RUN: cp tmp-generated-instructions.asm %t-generated-instructions.asm +// RUN: FileCheck %s --input-file=%t-generated-instructions.yaml --check-prefix=YAML +// RUN: FileCheck %s --input-file=%t-generated-instructions.asm --check-prefix=ASM -// MAPPING: module // MAPPING: func.func -// MAPPING-SAME: compiled_ii = 5 +// MAPPING-SAME: compiled_ii = 5 : i32 // MAPPING-SAME: mapping_mode = "spatial-temporal" // MAPPING-SAME: mapping_strategy = "heuristic" -// MAPPING-SAME: rec_mii = 5 -// MAPPING-SAME: res_mii = 2 -// MAPPING-SAME: x_tiles = 4 -// MAPPING-SAME: y_tiles = 4 +// MAPPING-SAME: rec_mii = 5 : i32 +// MAPPING-SAME: res_mii = 2 : i32 +// MAPPING-SAME: x_tiles = 4 : i32 +// MAPPING-SAME: y_tiles = 4 : i32 // -// MAPPING: %0 = "neura.grant_once"() <{constant_value = 0 : i64}> {dfg_id = 0 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = dense<0> : vector<4xi32>}> {dfg_id = 1 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data, i1> +// MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = 0 : i64}> {dfg_id = 0 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = dense<0> : vector<4xi32>}> {dfg_id = 1 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 2 : i32}]} : () -> !neura.data, i1> // MAPPING-NEXT: %2 = neura.reserve {dfg_id = 2 : i32} : !neura.data, i1> -// MAPPING-NEXT: %3 = "neura.data_mov"(%1) {dfg_id = 6 : i32, mapping_locs = [{id = 128 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %4 = neura.phi_start %3, %2 {dfg_id = 8 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : !neura.data, i1>, !neura.data, i1> -> !neura.data, i1> +// MAPPING-NEXT: %3 = "neura.data_mov"(%1) {dfg_id = 6 : i32, mapping_locs = [{id = 256 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %4 = neura.phi_start %3, %2 {dfg_id = 8 : i32, mapping_locs = [{id = 8 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, i1>, !neura.data, i1> -> !neura.data, i1> // MAPPING-NEXT: %5 = neura.reserve {dfg_id = 3 : i32} : !neura.data -// MAPPING-NEXT: %6 = "neura.data_mov"(%0) {dfg_id = 5 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %7 = neura.phi_start %6, %5 {dfg_id = 7 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %8 = "neura.data_mov"(%7) {dfg_id = 11 : i32, mapping_locs = [{id = 37 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %9 = "neura.gep"(%8) <{operandSegmentSizes = array}> {dfg_id = 15 : i32, lhs_value = "%arg0", mapping_locs = [{id = 15 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {dfg_id = 19 : i32, mapping_locs = [{id = 480 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %11 = "neura.load"(%10) {dfg_id = 22 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data, i1> -// MAPPING-NEXT: %12 = "neura.data_mov"(%7) {dfg_id = 10 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %13 = "neura.gep"(%12) <{operandSegmentSizes = array}> {dfg_id = 14 : i32, lhs_value = "%arg2", mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {dfg_id = 18 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %15 = "neura.load"(%14) {dfg_id = 21 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data, i1> -// MAPPING-NEXT: %16 = "neura.data_mov"(%15) {dfg_id = 25 : i32, mapping_locs = [{id = 34 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %17 = "neura.data_mov"(%11) {dfg_id = 26 : i32, mapping_locs = [{id = 46 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %18 = "neura.vmul"(%16, %17) {dfg_id = 28 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, i1>, !neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %19 = "neura.data_mov"(%18) {dfg_id = 31 : i32, mapping_locs = [{id = 43 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 42 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %20 = "neura.data_mov"(%4) {dfg_id = 12 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 16 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %21 = "neura.vadd"(%19, %20) {dfg_id = 33 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, i1>, !neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %22 = "neura.data_mov"(%7) {dfg_id = 9 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %23 = "neura.add"(%22) {dfg_id = 13 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 4 : i64} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %24 = "neura.data_mov"(%23) {dfg_id = 17 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %25 = "neura.icmp"(%24) <{cmpType = "eq"}> {dfg_id = 20 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 32 : i64} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {dfg_id = 24 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %6 = "neura.data_mov"(%0) {dfg_id = 5 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %7 = neura.phi_start %6, %5 {dfg_id = 7 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %8 = "neura.data_mov"(%7) {dfg_id = 11 : i32, mapping_locs = [{id = 33 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %9 = "neura.gep"(%8) <{operandSegmentSizes = array}> {dfg_id = 15 : i32, lhs_value = "%arg0", mapping_locs = [{id = 6 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {dfg_id = 19 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %11 = "neura.load"(%10) {dfg_id = 22 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data, i1> +// MAPPING-NEXT: %12 = "neura.data_mov"(%7) {dfg_id = 10 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %13 = "neura.gep"(%12) <{operandSegmentSizes = array}> {dfg_id = 14 : i32, lhs_value = "%arg2", mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {dfg_id = 18 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %15 = "neura.load"(%14) {dfg_id = 21 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data, i1> +// MAPPING-NEXT: %16 = "neura.data_mov"(%15) {dfg_id = 25 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %17 = "neura.data_mov"(%11) {dfg_id = 26 : i32, mapping_locs = [{id = 18 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %18 = "neura.vmul"(%16, %17) {dfg_id = 28 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data, i1>, !neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %19 = "neura.data_mov"(%18) {dfg_id = 31 : i32, mapping_locs = [{id = 21 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 17 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %20 = "neura.data_mov"(%4) {dfg_id = 12 : i32, mapping_locs = [{id = 24 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 29 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %21 = "neura.vadd"(%19, %20) {dfg_id = 33 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, i1>, !neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %22 = "neura.data_mov"(%7) {dfg_id = 9 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %23 = "neura.add"(%22) {dfg_id = 13 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 4 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %24 = "neura.data_mov"(%23) {dfg_id = 17 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %25 = "neura.icmp"(%24) <{cmpType = "eq"}> {dfg_id = 20 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 32 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {dfg_id = 24 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %27 = "neura.not"(%26) {dfg_id = 27 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %28 = "neura.data_mov"(%23) {dfg_id = 16 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %29 = "neura.data_mov"(%27) {dfg_id = 30 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %28 = "neura.data_mov"(%23) {dfg_id = 16 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 2 : i32}, {id = 321 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 3 : i32}, {id = 321 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %29 = "neura.data_mov"(%27) {dfg_id = 30 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %30 = neura.grant_predicate %28, %29 {dfg_id = 32 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %30 -> %5 {dfg_id = 34 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %31 = "neura.data_mov"(%21) {dfg_id = 36 : i32, mapping_locs = [{id = 29 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}, {id = 160 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %32 = "neura.data_mov"(%27) {dfg_id = 29 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 29 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 161 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}, {id = 161 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {dfg_id = 38 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> -// MAPPING-NEXT: neura.ctrl_mov %33 -> %2 {dfg_id = 40 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data, i1> !neura.data, i1> -// MAPPING-NEXT: %34 = "neura.data_mov"(%21) {dfg_id = 35 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// MAPPING-NEXT: %35 = "neura.data_mov"(%25) {dfg_id = 23 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 35 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 31 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 289 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %30 -> %5 {dfg_id = 34 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %31 = "neura.data_mov"(%21) {dfg_id = 36 : i32, mapping_locs = [{id = 13 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}, {id = 128 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %32 = "neura.data_mov"(%27) {dfg_id = 29 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 27 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 25 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}, {id = 129 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {dfg_id = 38 : i32, mapping_locs = [{id = 4 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 1 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// MAPPING-NEXT: neura.ctrl_mov %33 -> %2 {dfg_id = 40 : i32, mapping_locs = [{id = 12 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data, i1> !neura.data, i1> +// MAPPING-NEXT: %34 = "neura.data_mov"(%21) {dfg_id = 35 : i32, mapping_locs = [{id = 16 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// MAPPING-NEXT: %35 = "neura.data_mov"(%25) {dfg_id = 23 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 288 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}, {id = 288 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 288 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %36 = neura.grant_predicate %34, %35 {dfg_id = 37 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> // MAPPING-NEXT: %37 = "neura.data_mov"(%36) {dfg_id = 39 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> // MAPPING-NEXT: %38 = "neura.vector.reduce.add"(%37) {dfg_id = 41 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, i1>) -> !neura.data -// MAPPING-NEXT: %39 = "neura.data_mov"(%38) {dfg_id = 42 : i32, mapping_locs = [{id = 288 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: neura.return_value %39 : !neura.data {dfg_id = 43 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 2 : i32}]} +// MAPPING-NEXT: %39 = "neura.data_mov"(%38) {dfg_id = 42 : i32, mapping_locs = [{id = 29 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: neura.return_value %39 : !neura.data {dfg_id = 43 : i32, mapping_locs = [{id = 5 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 1 : i32}]} // MAPPING-NEXT: neura.yield {dfg_id = 4 : i32} // YAML: array_config: @@ -87,84 +88,68 @@ // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - index_per_ii: 3 +// YAML-NEXT: - index_per_ii: 2 // YAML-NEXT: operations: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: id: 1 -// YAML-NEXT: time_step: 3 -// YAML-NEXT: invalid_iterations: 0 +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: id: 36 +// YAML-NEXT: time_step: 7 +// YAML-NEXT: invalid_iterations: 1 // YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "" +// YAML-NEXT: - operand: "EAST" // YAML-NEXT: color: "RED" // YAML-NEXT: dst_operands: // YAML-NEXT: - operand: "$0" // YAML-NEXT: color: "RED" -// YAML-NEXT: - index_per_ii: 4 -// YAML-NEXT: operations: -// YAML-NEXT: - opcode: "PHI_START" -// YAML-NEXT: id: 8 -// YAML-NEXT: time_step: 4 -// YAML-NEXT: invalid_iterations: 0 +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: id: 29 +// YAML-NEXT: time_step: 7 +// YAML-NEXT: invalid_iterations: 1 // YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: - operand: "NORTH" // YAML-NEXT: color: "RED" // YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: - operand: "$1" // YAML-NEXT: color: "RED" +// YAML-NEXT: - index_per_ii: 3 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_PREDICATE" +// YAML-NEXT: id: 38 +// YAML-NEXT: time_step: 8 +// YAML-NEXT: invalid_iterations: 1 +// YAML-NEXT: src_operands: // ASM: # Compiled II: 5 // ASM: PE(0,1): // ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [] -> [$0] (t=3, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=3) -// ASM-NEXT: { -// ASM-NEXT: PHI_START, [$0], [EAST, RED] -> [EAST, RED] (t=4, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=4) -// ASM: PE(1,1): -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [WEST, RED] -> [NORTH, RED] (t=5, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=0) -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$1] (t=6, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=1) -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=7, inv_iters=1) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=7, inv_iters=1) +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$1] (t=7, inv_iters=1) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [WEST, RED] (t=8, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [NORTH, RED] (t=8, inv_iters=1) // ASM-NEXT: } (idx_per_ii=3) -// ASM: PE(1,2): -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [SOUTH, RED] (t=5, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=0) +// ASM: PE(1,1): // ASM-NEXT: { -// ASM-NEXT: VADD, [NORTH, RED], [SOUTH, RED] -> [SOUTH, RED], [$0] (t=6, inv_iters=1) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$1] (t=6, inv_iters=1) +// ASM-NEXT: VADD, [EAST, RED], [NORTH, RED] -> [WEST, RED], [NORTH, RED] (t=6, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [$0] (t=7, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=2) -// ASM-NEXT: { -// ASM-NEXT: VECTOR.REDUCE.ADD, [$0] -> [$0] (t=8, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=3) -// ASM-NEXT: { -// ASM-NEXT: RETURN_VALUE, [$0] (t=9, inv_iters=1) +// ASM-NEXT: RETURN_VALUE, [NORTH, RED] (t=9, inv_iters=1) // ASM-NEXT: } (idx_per_ii=4) -// ASM: PE(2,2): +// ASM: PE(2,1): // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [EAST, RED] (t=5, inv_iters=1) // ASM-NEXT: DATA_MOV, [EAST, RED] -> [WEST, RED] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: GEP, [EAST, RED] -> [$0] (t=2, inv_iters=0) +// ASM-NEXT: GEP, [NORTH, RED] -> [$0] (t=2, inv_iters=0) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: LOAD, [$0] -> [NORTH, RED] (t=3, inv_iters=0) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=3, inv_iters=0) +// ASM-NEXT: LOAD, [$0] -> [EAST, RED] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) +// ASM: PE(3,1): // ASM-NEXT: { -// ASM-NEXT: NOT, [EAST, RED] -> [$1], [WEST, RED] (t=4, inv_iters=0) +// ASM-NEXT: VMUL, [NORTH, RED], [WEST, RED] -> [WEST, RED] (t=4, inv_iters=0) // ASM-NEXT: } (idx_per_ii=4) +// ASM: PE(0,2): +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [SOUTH, RED] (t=6, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=1) diff --git a/test/e2e/histogram/histogram_kernel.mlir b/test/e2e/histogram/histogram_kernel.mlir index 4c084322..ca045ef3 100644 --- a/test/e2e/histogram/histogram_kernel.mlir +++ b/test/e2e/histogram/histogram_kernel.mlir @@ -24,156 +24,129 @@ // RUN: FileCheck %s --input-file=tmp-generated-instructions.asm --check-prefix=ASM -// MAPPING: func.func -// MAPPING-SAME: compiled_ii = 5 -// MAPPING-SAME: mapping_mode = "spatial-temporal" -// MAPPING-SAME: mapping_strategy = "heuristic" -// MAPPING-SAME: rec_mii = 5 -// MAPPING-SAME: res_mii = 2 -// MAPPING-SAME: x_tiles = 4 -// MAPPING-SAME: y_tiles = 4 + +// MAPPING: func.func @_Z6kernelPiS_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}) -> !llvm.void attributes {CConv = #llvm.cconv, accelerator = "neura", dataflow_mode = "predicate", linkage = #llvm.linkage, mapping_info = {compiled_ii = 5 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 5 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}, 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", unnamed_addr = 1 : i64, visibility_ = 0 : i64} { // MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = 0 : i64}> {dfg_id = 0 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data // MAPPING-NEXT: %1 = neura.reserve {dfg_id = 1 : i32} : !neura.data -// MAPPING-NEXT: %2 = "neura.data_mov"(%0) {dfg_id = 3 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %3 = neura.phi_start %2, %1 {dfg_id = 4 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %4 = "neura.data_mov"(%3) {dfg_id = 6 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %5 = "neura.gep"(%4) <{operandSegmentSizes = array}> {dfg_id = 8 : i32, lhs_value = "%arg0", mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %6 = "neura.data_mov"(%5) {dfg_id = 11 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %7 = "neura.load"(%6) {dfg_id = 13 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %8 = "neura.data_mov"(%7) {dfg_id = 17 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %2 = "neura.data_mov"(%0) {dfg_id = 3 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %3 = neura.phi_start %2, %1 {dfg_id = 4 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %4 = "neura.data_mov"(%3) {dfg_id = 6 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %5 = "neura.gep"(%4) <{operandSegmentSizes = array}> {dfg_id = 8 : i32, lhs_value = "%arg0", mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %6 = "neura.data_mov"(%5) {dfg_id = 11 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %7 = "neura.load"(%6) {dfg_id = 13 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %8 = "neura.data_mov"(%7) {dfg_id = 17 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %9 = "neura.mul"(%8) {dfg_id = 20 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 5 : i32} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {dfg_id = 23 : i32, mapping_locs = [{id = 37 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %11 = "neura.add"(%10) {dfg_id = 26 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 3 : i32, y = 3 : i32}], rhs_value = -5 : i32} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %12 = "neura.data_mov"(%11) {dfg_id = 28 : i32, mapping_locs = [{id = 480 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %13 = "neura.div"(%12) {dfg_id = 29 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 3 : i32, y = 3 : i32}], rhs_value = 18 : i32} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {dfg_id = 30 : i32, mapping_locs = [{id = 480 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %15 = neura.sext %14 {dfg_id = 31 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 3 : i32, y = 3 : i32}]} : !neura.data -> !neura.data -// MAPPING-NEXT: %16 = "neura.data_mov"(%15) {dfg_id = 32 : i32, mapping_locs = [{id = 480 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %17 = "neura.gep"(%16) <{operandSegmentSizes = array}> {dfg_id = 33 : i32, lhs_value = "%arg1", mapping_locs = [{id = 15 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %18 = "neura.data_mov"(%17) {dfg_id = 35 : i32, mapping_locs = [{id = 480 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %19 = "neura.load"(%18) {dfg_id = 36 : i32, mapping_locs = [{id = 15 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 9 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %20 = "neura.data_mov"(%19) {dfg_id = 37 : i32, mapping_locs = [{id = 46 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 9 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %21 = "neura.add"(%20) {dfg_id = 38 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 10 : i32, x = 2 : i32, y = 3 : i32}], rhs_value = 1 : i32} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %22 = "neura.data_mov"(%21) {dfg_id = 39 : i32, mapping_locs = [{id = 448 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %23 = "neura.data_mov"(%17) {dfg_id = 34 : i32, mapping_locs = [{id = 46 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}, {id = 449 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}, {id = 449 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: "neura.store"(%22, %23) {dfg_id = 40 : i32, mapping_locs = [{id = 14 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 11 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, !neura.data) -> () -// MAPPING-NEXT: %24 = "neura.data_mov"(%3) {dfg_id = 5 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %25 = "neura.add"(%24) {dfg_id = 7 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 1 : i64} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {dfg_id = 10 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %27 = "neura.icmp"(%26) <{cmpType = "eq"}> {dfg_id = 12 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 20 : i64} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %28 = "neura.data_mov"(%27) {dfg_id = 16 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {dfg_id = 23 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %11 = "neura.add"(%10) {dfg_id = 26 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 3 : i32, y = 1 : i32}], rhs_value = -5 : i32} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %12 = "neura.data_mov"(%11) {dfg_id = 28 : i32, mapping_locs = [{id = 224 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %13 = "neura.div"(%12) {dfg_id = 29 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 3 : i32, y = 1 : i32}], rhs_value = 18 : i32} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {dfg_id = 30 : i32, mapping_locs = [{id = 224 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %15 = neura.sext %14 {dfg_id = 31 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data -> !neura.data +// MAPPING-NEXT: %16 = "neura.data_mov"(%15) {dfg_id = 32 : i32, mapping_locs = [{id = 224 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %17 = "neura.gep"(%16) <{operandSegmentSizes = array}> {dfg_id = 33 : i32, lhs_value = "%arg1", mapping_locs = [{id = 7 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %18 = "neura.data_mov"(%17) {dfg_id = 35 : i32, mapping_locs = [{id = 21 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %19 = "neura.load"(%18) {dfg_id = 36 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 9 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %20 = "neura.data_mov"(%19) {dfg_id = 37 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %21 = "neura.add"(%20) {dfg_id = 38 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 10 : i32, x = 2 : i32, y = 1 : i32}], rhs_value = 1 : i32} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %22 = "neura.data_mov"(%21) {dfg_id = 39 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %23 = "neura.data_mov"(%17) {dfg_id = 34 : i32, mapping_locs = [{id = 224 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}, {id = 21 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 9 : i32}, {id = 193 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.store"(%22, %23) {dfg_id = 40 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 11 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> () +// MAPPING-NEXT: %24 = "neura.data_mov"(%3) {dfg_id = 5 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %25 = "neura.add"(%24) {dfg_id = 7 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 1 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %26 = "neura.data_mov"(%25) {dfg_id = 10 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %27 = "neura.icmp"(%26) <{cmpType = "eq"}> {dfg_id = 12 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 20 : i64} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %28 = "neura.data_mov"(%27) {dfg_id = 16 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %29 = "neura.not"(%28) {dfg_id = 19 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %30 = "neura.data_mov"(%25) {dfg_id = 9 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %31 = "neura.data_mov"(%29) {dfg_id = 22 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %30 = "neura.data_mov"(%25) {dfg_id = 9 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 2 : i32}, {id = 321 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 3 : i32}, {id = 321 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %31 = "neura.data_mov"(%29) {dfg_id = 22 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %32 = neura.grant_predicate %30, %31 {dfg_id = 25 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %32 -> %1 {dfg_id = 27 : i32, mapping_locs = [{id = 32 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %33 = "neura.data_mov"(%27) {dfg_id = 14 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 224 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}, {id = 224 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 224 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}, {id = 224 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 224 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}, {id = 224 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %34 = "neura.data_mov"(%27) {dfg_id = 15 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 36 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 225 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}, {id = 225 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}, {id = 225 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}, {id = 225 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}, {id = 225 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %35 = neura.grant_predicate %33, %34 {dfg_id = 18 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 10 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %36 = "neura.data_mov"(%35) {dfg_id = 21 : i32, mapping_locs = [{id = 226 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: neura.return_void %36 : !neura.data {dfg_id = 24 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 11 : i32, x = 3 : i32, y = 1 : i32}]} +// MAPPING-NEXT: neura.ctrl_mov %32 -> %1 {dfg_id = 27 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %33 = "neura.data_mov"(%27) {dfg_id = 14 : i32, mapping_locs = [{id = 31 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 288 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}, {id = 288 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 288 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}, {id = 288 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 288 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}, {id = 288 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %34 = "neura.data_mov"(%27) {dfg_id = 15 : i32, mapping_locs = [{id = 322 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 3 : i32}, {id = 31 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 289 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}, {id = 289 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}, {id = 289 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}, {id = 289 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}, {id = 289 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %35 = neura.grant_predicate %33, %34 {dfg_id = 18 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %36 = "neura.data_mov"(%35) {dfg_id = 21 : i32, mapping_locs = [{id = 290 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: neura.return_void %36 : !neura.data {dfg_id = 24 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 11 : i32, x = 1 : i32, y = 2 : i32}]} // MAPPING-NEXT: neura.yield {dfg_id = 2 : i32} - +// MAPPING-NEXT: } +// MAPPING-NEXT: } // YAML: array_config: // YAML-NEXT: columns: 4 // YAML-NEXT: rows: 4 // YAML-NEXT: compiled_ii: 5 // YAML-NEXT: cores: -// YAML-NEXT: - column: 3 +// YAML-NEXT: - column: 2 // YAML-NEXT: row: 1 -// YAML-NEXT: core_id: "7" +// YAML-NEXT: core_id: "6" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: // YAML-NEXT: - index_per_ii: 0 // YAML-NEXT: operations: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: id: 15 -// YAML-NEXT: time_step: 5 -// YAML-NEXT: invalid_iterations: 1 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$1" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - opcode: "GRANT_PREDICATE" -// YAML-NEXT: id: 18 +// YAML-NEXT: - opcode: "ADD" +// YAML-NEXT: id: 38 // YAML-NEXT: time_step: 10 // YAML-NEXT: invalid_iterations: 2 // YAML-NEXT: src_operands: // YAML-NEXT: - operand: "$0" // YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$1" +// YAML-NEXT: - operand: "#1" // YAML-NEXT: color: "RED" // YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$2" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - index_per_ii: 1 -// YAML-NEXT: operations: -// YAML-NEXT: - opcode: "RETURN_VOID" -// YAML-NEXT: id: 24 -// YAML-NEXT: time_step: 11 -// YAML-NEXT: invalid_iterations: 2 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$2" +// YAML-NEXT: - operand: "$0" // YAML-NEXT: color: "RED" -// YAML-NEXT: - index_per_ii: 4 -// YAML-NEXT: operations: // YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: id: 14 -// YAML-NEXT: time_step: 4 -// YAML-NEXT: invalid_iterations: 0 +// YAML-NEXT: id: 34 +// YAML-NEXT: time_step: 10 +// YAML-NEXT: invalid_iterations: 2 // YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: - operand: "EAST" // YAML-NEXT: color: "RED" // YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$0" +// YAML-NEXT: - operand: "$1" // YAML-NEXT: color: "RED" +// YAML-NEXT: - index_per_ii: 1 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "STORE" +// YAML-NEXT: id: 40 +// YAML-NEXT: time_step: 11 // ASM: # Compiled II: 5 -// ASM: PE(3,1): +// ASM: PE(2,1): // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$1] (t=5, inv_iters=1) -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [$2] (t=10, inv_iters=2) +// ASM-NEXT: ADD, [$0], [#1] -> [$0] (t=10, inv_iters=2) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$1] (t=10, inv_iters=2) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: RETURN_VOID, [$2] (t=11, inv_iters=2) +// ASM-NEXT: STORE, [$0], [$1] (t=11, inv_iters=2) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=4, inv_iters=0) +// ASM-NEXT: LOAD, [EAST, RED] -> [$0] (t=9, inv_iters=1) // ASM-NEXT: } (idx_per_ii=4) -// ASM: PE(2,2): +// ASM: PE(3,1): // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [EAST, RED] (t=5, inv_iters=1) +// ASM-NEXT: ADD, [NORTH, RED], [#-5] -> [$0] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: GEP, [EAST, RED] -> [$0] (t=2, inv_iters=0) +// ASM-NEXT: DIV, [$0], [#18] -> [$0] (t=6, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=1) +// ASM-NEXT: { +// ASM-NEXT: SEXT, [$0] -> [$0] (t=7, inv_iters=1) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: LOAD, [$0] -> [EAST, RED] (t=3, inv_iters=0) -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=3, inv_iters=0) +// ASM-NEXT: GEP, [$0] -> [WEST, RED], [$0] (t=8, inv_iters=1) // ASM-NEXT: } (idx_per_ii=3) // ASM-NEXT: { -// ASM-NEXT: NOT, [EAST, RED] -> [$1] (t=4, inv_iters=0) +// ASM-NEXT: DATA_MOV, [$0] -> [WEST, RED] (t=9, inv_iters=1) // ASM-NEXT: } (idx_per_ii=4) -// ASM: PE(3,2): +// ASM: PE(1,2): // ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [#0] -> [$0] (t=0, inv_iters=0) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$1] (t=5, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [$2] (t=10, inv_iters=2) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: PHI_START, [$0], [WEST, RED] -> [WEST, RED], [$0] (t=1, inv_iters=0) +// ASM-NEXT: RETURN_VOID, [$2] (t=11, inv_iters=2) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: ADD, [$0], [#1] -> [$0], [WEST, RED] (t=2, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=2) -// ASM-NEXT: { -// ASM-NEXT: ICMP_EQ, [$0], [#20] -> [WEST, RED], [SOUTH, RED], [$0] (t=3, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=3) -// ASM-NEXT: { -// ASM-NEXT: MUL, [WEST, RED], [#5] -> [NORTH, RED] (t=4, inv_iters=0) -// ASM-NEXT: DATA_MOV, [$0] -> [SOUTH, RED] (t=4, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=4) // RUN: mlir-neura-opt %t-kernel.mlir --view-op-graph 2>&1 | sed -n '/^digraph G {/,/^}$/p' > histogram_kernel_original.dot // RUN: dot -Tpng histogram_kernel_original.dot -o histogram_kernel_original.png diff --git a/test/e2e/relu/relu_kernel.mlir b/test/e2e/relu/relu_kernel.mlir index 915cb53d..3b4d0832 100644 --- a/test/e2e/relu/relu_kernel.mlir +++ b/test/e2e/relu/relu_kernel.mlir @@ -37,126 +37,108 @@ // MAPPING: func.func @kernel(%arg0: i32 {llvm.noundef}, %arg1: i32 {llvm.noundef}, %arg2: i32 {llvm.noundef}, %arg3: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.writeonly}, %arg4: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg5: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readnone}) -> !llvm.void attributes {CConv = #llvm.cconv, accelerator = "neura", dataflow_mode = "predicate", linkage = #llvm.linkage, mapping_info = {compiled_ii = 5 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 5 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}, memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["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", unnamed_addr = 1 : i64, visibility_ = 0 : i64} { // MAPPING: %0 = "neura.grant_once"() <{constant_value = 0 : i32}> {dfg_id = 0 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data // MAPPING-NEXT: %1 = neura.reserve {dfg_id = 1 : i32} : !neura.data -// MAPPING-NEXT: %2 = "neura.data_mov"(%0) {dfg_id = 4 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 0 : i32}, {id = 31 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}, {id = 288 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}, {id = 288 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 288 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}, {id = 288 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 5 : i32}, {id = 288 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %3 = neura.phi_start %2, %1 {dfg_id = 6 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %4 = neura.reserve {dfg_id = 2 : i32} : !neura.data -// MAPPING-NEXT: %5 = "neura.data_mov"(%0) {dfg_id = 5 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 0 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %6 = neura.phi_start %5, %4 {dfg_id = 7 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %7 = "neura.data_mov"(%6) {dfg_id = 11 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %8 = "neura.cast"(%7) <{cast_type = "trunc"}> {dfg_id = 13 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %9 = "neura.data_mov"(%8) {dfg_id = 17 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 2 : i32}, {id = 321 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %10 = "neura.div"(%9) {dfg_id = 20 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 70 : i16} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %11 = "neura.data_mov"(%8) {dfg_id = 16 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %12 = "neura.rem"(%11) {dfg_id = 19 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}], rhs_value = 70 : i16} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %13 = "neura.data_mov"(%10) {dfg_id = 25 : i32, mapping_locs = [{id = 321 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}, {id = 321 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %14 = neura.zext %13 {dfg_id = 29 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data -> !neura.data -// MAPPING-NEXT: %15 = "neura.data_mov"(%12) {dfg_id = 24 : i32, mapping_locs = [{id = 320 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 320 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %16 = neura.zext %15 {dfg_id = 28 : i32, mapping_locs = [{id = 10 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data -> !neura.data -// MAPPING-NEXT: %17 = "neura.data_mov"(%14) {dfg_id = 36 : i32, mapping_locs = [{id = 33 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %18 = "neura.data_mov"(%16) {dfg_id = 34 : i32, mapping_locs = [{id = 33 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 192 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %19 = "neura.gep"(%17, %18) <{operandSegmentSizes = array}> {dfg_id = 41 : i32, lhs_value = "%arg4", mapping_locs = [{id = 6 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %20 = "neura.data_mov"(%19) {dfg_id = 45 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %21 = "neura.load"(%20) {dfg_id = 46 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %22 = "neura.data_mov"(%21) {dfg_id = 48 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %23 = "neura.icmp"(%22) <{cmpType = "sge"}> {dfg_id = 49 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 9 : i32, x = 2 : i32, y = 1 : i32}], rhs_value = 0 : i32} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %24 = "neura.data_mov"(%23) {dfg_id = 50 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %25 = "neura.data_mov"(%21) {dfg_id = 47 : i32, mapping_locs = [{id = 193 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}, {id = 193 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %26 = "neura.data_mov"(%3) {dfg_id = 9 : i32, mapping_locs = [{id = 28 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 7 : i32}, {id = 33 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}, {id = 194 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %27 = "neura.sel"(%24, %25, %26) {dfg_id = 51 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 10 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %28 = "neura.data_mov"(%14) {dfg_id = 35 : i32, mapping_locs = [{id = 34 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 6 : i32}, {id = 448 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %29 = "neura.data_mov"(%16) {dfg_id = 33 : i32, mapping_locs = [{id = 34 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 449 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}, {id = 449 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %30 = "neura.gep"(%28, %29) <{operandSegmentSizes = array}> {dfg_id = 40 : i32, lhs_value = "%arg3", mapping_locs = [{id = 14 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %31 = "neura.data_mov"(%27) {dfg_id = 52 : i32, mapping_locs = [{id = 192 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %32 = "neura.data_mov"(%30) {dfg_id = 44 : i32, mapping_locs = [{id = 45 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 8 : i32}, {id = 33 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 9 : i32}, {id = 193 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: "neura.store"(%31, %32) {dfg_id = 53 : i32, mapping_locs = [{id = 6 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, resource = "tile", time_step = 11 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> () -// MAPPING-NEXT: %33 = "neura.data_mov"(%6) {dfg_id = 10 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 1 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %34 = "neura.add"(%33) {dfg_id = 12 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 1 : i32} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %35 = "neura.data_mov"(%34) {dfg_id = 15 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %36 = "neura.icmp"(%35) <{cmpType = "eq"}> {dfg_id = 18 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}], rhs_value = 4200 : i32} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %37 = "neura.data_mov"(%36) {dfg_id = 23 : i32, mapping_locs = [{id = 352 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %38 = "neura.not"(%37) {dfg_id = 27 : i32, mapping_locs = [{id = 11 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "tile", time_step = 4 : i32, x = 3 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %39 = "neura.data_mov"(%34) {dfg_id = 14 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 2 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 224 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 3 : i32}, {id = 224 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %40 = "neura.data_mov"(%38) {dfg_id = 32 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %41 = neura.grant_predicate %39, %40 {dfg_id = 39 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 5 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %41 -> %4 {dfg_id = 43 : i32, mapping_locs = [{id = 23 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %42 = "neura.data_mov"(%3) {dfg_id = 8 : i32, mapping_locs = [{id = 289 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}, {id = 289 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %43 = "neura.data_mov"(%38) {dfg_id = 31 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 31 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 290 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 6 : i32}, {id = 290 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 7 : i32}, {id = 290 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 2 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %44 = neura.grant_predicate %42, %43 {dfg_id = 38 : i32, mapping_locs = [{id = 9 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %44 -> %1 {dfg_id = 42 : i32, mapping_locs = [{id = 289 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 9 : i32}, {id = 289 : i32, index_per_ii = 0 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 10 : i32}, {id = 289 : i32, index_per_ii = 1 : i32, invalid_iterations = 2 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 11 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %45 = "neura.data_mov"(%36) {dfg_id = 21 : i32, mapping_locs = [{id = 36 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 225 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 4 : i32}, {id = 225 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 5 : i32}, {id = 225 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 6 : i32}, {id = 225 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %46 = "neura.data_mov"(%36) {dfg_id = 22 : i32, mapping_locs = [{id = 35 : i32, index_per_ii = 3 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 3 : i32}, {id = 32 : i32, index_per_ii = 4 : i32, invalid_iterations = 0 : i32, resource = "link", time_step = 4 : i32}, {id = 36 : i32, index_per_ii = 0 : i32, invalid_iterations = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 224 : i32, index_per_ii = 1 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 6 : i32}, {id = 224 : i32, index_per_ii = 2 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 0 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %47 = neura.grant_predicate %45, %46 {dfg_id = 26 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 8 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %48 = "neura.data_mov"(%47) {dfg_id = 30 : i32, mapping_locs = [{id = 225 : i32, index_per_ii = 3 : i32, invalid_iterations = 1 : i32, per_tile_register_id = 1 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: neura.return_void %48 : !neura.data {dfg_id = 37 : i32, mapping_locs = [{id = 7 : i32, index_per_ii = 4 : i32, invalid_iterations = 1 : i32, resource = "tile", time_step = 9 : i32, x = 3 : i32, y = 1 : i32}]} -// MAPPING-NEXT: neura.yield {dfg_id = 3 : i32} - - // YAML: array_config: // YAML-NEXT: columns: 4 // YAML-NEXT: rows: 4 // YAML-NEXT: compiled_ii: 5 // YAML-NEXT: cores: // YAML-NEXT: - column: 2 -// YAML-NEXT: row: 1 -// YAML-NEXT: core_id: "6" +// YAML-NEXT: row: 0 +// YAML-NEXT: core_id: "2" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - index_per_ii: 0 +// YAML-NEXT: - index_per_ii: 4 // YAML-NEXT: operations: -// YAML-NEXT: - opcode: "SEL" -// YAML-NEXT: id: 51 -// YAML-NEXT: time_step: 10 -// YAML-NEXT: invalid_iterations: 2 +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: id: 440001 +// YAML-NEXT: time_step: 9 +// YAML-NEXT: invalid_iterations: 1 // YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$1" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$2" +// YAML-NEXT: - operand: "EAST" // YAML-NEXT: color: "RED" // YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: id: 44 -// YAML-NEXT: time_step: 10 -// YAML-NEXT: invalid_iterations: 2 -// YAML-NEXT: src_operands: // YAML-NEXT: - operand: "NORTH" // YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$1" +// YAML-NEXT: - column: 3 +// YAML-NEXT: row: 0 - -// ASM: # Compiled II: 5 +// ASM: # Compiled II: 5 +// ASM: PE(2,0): +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=9, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=4) +// ASM: PE(3,0): +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=5, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=0) +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$1] (t=7, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=2) +// ASM-NEXT: { +// ASM-NEXT: GEP, [$0], [$1] -> [WEST, RED] (t=8, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=3) // ASM: PE(2,1): // ASM-NEXT: { -// ASM-NEXT: SEL, [$0], [$1], [$2] -> [$0] (t=10, inv_iters=2) -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$1] (t=10, inv_iters=2) +// ASM-NEXT: STORE, [$0], [SOUTH, RED] (t=10, inv_iters=2) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=6, inv_iters=1) -// ASM-NEXT: STORE, [$0], [$1] (t=11, inv_iters=2) +// ASM-NEXT: ICMP_SGE, [EAST, RED], [#0] -> [$0] (t=7, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=2) +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$1] (t=8, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=3) +// ASM-NEXT: { +// ASM-NEXT: SEL, [$0], [$1], [NORTH, RED] -> [$0] (t=9, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=4) +// ASM: PE(3,1): +// ASM-NEXT: { +// ASM-NEXT: GEP, [$0], [NORTH, RED] -> [$0] (t=5, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=0) +// ASM-NEXT: { +// ASM-NEXT: LOAD, [$0] -> [WEST, RED], [$0] (t=6, inv_iters=1) +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [SOUTH, RED] (t=6, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: GEP, [NORTH, RED], [$0] -> [$0] (t=7, inv_iters=1) +// ASM-NEXT: DATA_MOV, [$0] -> [WEST, RED] (t=7, inv_iters=1) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: LOAD, [$0] -> [$0], [$1] (t=8, inv_iters=1) +// ASM-NEXT: DIV, [NORTH, RED], [#70] -> [$0] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) // ASM-NEXT: { -// ASM-NEXT: ICMP_SGE, [$0], [#0] -> [$0] (t=9, inv_iters=1) -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$2] (t=9, inv_iters=1) +// ASM-NEXT: ZEXT, [$0] -> [$0], [SOUTH, RED] (t=4, inv_iters=0) // ASM-NEXT: } (idx_per_ii=4) -// ASM: PE(3,1): +// ASM: PE(1,2): +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$2] (t=5, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=0) +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$4] (t=6, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=1) +// ASM-NEXT: { +// ASM-NEXT: PHI_START, [$0], [$3] -> [EAST, RED], [$3] (t=7, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=2) +// ASM-NEXT: { +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$0] (t=3, inv_iters=0) +// ASM-NEXT: GRANT_PREDICATE, [$1], [$2] -> [NORTH, RED] (t=8, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=3) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [NORTH, RED] -> [NORTH, RED] (t=5, inv_iters=1) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [$1] (t=4, inv_iters=0) +// ASM-NEXT: GRANT_PREDICATE, [$3], [$4] -> [$3] (t=9, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=4) +// ASM: PE(2,2): +// ASM-NEXT: { +// ASM-NEXT: GRANT_PREDICATE, [$1], [$0] -> [$0] (t=5, inv_iters=1) +// ASM-NEXT: DATA_MOV, [$2] -> [WEST, RED] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=6, inv_iters=1) +// ASM-NEXT: PHI_START, [EAST, RED], [$0] -> [EAST, RED], [$0] (t=1, inv_iters=0) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=3, inv_iters=0) -// ASM-NEXT: GRANT_PREDICATE, [$1], [$0] -> [$1] (t=8, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=3) \ No newline at end of file +// ASM-NEXT: ADD, [$0], [#1] -> [$0], [$1] (t=2, inv_iters=0) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [WEST, RED] (t=2, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=2) +// ASM-NEXT: { +// ASM-NEXT: ICMP_EQ, [$0], [#4200] -> [$0], [WEST, RED], [$2] (t=3, inv_iters=0) +// ASM-NEXT: DATA_MOV, [WEST, RED] -> [SOUTH, RED] (t=8, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=3) diff --git a/test/mapping_quality/branch_for.mlir b/test/mapping_quality/branch_for.mlir index 6858d0a1..07db3866 100644 --- a/test/mapping_quality/branch_for.mlir +++ b/test/mapping_quality/branch_for.mlir @@ -195,8 +195,7 @@ func.func @loop_test() -> f32 { // MOV-NEXT: neura.return_value %25 : !neura.data // MOV-NEXT: neura.yield -// MAPPING: func.func @loop_test() -> f32 attributes {accelerator = "neura", dataflow_mode = "predicate", mapping_info = {compiled_ii = 4 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 4 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { - +// MAPPING: func.func @loop_test() -> f32 attributes {accelerator = "neura", dataflow_mode = "predicate", mapping_info = {compiled_ii = 4 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 4 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { // YAML: array_config: // YAML-NEXT: columns: 4 @@ -221,64 +220,55 @@ func.func @loop_test() -> f32 { // YAML-NEXT: dst_operands: // YAML-NEXT: - operand: "EAST" // YAML-NEXT: color: "RED" +// YAML-NEXT: - column: 1 +// YAML-NEXT: row: 0 +// YAML-NEXT: core_id: "1" +// YAML-NEXT: entries: +// YAML-NEXT: - entry_id: "entry0" +// YAML-NEXT: instructions: // YAML-NEXT: - index_per_ii: 1 // YAML-NEXT: operations: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: id: 0 +// YAML-NEXT: - opcode: "PHI_START" +// YAML-NEXT: id: 17 // YAML-NEXT: time_step: 1 // YAML-NEXT: invalid_iterations: 0 // YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "#10" +// YAML-NEXT: - operand: "WEST" // YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: // YAML-NEXT: - operand: "EAST" // YAML-NEXT: color: "RED" -// YAML-NEXT: - index_per_ii: 3 -// YAML-NEXT: operations: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: id: 210001 -// YAML-NEXT: time_step: 3 -// YAML-NEXT: invalid_iterations: 0 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" - // ASM: # Compiled II: 4 // ASM: PE(0,0): // ASM-NEXT: { // ASM-NEXT: GRANT_ONCE, [#0] -> [EAST, RED] (t=0, inv_iters=0) // ASM-NEXT: } (idx_per_ii=0) +// ASM: PE(1,0): // ASM-NEXT: { -// ASM-NEXT: GRANT_ONCE, [#10] -> [EAST, RED] (t=1, inv_iters=0) +// ASM-NEXT: PHI_START, [WEST, RED], [EAST, RED] -> [NORTH, RED] (t=1, inv_iters=0) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=3, inv_iters=0) +// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) -// ASM: PE(1,0): +// ASM: PE(2,0): // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [NORTH, RED] -> [$0] (t=4, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [WEST, RED], [NORTH, RED] -> [WEST, RED] (t=4, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) +// ASM: PE(3,0): // ASM-NEXT: { -// ASM-NEXT: PHI_START, [WEST, RED], [$0] -> [NORTH, RED] (t=1, inv_iters=0) +// ASM-NEXT: GRANT_ONCE, [#10] -> [NORTH, RED] (t=1, inv_iters=0) // ASM-NEXT: } (idx_per_ii=1) +// ASM: PE(1,1): // ASM-NEXT: { -// ASM-NEXT: PHI_START, [WEST, RED], [NORTH, RED] -> [NORTH, RED], [WEST, RED] (t=2, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=2) -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=3, inv_iters=0) -// ASM-NEXT: } (idx_per_ii=3) -// ASM: PE(2,0): -// ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [NORTH, RED] -> [$0] (t=4, inv_iters=1) +// ASM-NEXT: GRANT_ONCE, [#1] -> [$0] (t=0, inv_iters=0) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=4, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [$0], [NORTH, RED] -> [NORTH, RED] (t=6, inv_iters=1) +// ASM-NEXT: PHI_START, [$0], [EAST, RED] -> [$0], [EAST, RED] (t=1, inv_iters=0) +// ASM-NEXT: } (idx_per_ii=1) +// ASM-NEXT: { +// ASM-NEXT: ADD, [SOUTH, RED], [$0] -> [EAST, RED], [SOUTH, RED] (t=2, inv_iters=0) // ASM-NEXT: } (idx_per_ii=2) -// ASM: PE(0,1): +// ASM: PE(2,1): // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [SOUTH, RED], [EAST, RED] -> [EAST, RED] (t=4, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=0) +// ASM-NEXT: GRANT_PREDICATE, [$0], [$1] -> [WEST, RED] (t=4, inv_iters=1) diff --git a/test/mapping_quality/tiny_loop.mlir b/test/mapping_quality/tiny_loop.mlir index 64f3edd4..1b23c2bf 100644 --- a/test/mapping_quality/tiny_loop.mlir +++ b/test/mapping_quality/tiny_loop.mlir @@ -81,6 +81,6 @@ module { // CHECK-NEXT: "neura.return"(%15) : (i64) -> () // CHECK-NEXT: } -// SPATIAL: func.func @simple_add_loop() -> i64 attributes {accelerator = "neura", dataflow_mode = "predicate", mapping_info = {compiled_ii = 4 : i32, mapping_mode = "spatial-only", mapping_strategy = "heuristic", rec_mii = 3 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { +// SPATIAL: func.func @simple_add_loop() -> i64 attributes {accelerator = "neura", dataflow_mode = "predicate", mapping_info = {compiled_ii = 5 : i32, mapping_mode = "spatial-only", mapping_strategy = "heuristic", rec_mii = 3 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { // SPATIAL-TEMPORAL: func.func @simple_add_loop() -> i64 attributes {accelerator = "neura", dataflow_mode = "predicate", mapping_info = {compiled_ii = 3 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 3 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { \ No newline at end of file diff --git a/test/neura/ctrl/branch_for.mlir b/test/neura/ctrl/branch_for.mlir index bb8aff85..6ea1910d 100644 --- a/test/neura/ctrl/branch_for.mlir +++ b/test/neura/ctrl/branch_for.mlir @@ -239,7 +239,13 @@ func.func @loop_test() -> f32 { // YAML-NEXT: dst_operands: // YAML-NEXT: - operand: "NORTH" // YAML-NEXT: color: "RED" - +// YAML-NEXT: - index_per_ii: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: id: 1 +// YAML-NEXT: time_step: 2 +// YAML-NEXT: invalid_iterations: 0 +// YAML-NEXT: src_operands: // ASM: # Compiled II: 4 // ASM: PE(0,0): @@ -248,34 +254,32 @@ func.func @loop_test() -> f32 { // ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=4, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=5, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=1) -// ASM-NEXT: { // ASM-NEXT: GRANT_ONCE, [#0.000000] -> [$0] (t=2, inv_iters=0) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: PHI_START, [$0], [NORTH, RED] -> [EAST, RED] (t=3, inv_iters=0) +// ASM-NEXT: PHI_START, [$0], [NORTH, RED] -> [NORTH, RED] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) // ASM: PE(1,0): // ASM-NEXT: { -// ASM-NEXT: FADD, [WEST, RED], [#3.000000] -> [WEST, RED], [EAST, RED] (t=4, inv_iters=1) +// ASM-NEXT: GRANT_PREDICATE, [$1], [$0] -> [$0] (t=4, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: PHI_START, [WEST, RED], [NORTH, RED] -> [$0] (t=1, inv_iters=0) +// ASM-NEXT: PHI_START, [WEST, RED], [$0] -> [$0] (t=1, inv_iters=0) +// ASM-NEXT: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=5, inv_iters=1) // ASM-NEXT: } (idx_per_ii=1) // ASM-NEXT: { -// ASM-NEXT: ADD, [$0], [#1] -> [$0], [NORTH, RED] (t=2, inv_iters=0) +// ASM-NEXT: ADD, [$0], [#1] -> [$0], [$1] (t=2, inv_iters=0) // ASM-NEXT: } (idx_per_ii=2) // ASM-NEXT: { -// ASM-NEXT: ICMP_SLT, [$0], [#10] -> [NORTH, RED], [WEST, RED], [EAST, RED] (t=3, inv_iters=0) +// ASM-NEXT: ICMP_SLT, [$0], [#10] -> [$0], [WEST, RED], [EAST, RED] (t=3, inv_iters=0) // ASM-NEXT: } (idx_per_ii=3) // ASM: PE(2,0): // ASM-NEXT: { -// ASM-NEXT: NOT, [WEST, RED] -> [$0] (t=4, inv_iters=1) +// ASM-NEXT: NOT, [WEST, RED] -> [WEST, RED] (t=4, inv_iters=1) // ASM-NEXT: } (idx_per_ii=0) +// ASM: PE(0,1): // ASM-NEXT: { -// ASM-NEXT: GRANT_PREDICATE, [WEST, RED], [$0] -> [$0] (t=5, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=1) +// ASM-NEXT: FADD, [SOUTH, RED], [#3.000000] -> [$0], [EAST, RED] (t=4, inv_iters=1) +// ASM-NEXT: } (idx_per_ii=0) // ASM-NEXT: { -// ASM-NEXT: RETURN_VALUE, [$0] (t=6, inv_iters=1) -// ASM-NEXT: } (idx_per_ii=2) +// ASM-NEXT: DATA_MOV, [SOUTH, RED] -> [$1] (t=5, inv_iters=1) diff --git a/test/neura/fusion/test.mlir b/test/neura/fusion/test.mlir index d7d6711d..1b4e3121 100644 --- a/test/neura/fusion/test.mlir +++ b/test/neura/fusion/test.mlir @@ -33,7 +33,7 @@ // CHECK-FUSED-DAG: %85 = "neura.mul_add"(%82, %83, %84) : (!neura.data, !neura.data, !neura.data) -> !neura.data // CHECK-FUSED-DAG: %98 = "neura.mul_add"(%95, %96, %97) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CHECK-MAPPING: mapping_info = {compiled_ii = 13 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 9 : i32, res_mii = 5 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32} +// CHECK-MAPPING: mapping_info = {compiled_ii = 12 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 9 : i32, res_mii = 5 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32} // RUN: mlir-neura-opt --architecture-spec=%S/../../arch_spec/architecture.yaml --verify-each=true --mlir-print-ir-after-failure \ // RUN: --assign-accelerator \ diff --git a/test/neura/steer_ctrl/loop_with_return_value.mlir b/test/neura/steer_ctrl/loop_with_return_value.mlir index b71e0984..e9e1bf11 100644 --- a/test/neura/steer_ctrl/loop_with_return_value.mlir +++ b/test/neura/steer_ctrl/loop_with_return_value.mlir @@ -71,36 +71,38 @@ module { // CHECK-NEXT: neura.yield // CHECK-NEXT: } -// MAPPING: func.func @simple_add_loop() -> i64 attributes {accelerator = "neura", dataflow_mode = "steering", mapping_info = {compiled_ii = 4 : i32, mapping_mode = "spatial-only", mapping_strategy = "heuristic", rec_mii = 2 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { -// MAPPING-NEXT: %0 = neura.reserve : i64 -// MAPPING-NEXT: %1 = neura.reserve : i64 -// MAPPING-NEXT: %2 = neura.reserve : i1 -// MAPPING-NEXT: %3 = "neura.constant"() <{value = 16 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> i64 -// MAPPING-NEXT: %4 = "neura.constant"() <{value = 1 : i64}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : () -> i64 -// MAPPING-NEXT: %5 = "neura.constant"() <{value = 1 : i64}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 1 : i32}]} : () -> i64 -// MAPPING-NEXT: %6 = "neura.constant"() <{value = 0 : i64}> {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 3 : i32}]} : () -> i64 -// MAPPING-NEXT: %7 = "neura.data_mov"(%4) {mapping_locs = [{id = 35 : i32, resource = "link", time_step = 1 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %8 = neura.invariant %7, %2 {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 2 : i32}]} : i64, i1 -> i64 -// MAPPING-NEXT: %9 = "neura.data_mov"(%3) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %10 = neura.invariant %9, %2 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : i64, i1 -> i64 -// MAPPING-NEXT: %11 = "neura.data_mov"(%5) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 1 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %12 = neura.carry %11, %2, %0 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 1 : i32}]} : i64, i1, i64 -> i64 -// MAPPING-NEXT: %13 = "neura.data_mov"(%6) {mapping_locs = [{id = 42 : i32, resource = "link", time_step = 0 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %14 = neura.carry %13, %2, %1 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 2 : i32}]} : i64, i1, i64 -> i64 -// MAPPING-NEXT: %15 = "neura.data_mov"(%14) {mapping_locs = [{id = 27 : i32, resource = "link", time_step = 1 : i32}, {id = 25 : i32, resource = "link", time_step = 2 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %16 = "neura.data_mov"(%10) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 1 : i32}, {id = 1 : i32, resource = "link", time_step = 2 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %17 = "neura.icmp"(%15, %16) <{cmpType = "slt"}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 1 : i32}]} : (i64, i64) -> i1 -// MAPPING-NEXT: neura.ctrl_mov %17 -> %2 {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 3 : i32}, {id = 16 : i32, resource = "link", time_step = 4 : i32}, {id = 28 : i32, resource = "link", time_step = 5 : i32}]} : i1 i1 -// MAPPING-NEXT: %18 = "neura.data_mov"(%17) {mapping_locs = [{id = 12 : i32, resource = "link", time_step = 3 : i32}]} : (i1) -> i1 -// MAPPING-NEXT: %19 = "neura.not"(%18) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 2 : i32}]} : (i1) -> i1 -// MAPPING-NEXT: %20 = "neura.data_mov"(%12) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 2 : i32}, {id = 64 : i32, resource = "register", time_step = 3 : i32}, {id = 64 : i32, resource = "register", time_step = 4 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %21 = "neura.data_mov"(%12) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 2 : i32}, {id = 15 : i32, resource = "link", time_step = 3 : i32}, {id = 3 : i32, resource = "link", time_step = 4 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %22 = "neura.add"(%20, %21) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 0 : i32}]} : (i64, i64) -> i64 -// MAPPING-NEXT: neura.ctrl_mov %22 -> %0 {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 5 : i32}]} : i64 i64 -// MAPPING-NEXT: %23 = "neura.data_mov"(%14) {mapping_locs = [{id = 30 : i32, resource = "link", time_step = 1 : i32}, {id = 41 : i32, resource = "link", time_step = 2 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %24 = "neura.data_mov"(%8) {mapping_locs = [{id = 34 : i32, resource = "link", time_step = 2 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: %25 = "neura.add"(%23, %24) {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 3 : i32}]} : (i64, i64) -> i64 -// MAPPING-NEXT: neura.ctrl_mov %25 -> %1 {mapping_locs = [{id = 45 : i32, resource = "link", time_step = 3 : i32}, {id = 31 : i32, resource = "link", time_step = 4 : i32}]} : i64 i64 -// MAPPING-NEXT: %26 = "neura.data_mov"(%12) {mapping_locs = [{id = 18 : i32, resource = "link", time_step = 2 : i32}]} : (i64) -> i64 -// MAPPING-NEXT: "neura.return"(%26) {mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 1 : i32}]} : (i64) -> () -// MAPPING-NEXT: } \ No newline at end of file +// MAPPING: func.func @simple_add_loop() -> i64 attributes {accelerator = "neura", dataflow_mode = "steering"} { +// MAPPING-NEXT: %0 = neura.reserve : i64 +// MAPPING-NEXT: %1 = neura.reserve : i64 +// MAPPING-NEXT: %2 = neura.reserve : i1 +// MAPPING-NEXT: %3 = "neura.constant"() <{value = 16 : i64}> : () -> i64 +// MAPPING-NEXT: %4 = "neura.constant"() <{value = 1 : i64}> : () -> i64 +// MAPPING-NEXT: %5 = "neura.constant"() <{value = 1 : i64}> : () -> i64 +// MAPPING-NEXT: %6 = "neura.constant"() <{value = 0 : i64}> : () -> i64 +// MAPPING-NEXT: %7 = "neura.data_mov"(%4) : (i64) -> i64 +// MAPPING-NEXT: %8 = neura.invariant %7, %2 : i64, i1 -> i64 +// MAPPING-NEXT: %9 = "neura.data_mov"(%3) : (i64) -> i64 +// MAPPING-NEXT: %10 = neura.invariant %9, %2 : i64, i1 -> i64 +// MAPPING-NEXT: %11 = "neura.data_mov"(%5) : (i64) -> i64 +// MAPPING-NEXT: %12 = neura.carry %11, %2, %0 : i64, i1, i64 -> i64 +// MAPPING-NEXT: %13 = "neura.data_mov"(%6) : (i64) -> i64 +// MAPPING-NEXT: %14 = neura.carry %13, %2, %1 : i64, i1, i64 -> i64 +// MAPPING-NEXT: %15 = "neura.data_mov"(%14) : (i64) -> i64 +// MAPPING-NEXT: %16 = "neura.data_mov"(%10) : (i64) -> i64 +// MAPPING-NEXT: %17 = "neura.icmp"(%15, %16) <{cmpType = "slt"}> : (i64, i64) -> i1 +// MAPPING-NEXT: neura.ctrl_mov %17 -> %2 : i1 i1 +// MAPPING-NEXT: %18 = "neura.data_mov"(%12) : (i64) -> i64 +// MAPPING-NEXT: %19 = "neura.data_mov"(%17) : (i1) -> i1 +// MAPPING-NEXT: %20 = neura.false_steer %18, %19 : i64, i1 -> i64 +// MAPPING-NEXT: %21 = "neura.data_mov"(%12) : (i64) -> i64 +// MAPPING-NEXT: %22 = "neura.data_mov"(%12) : (i64) -> i64 +// MAPPING-NEXT: %23 = "neura.add"(%21, %22) : (i64, i64) -> i64 +// MAPPING-NEXT: neura.ctrl_mov %23 -> %0 : i64 i64 +// MAPPING-NEXT: %24 = "neura.data_mov"(%14) : (i64) -> i64 +// MAPPING-NEXT: %25 = "neura.data_mov"(%8) : (i64) -> i64 +// MAPPING-NEXT: %26 = "neura.add"(%24, %25) : (i64, i64) -> i64 +// MAPPING-NEXT: neura.ctrl_mov %26 -> %1 : i64 i64 +// MAPPING-NEXT: %27 = "neura.data_mov"(%20) : (i64) -> i64 +// MAPPING-NEXT: "neura.return"(%27) : (i64) -> () +// MAPPING-NEXT: } +// MAPPING-NEXT: }