diff --git a/include/NeuraDialect/NeuraOps.td b/include/NeuraDialect/NeuraOps.td index 0a067938..227d4382 100644 --- a/include/NeuraDialect/NeuraOps.td +++ b/include/NeuraDialect/NeuraOps.td @@ -341,14 +341,17 @@ def Neura_GrantPredicateOp : Op { def Neura_GrantOnceOp : Op { let summary = "Marks a value as valid once."; let description = [{ - Grants a value a one-time predicate: the resulting value is considered valid + Either grants a value a one-time predicate, or creates a constant value with a one-time predicate. The resulting value is considered valid only during its first activation. Used to initialize recurrence cycles. Example: %v = neura.grant_once %init : !neura.data -> !neura.data + %c = neura.grant_once <{value = 42 : i64}> : !neura.data }]; - let arguments = (ins AnyType:$value); + let arguments = (ins + Optional:$value, + OptionalAttr:$constant_value); let results = (outs AnyType:$result); // let assemblyFormat = "$value attr-dict `:` type($value) `->` type($result)"; @@ -364,7 +367,9 @@ def Neura_GrantAlwaysOp : Op { %v = neura.grant_always %init : !neura.data -> !neura.data }]; - let arguments = (ins AnyType:$value); + let arguments = (ins + Optional:$value, + OptionalAttr:$constant_value); let results = (outs AnyType:$result); // let assemblyFormat = "$value attr-dict `:` type($value) `->` type($result)"; @@ -373,31 +378,43 @@ def Neura_GrantAlwaysOp : Op { // ---------------------------------------------------- // Defines fused control flow operations. -def Neura_LoopControllerOp : Op{ +def Neura_LoopControlOp : Op{ let summary = "Generates loop indicies and valid predicates."; let description = [{ - Manages a single level of loop execution based on cycle counting. - Each loop_controller outputs a current index value and a valid predicate. + Controls loop execution with minimal recurrence cycle length (1). + Takes the current index and produces the next index and validity predicate. - The loop_controller uses dynamic loop bounds (start, end, step), - allowing for variable-length loops and runtime-determined bounds. + This operation combines comparison and increment logic into a single operation, + enabling efficient loop execution on dataflow architectures with modulo scheduling. - The execution is conditioned on the parent_valid input, creating an - efficient hierarchical structure for nested loops. + The first iteration automatically uses the start value because the reserve operation's + predicate bit is initially 0, while the start value's predicate bit is 1. + + Example: + // Loop control that calculates next index and validity in one step + %next_idx, %loop_valid = neura.loop_control( + parent_valid = %parent_valid, + start = %start_val, + end = %end_val, + step = %step_val + ) <{iteration_type = "increment"}> : !neura.data, + !neura.data, !neura.data, !neura.data + -> !neura.data, !neura.data }]; let arguments = (ins - AnyType:$parent_valid, // Valid predicate from the parent loop - AnyType:$start, // Start index of the loop - AnyType:$end, // End index of the loop - AnyType:$step // Step size for the loop + AnyType:$parentValid, // Valid predicate from the parent loop. + StrAttr:$iterationType, // Type of the loop iteration (e.g., "increment", "decrement"). + AnyType:$start, // Start index of the loop (optional if startValue attr is presented). + AnyType:$end, // End index of the loop (optional if endValue attr is presented). + AnyType:$step // Step size for the loop (optional if stepValue attr is presented). ); let results = (outs - AnyType:$index, // Current loop index + AnyType:$nextindex, // Current loop index AnyType:$valid // Valid predicate for the current index ); let assemblyFormat = - "$parent_valid `(` $start `,` $end `,` $step `)` attr-dict `:` type($parent_valid) `,` type($start) `,` type($end) `,` type($step) `->` type($index) `,` type($valid)"; + " `(``parent_valid` `=` $parentValid `,` `start` `=` $start `,` `end` `=` $end `,` `step` `=` $step`)` attr-dict `:` type($parentValid) `,` type($start) `,` type($end) `,` type($step) `->` type($nextindex) `,` type($valid)"; } \ No newline at end of file diff --git a/lib/NeuraDialect/Mapping/mapping_util.cpp b/lib/NeuraDialect/Mapping/mapping_util.cpp index f7e5030f..1640e5ec 100644 --- a/lib/NeuraDialect/Mapping/mapping_util.cpp +++ b/lib/NeuraDialect/Mapping/mapping_util.cpp @@ -16,10 +16,14 @@ using namespace mlir::neura; namespace { inline OperationKind getOperationKindFromMlirOp(Operation *op) { - if (isa(op)) return IAdd; - if (isa(op)) return IMul; - if (isa(op)) return FAdd; - if (isa(op)) return FMul; + if (isa(op)) + return IAdd; + if (isa(op)) + return IMul; + if (isa(op)) + return FAdd; + if (isa(op)) + return FMul; // TODO: Complete the list here. // @Jackcuii, https://github.com/coredac/dataflow/issues/82. return IAdd; @@ -127,9 +131,8 @@ int mlir::neura::calculateResMii(Operation *func_op, // Count all "compute" operations (non-terminators, non-block ops). func_op->walk([&](Operation *op) { // Skips non-materialized ops. - if (isa(op) || isa(op)) { + if (isa(op) || + isa(op)) { return; } ++num_ops; @@ -384,13 +387,15 @@ bool mlir::neura::tryRouteBackwardMove(Operation *mov_op, MappingLoc src_loc, return tryRouteDataMove(mov_op, src_loc, dst_loc, true, state, path_out); } -Register *mlir::neura::getAvailableRegister( - const MappingState &state, Tile *tile, int start_time, int exclusive_end_time) { +Register *mlir::neura::getAvailableRegister(const MappingState &state, + Tile *tile, int start_time, + int exclusive_end_time) { for (Register *reg : tile->getRegisters()) { // FIXME: We may need constrain the register availability to the conflicting - // input channel (either the input channel or a register file on the same input - // direction could be active at one time). - if (state.isAvailableAcrossTimeInRange(reg, start_time, exclusive_end_time)) { + // input channel (either the input channel or a register file on the same + // input direction could be active at one time). + if (state.isAvailableAcrossTimeInRange(reg, start_time, + exclusive_end_time)) { return reg; } } @@ -460,7 +465,8 @@ bool mlir::neura::tryRouteDataMove(Operation *mov_op, MappingLoc src_loc, // << " at tile: " << dst_tile->getId() // << " from time step: " << current_step // << " till deadline step: " << deadline_step << "\n"; - // Register is available, so we can occupy the specific register across remaining time steps. + // Register is available, so we can occupy the specific register across + // remaining time steps. std::vector register_occupyings; for (int t = current_step; t < deadline_step; ++t) { MappingLoc register_loc{available_register, t}; @@ -597,10 +603,10 @@ bool mlir::neura::canReachLocInTime(const MappingLoc &src_loc, // // Explores all next step tiles from the current location. // for (const MappingLoc &next_loc_tile : // mapping_state.getNextStepTiles(current_loc)) { - + // Explores all next step tiles from the current location. for (const MappingLoc ¤t_loc_out_link : - mapping_state.getCurrentStepLinks(current_loc)) { + mapping_state.getCurrentStepLinks(current_loc)) { // Makes sure the link is not occupied. if (!mapping_state.isAvailableAcrossTime(current_loc_out_link)) { @@ -614,7 +620,8 @@ bool mlir::neura::canReachLocInTime(const MappingLoc &src_loc, } // Records the tile for further exploration. - Tile *next_tile = llvm::dyn_cast(current_loc_out_link.resource)->getDstTile(); + Tile *next_tile = + llvm::dyn_cast(current_loc_out_link.resource)->getDstTile(); assert(next_tile && "Next location must be a Tile"); if (visited.contains(next_tile)) { continue; @@ -687,6 +694,7 @@ std::vector mlir::neura::calculateAward(Operation *op, llvm::errs() << "[calculateAward] Operation: " << *op << "; Producers: " << producers.size() << "\n"; + for (Tile *tile : architecture.getAllTiles()) { if (!tile->canSupportOperation(getOperationKindFromMlirOp(op))) { llvm::errs() << "[calculateAward] Tile: " << tile->getType() @@ -815,8 +823,8 @@ bool mlir::neura::placeAndRoute(Operation *op, const MappingLoc &target_loc, if (mapping_state.bindOp(target_loc, op)) { std::vector routed_operands; std::vector routed_ctrl_movs; - llvm::errs() << "[DEBUG] Schedule op " << *op << " onto loc: " - << target_loc.resource->getType() << "#" + llvm::errs() << "[DEBUG] Schedule op " << *op + << " onto loc: " << target_loc.resource->getType() << "#" << target_loc.resource->getId() << " @t=" << target_loc.time_step << "\n"; // Tries to route the data move operations. @@ -886,10 +894,12 @@ bool mlir::neura::placeAndRoute(Operation *op, const MappingLoc &target_loc, } llvm::errs() << "[DEBUG] Failed to route ctrl_mov: " << *ctrl_mov << " from " << target_loc.resource->getType() << "#" - << target_loc.resource->getId() << " @t=" << target_loc.time_step - << " to " << backward_loc.resource->getType() << "#" + << target_loc.resource->getId() + << " @t=" << target_loc.time_step << " to " + << backward_loc.resource->getType() << "#" << backward_loc.resource->getId() - << " @t=" << backward_loc.time_step << "; so unschedule op\n"; + << " @t=" << backward_loc.time_step + << "; so unschedule op\n"; mapping_state.unbindOp(op); for (Operation *routed_ctrl_mov : routed_ctrl_movs) { llvm::errs() << "[DEBUG] Releasing route for routed ctrl_mov: " diff --git a/lib/NeuraDialect/Transforms/FuseControlFlowPass.cpp b/lib/NeuraDialect/Transforms/FuseControlFlowPass.cpp index e3b45f94..7b6bc996 100644 --- a/lib/NeuraDialect/Transforms/FuseControlFlowPass.cpp +++ b/lib/NeuraDialect/Transforms/FuseControlFlowPass.cpp @@ -1,10 +1,20 @@ #include "NeuraDialect/NeuraOps.h" +#include "NeuraDialect/NeuraTypes.h" #include "mlir/Dialect/Func/IR/FuncOps.h" +#include "mlir/IR/Attributes.h" #include "mlir/IR/Operation.h" #include "mlir/IR/PatternMatch.h" #include "mlir/Pass/Pass.h" +#include "mlir/Support/LLVM.h" #include "mlir/Transforms/GreedyPatternRewriteDriver.h" #include "llvm/ADT/MapVector.h" +#include "llvm/ADT/SetVector.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/Support/LogicalResult.h" +#include "llvm/Support/raw_ostream.h" +#include +#include +#include using namespace mlir; @@ -16,43 +26,522 @@ namespace { class LoopInfo { public: // Key operations in a loop. - Value reserve_val; - Value phi_val; - Value index_val; + Value index_reserve_val; // Reserve values for index. + Value index_phi_val; Value condition_val; Value not_condition_val; // Loop iteration parameters. - Value start_val; - Value end_val; - Value step_val; + Value start_val; // Start value for the loop index. + Value end_val; // End value for the loop index. + Value step_val; // Step value for the loop index. // Backward edge information. - Operation *ctrl_mov = nullptr; // Initialized to nullptr. + Operation *index_ctrl_mov = nullptr; // Initialized to nullptr. + Operation *index_grant_op = + nullptr; // The grant_predicate operation for the index. // Used for replace and update operations. llvm::SetVector ops_to_remove; llvm::MapVector>> users_to_update; + // Parent loop when handling nested loops, if any. + LoopInfo *parent_loop = nullptr; + // Adds operations to remove. void addOpToRemove(Operation *op) { if (op) { - ops_to_remove.insert(op); + this->ops_to_remove.insert(op); } } // Checks if the loop info is complete. // There is no not_condition_val because it is derived from condition_val. bool isComplete() const { - return reserve_val && phi_val && index_val && condition_val && start_val && - end_val && step_val && ctrl_mov; + return index_reserve_val && index_phi_val && condition_val && start_val && + end_val && step_val && index_ctrl_mov; } // Records the users that use the loop index and (not-)condition values. void recordUsersToUpdate() { - // TODO: Implements the logic to record users of loop index and condition - // values. + recordUsersFor(this->index_phi_val); + recordUsersFor(this->index_reserve_val); + recordUsersFor(this->index_grant_op->getResult(0)); + recordUsersFor(this->condition_val); + if (this->not_condition_val) { + recordUsersFor(this->not_condition_val); + } + } + +private: + // Records users of a value. + void recordUsersFor(Value val) { + if (!val) { + return; + } + for (OpOperand &use : val.getUses()) { + Operation *user = use.getOwner(); + // Records the user that will not be removed. + if (!ops_to_remove.contains(user)) { + users_to_update[val].push_back({user, use.getOperandNumber()}); + } + } + } +}; + +// Finds the original parameter for start value. +Value findOriginalConstant(Value val, + llvm::SetVector &ops_to_remove) { + if (!val || !val.getDefiningOp()) + return val; + + Operation *def_op = val.getDefiningOp(); + + // If the value is already a constant, return it. + if (auto const_op = dyn_cast(def_op)) { + return val; + } + + // Handle grant operations and add them to the removal list. + if (auto grant_once_op = dyn_cast(def_op)) { + ops_to_remove.insert(def_op); + return findOriginalConstant(grant_once_op.getValue(), ops_to_remove); + } + + // For grant_predicate, only track value inputs and ignore condition inputs. + if (auto grant_predicate_op = dyn_cast(def_op)) { + ops_to_remove.insert(def_op); + return findOriginalConstant(grant_predicate_op.getValue(), ops_to_remove); + } + + return val; +} + +// Identifies a simple loop. +// The pattern is: reserve -> phi -> icmp -> [not] -> grant_predicate -> +// ctrl_mov <- add +std::unique_ptr identifyLoop(Operation *index_reserve_op) { + if (!isa(index_reserve_op)) { + return nullptr; + } + + // Starts from the reserve operation for loop index. + auto loop = std::make_unique(); + loop->index_reserve_val = index_reserve_op->getResult(0); + loop->addOpToRemove(index_reserve_op); + + // Identifies the phi operation. + neura::PhiOp index_phi_op = nullptr; + for (Operation *user : loop->index_reserve_val.getUsers()) { + if (auto phi = dyn_cast(user)) { + index_phi_op = phi; + break; + } + } + + if (!index_phi_op) { + llvm::errs() + << "[CtrlFlowFuse] No index phi operation found for the loop.\n"; + return nullptr; // No phi operation found. + } + + loop->index_phi_val = index_phi_op.getResult(); + loop->addOpToRemove(index_phi_op); + + // Finds the start value for loop index. + Value initial_value = nullptr; + for (Value input : index_phi_op.getInputs()) { + if (input != loop->index_reserve_val) { + initial_value = input; + break; + } + } + + if (!initial_value) { + llvm::errs() + << "[CtrlFlowFuse] No initial value found for the loop index.\n"; + return nullptr; // No start value found. + } + + assert(initial_value && initial_value.getDefiningOp() && + isa(initial_value.getDefiningOp()) && + "The initial_value should be defined by a GrantOnceOp."); + loop->start_val = initial_value; + + // Identifies the phi->icmp->[not]->grant_predicate pattern. + for (Operation *phi_user : index_phi_op->getUsers()) { + if (neura::ICmpOp icmp_op = dyn_cast(phi_user)) { + if (icmp_op.getCmpType() == "slt" && + icmp_op.getLhs() == loop->index_phi_val) { + loop->condition_val = icmp_op.getResult(); + loop->end_val = icmp_op.getRhs(); + loop->addOpToRemove(icmp_op); + + // Identifies the not operation if it exists. + for (Operation *cond_user : icmp_op->getUsers()) { + if (neura::NotOp not_op = dyn_cast(cond_user)) { + loop->not_condition_val = not_op.getResult(); + loop->addOpToRemove(not_op); + break; + } + } + + // Identifies the grant_predicate operation for the index_phi_val. + for (Operation *cond_user : icmp_op->getUsers()) { + if (neura::GrantPredicateOp grant_predicate_op = + dyn_cast(cond_user)) { + if (grant_predicate_op.getValue() == loop->index_phi_val && + grant_predicate_op.getPredicate() == loop->condition_val) { + loop->index_grant_op = grant_predicate_op; + loop->addOpToRemove(grant_predicate_op); + break; + } + } + } + + // Identifies the recurrence cycle of the end value. + Operation *end_val_def_op = loop->end_val.getDefiningOp(); + if (auto end_phi_op = dyn_cast_or_null(end_val_def_op)) { + // Identifies the end value's reserve operation. + Value end_reserve_val = nullptr; + for (Value input : end_phi_op.getInputs()) { + if (auto reserve_op = input.getDefiningOp()) { + end_reserve_val = input; + loop->addOpToRemove(reserve_op); + break; + } + } + + if (end_reserve_val) { + // Identifies the end ctrl_mov operation. + for (Operation *user : end_reserve_val.getUsers()) { + if (auto ctrl_mov_op = dyn_cast(user)) { + if (ctrl_mov_op.getTarget() == end_reserve_val) { + loop->addOpToRemove(ctrl_mov_op); + loop->addOpToRemove(end_phi_op); + if (isa( + ctrl_mov_op.getValue().getDefiningOp())) { + loop->addOpToRemove(ctrl_mov_op.getValue().getDefiningOp()); + } + // Finds the actual end value from the inputs of the + // end_phi_op. + for (Value input : end_phi_op.getInputs()) { + if (input != end_reserve_val) { + loop->end_val = + findOriginalConstant(input, loop->ops_to_remove); + break; + } + } + break; + } + } + } + } + } + break; + } else { + // TODO: Adds support for other compare types if needed. + if (icmp_op.getCmpType() != "slt") { + llvm::errs() << "[CtrlFlowFuse] Unsupported compare type: " + << icmp_op.getCmpType() << "\n"; + } else { + llvm::errs() << "[CtrlFlowFuse] Loop condition does not match " + "expected value.\n"; + } + return nullptr; // Unsupported compare type. + } + } + } + + if (!loop->condition_val || !loop->end_val || !loop->index_phi_val) { + llvm::errs() << "[CtrlFlowFuse] Incomplete loop information.\n"; + return nullptr; // Incomplete loop. + } + + // Identifies the ctrl_mov<-add pattern. + for (Operation *user : loop->index_reserve_val.getUsers()) { + if (neura::CtrlMovOp ctrl_mov_op = dyn_cast(user)) { + if (ctrl_mov_op.getTarget() == loop->index_reserve_val) { + loop->index_ctrl_mov = ctrl_mov_op; + loop->addOpToRemove(ctrl_mov_op); + + if (neura::AddOp add_op = + ctrl_mov_op.getValue().getDefiningOp()) { + loop->addOpToRemove(add_op); + Value granted_index = loop->index_grant_op->getResult(0); + if (add_op.getLhs() == granted_index) { + loop->step_val = + findOriginalConstant(add_op.getRhs(), loop->ops_to_remove); + } else if (add_op.getRhs() == granted_index) { + loop->step_val = + findOriginalConstant(add_op.getLhs(), loop->ops_to_remove); + } + } + break; + } + } + } + + if (!loop->index_ctrl_mov || !loop->step_val) { + llvm::errs() << "[CtrlFlowFuse] Incomplete loop information: ctrl_mov or " + "step value not found.\n"; + return nullptr; // Incomplete loop. + } + + if (loop->isComplete()) { + loop->recordUsersToUpdate(); + return loop; + } + + return nullptr; // Incomplete loop. +} + +Value createConstantPredicate(PatternRewriter &rewriter, Location loc, + bool value) { + auto predicated_type = rewriter.getType( + rewriter.getI1Type(), rewriter.getI1Type()); + return rewriter.create(loc, predicated_type, + rewriter.getBoolAttr(value), + rewriter.getBoolAttr(true)); +} + +Operation *findDefiningOp(Value value) { + if (!value) { + return nullptr; + } + return value.getDefiningOp(); +} + +LogicalResult replaceWithLoopController(LoopInfo *loop_info, + PatternRewriter &rewriter) { + if (!loop_info || !loop_info->isComplete()) { + assert(false && "LoopInfo is incomplete or null."); + return failure(); + } + + Location loc = loop_info->index_reserve_val.getLoc(); + + Operation *start_def_op = findDefiningOp(loop_info->start_val); + Operation *end_def_op = findDefiningOp(loop_info->end_val); + Operation *step_def_op = findDefiningOp(loop_info->step_val); + + // Gets the insertion point for the new loop_controller operation. + Operation *insertion_point = nullptr; + + // Compares the defining operations to find the latest one. + auto updateLatestOp = [&](Operation *op1, Operation *op2) -> Operation * { + if (!op1) + return op2; + if (!op2) + return op1; + // Returns the later operation in the block. + return op2->isBeforeInBlock(op1) ? op1 : op2; + }; + + // Updates the insertion point based on the defining operations. + if (start_def_op) { + insertion_point = updateLatestOp(insertion_point, start_def_op); + } + if (end_def_op) { + insertion_point = updateLatestOp(insertion_point, end_def_op); + } + if (step_def_op) { + insertion_point = updateLatestOp(insertion_point, step_def_op); + } + + // Sets the insertion point after the latest defining operation. + if (insertion_point) { + rewriter.setInsertionPointAfter(insertion_point); + } else { + assert(false && "No valid insertion point found for loop_controller"); + return failure(); + } + + // Creates the parentValid signal for loop_controller. + auto true_const = createConstantPredicate(rewriter, loc, true); + rewriter.setInsertionPointAfter(true_const.getDefiningOp()); + auto true_val = rewriter + .create(loc, true_const.getType(), + true_const, nullptr) + ->getResult(0); + + // Prepares the values and iter type for loop_controller. + auto index_type = loop_info->index_phi_val.getType(); + rewriter.setInsertionPointAfter(true_val.getDefiningOp()); + + // For start value, we use the grant_once for correctness. + Value start_val = loop_info->start_val; + if (!isa(start_val.getDefiningOp())) { + rewriter.setInsertionPointAfter(start_val.getDefiningOp()); + start_val = rewriter.create(loc, index_type, start_val, + nullptr); + } + + // For end value and step value, we create grant_always for correctness. + Value end_val = loop_info->end_val; + rewriter.setInsertionPointAfter(end_val.getDefiningOp()); + end_val = + rewriter.create(loc, index_type, end_val, nullptr); + + Value step_val = loop_info->step_val; + rewriter.setInsertionPointAfter(end_val.getDefiningOp()); + step_val = + rewriter.create(loc, index_type, step_val, nullptr); + + rewriter.setInsertionPointAfter(true_val.getDefiningOp()); + + StringAttr iter_type; + if (neura::ICmpOp icmp_op = + dyn_cast(loop_info->condition_val.getDefiningOp())) { + if (icmp_op.getCmpType() == "slt") { + iter_type = rewriter.getStringAttr("increment"); + } else { + assert(false && "Unsupported compare type"); + return failure(); // Unsupported compare type. + } + } + + // Creates the loop_controller operation. + auto loop_controller = rewriter.create( + loc, index_type, true_val.getType(), true_val, iter_type, start_val, + end_val, step_val); + + Value new_index = loop_controller.getNextindex(); + Value new_valid = loop_controller.getValid(); + + // Creates the replacement map for the loop info. + DenseMap replacement_map; + + // Creates the map for loop_info values (index_phi_val, condition_val, etc.) + replacement_map[loop_info->index_phi_val] = new_index; + if (loop_info->index_grant_op) { + replacement_map[loop_info->index_grant_op->getResult(0)] = new_index; + } + replacement_map[loop_info->condition_val] = new_valid; + neura::NotOp new_not; + if (loop_info->not_condition_val) { + rewriter.setInsertionPointAfter(loop_controller); + new_not = rewriter.create( + loc, loop_info->not_condition_val.getType(), new_valid); + replacement_map[loop_info->not_condition_val] = new_not.getResult(); + } + + // Replaces the index_reserve_val with the new index. + if (!loop_info->users_to_update[loop_info->index_phi_val].empty()) { + for (auto &user_info : + loop_info->users_to_update[loop_info->index_phi_val]) { + Operation *user = user_info.first; + unsigned idx = user_info.second; + user->setOperand(idx, new_index); + } + } + + // Replaces the granted index value with the new index. + if (loop_info->index_grant_op && + !loop_info->users_to_update[loop_info->index_grant_op->getResult(0)] + .empty()) { + for (auto &user_info : + loop_info->users_to_update[loop_info->index_grant_op->getResult(0)]) { + Operation *user = user_info.first; + unsigned idx = user_info.second; + user->setOperand(idx, new_index); + } + } + + // Replaces the condition_val with the new_valid value. + if (!loop_info->users_to_update[loop_info->condition_val].empty()) { + for (auto &user_info : + loop_info->users_to_update[loop_info->condition_val]) { + Operation *user = user_info.first; + unsigned idx = user_info.second; + user->setOperand(idx, new_valid); + } + } + + // Handles not_condition_val if it exists + if (loop_info->not_condition_val && + !loop_info->users_to_update[loop_info->not_condition_val].empty()) { + // Replaces all uses of not_condition_val with the result of new_not + for (auto &user_info : + loop_info->users_to_update[loop_info->not_condition_val]) { + Operation *user = user_info.first; + unsigned idx = user_info.second; + user->setOperand(idx, new_not.getResult()); + } + } + + // Replaces the internal uses of the old loop info values. + for (Operation *op : loop_info->ops_to_remove) { + for (OpOperand &operand : op->getOpOperands()) { + Value old_val = operand.get(); + if (replacement_map.count(old_val)) { + operand.set(replacement_map[old_val]); + } + } + } + + // Tracks erased operations. + llvm::SmallPtrSet erased_ops; + bool made_progress = true; + while (made_progress) { + made_progress = false; + for (Operation *op : loop_info->ops_to_remove) { + if (!erased_ops.contains(op) && op->use_empty()) { + rewriter.eraseOp(op); + erased_ops.insert(op); + made_progress = true; + } + } + } + + // Checks if all operations were removed. + for (Operation *op : loop_info->ops_to_remove) { + if (!erased_ops.contains(op)) { + llvm::errs() << "Warning: Could not remove operation: " << *op << "\n"; + llvm::errs() << " Users: "; + for (Value result : op->getResults()) { + for (Operation *user : result.getUsers()) { + llvm::errs() << *user << " "; + } + } + llvm::errs() << "\n"; + } + } + + return success(); +} + +struct FuseLoopControlFlowPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(func::FuncOp func_op, + PatternRewriter &rewriter) const override { + auto accel_attr = func_op->getAttrOfType("accelerator"); + if (!accel_attr || accel_attr.getValue() != "neura") { + return failure(); + } + // Saves all the identified loops. + std::vector> identified_loops; + + // Step 1: Identify loops in the function. + func_op.walk([&](neura::ReserveOp reserveOp) { + if (auto loop = identifyLoop(reserveOp)) { + identified_loops.push_back(std::move(loop)); + } + }); + + if (identified_loops.empty()) { + return failure(); + } + + for (auto &loop_info : identified_loops) { + if (failed(replaceWithLoopController(loop_info.get(), rewriter))) { + return failure(); + } + } + + return success(); } }; @@ -68,7 +557,13 @@ struct FuseControlFlowPass void runOnOperation() override { ModuleOp module_op = getOperation(); - // TODO: Adds the logic to fuse determined control flow operations. + RewritePatternSet patterns(&getContext()); + + patterns.add(&getContext()); + + if (failed(applyPatternsGreedily(module_op, std::move(patterns)))) { + signalPassFailure(); + } } }; } // namespace diff --git a/lib/NeuraDialect/Transforms/FusePatternsPass.cpp b/lib/NeuraDialect/Transforms/FusePatternsPass.cpp index ef7c4327..cfeea02c 100644 --- a/lib/NeuraDialect/Transforms/FusePatternsPass.cpp +++ b/lib/NeuraDialect/Transforms/FusePatternsPass.cpp @@ -10,7 +10,6 @@ using namespace mlir; #include "NeuraDialect/NeuraPasses.h.inc" namespace { - struct FuseFAddFAddPattern : public OpRewritePattern { using OpRewritePattern::OpRewritePattern; diff --git a/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp b/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp index 4f7cc627..ee2c4a5e 100644 --- a/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp +++ b/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp @@ -132,10 +132,12 @@ struct MapToAcceleratorPass op->print(llvm::outs()), llvm::outs() << "\n"; } rec_mii = longest->length; - IntegerAttr rec_mii_attr = - IntegerAttr::get(IntegerType::get(func.getContext(), 32), rec_mii); - func->setAttr("RecMII", rec_mii_attr); + } else if (!longest) { + rec_mii = 1; // No recurrence cycles found, set MII to 1. } + IntegerAttr rec_mii_attr = + IntegerAttr::get(IntegerType::get(func.getContext(), 32), rec_mii); + func->setAttr("RecMII", rec_mii_attr); // AcceleratorConfig config{/*numTiles=*/8}; // Example Architecture architecture(4, 4); @@ -149,8 +151,9 @@ struct MapToAcceleratorPass std::vector topologically_sorted_ops = getTopologicallySortedOps(func); if (topologically_sorted_ops.empty()) { - llvm::errs() << "[MapToAcceleratorPass] No operations to map in function " - << func.getName() << "\n"; + llvm::errs() + << "[MapToAcceleratorPass] No operations to map in function " + << func.getName() << "\n"; assert(false && "Mapping aborted due to empty op list."); } for (Operation *op : topologically_sorted_ops) { @@ -170,15 +173,18 @@ struct MapToAcceleratorPass std::vector> sorted_ops_with_alap_levels = flatten_level_buckets(level_buckets); for (const auto &[op, level] : sorted_ops_with_alap_levels) { - llvm::outs() << "[MapToAcceleratorPass] ALAP sorted op: " << *op << " (ALAP level: " << level << ")\n"; + llvm::outs() << "[MapToAcceleratorPass] ALAP sorted op: " << *op + << " (ALAP level: " << level << ")\n"; } // assert(false); for (int ii = possibleMinII; ii <= maxII; ++ii) { - llvm::errs() << "[MapToAcceleratorPass] Start mapping with target II of " - << ii << "\n"; + llvm::errs() + << "[MapToAcceleratorPass] Start mapping with target II of " << ii + << "\n"; // Creates a mapping state for the current II. MappingState mapping_state(architecture, ii); - if (mapping_strategy->map(sorted_ops_with_alap_levels, critical_ops, architecture, mapping_state)) { + if (mapping_strategy->map(sorted_ops_with_alap_levels, critical_ops, + architecture, mapping_state)) { // success llvm::errs() << "[MapToAcceleratorPass] Successfully mapped function " << func.getName() << "' with II = " << ii << "\n"; diff --git a/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp b/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp index a78b0f36..3da40737 100644 --- a/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp +++ b/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp @@ -36,30 +36,34 @@ void GrantPredicateInEntryBlock(Block *entry_block, OpBuilder &builder) { // Step 1: Collects all live-out values first. for (Operation &op : *entry_block) { for (Value result : op.getResults()) { - if (!isa(result.getType())) + if (!isa(result.getType())) { continue; + } bool used_in_branch = false; - bool used_elsewhere = false; for (OpOperand &use : result.getUses()) { Operation *user = use.getOwner(); // Case 1: Operand of a branch/cond_br → grant_once + // Since we add the --cononicalize-live-in pass, all the live-out values + // in entry block must be passed to other blocks using branch/cond_br. if (isa(user)) { used_in_branch = true; } - // Case 2: Used directly in other blocks → grant_always - if (user->getBlock() != entry_block) { - used_elsewhere = true; + if (!isa(user) && + user->getBlock() != entry_block) { + assert( + false && + "Live-out value in entry block must be used in a branch/cond_br " + "operation."); } } - if (used_in_branch) + if (used_in_branch) { live_out_arg_values.push_back(result); - if (used_elsewhere) - live_out_non_arg_values.push_back(result); + } } } @@ -82,26 +86,6 @@ void GrantPredicateInEntryBlock(Block *entry_block, OpBuilder &builder) { } } } - - // Inserts grant_always. - for (Value val : live_out_non_arg_values) { - Operation *def_op = val.getDefiningOp(); - if (!def_op) - continue; - - builder.setInsertionPointAfter(def_op); - auto granted = builder.create(def_op->getLoc(), - val.getType(), val); - - // Replaces direct external uses (not in entry block, not in branch ops). - for (OpOperand &use : llvm::make_early_inc_range(val.getUses())) { - Operation *user = use.getOwner(); - if (user->getBlock() != entry_block && - !isa(user)) { - use.set(granted.getResult()); - } - } - } } // Control flow struct. @@ -160,7 +144,8 @@ void assertLiveOutValuesDominatedByBlockArgs(Region ®ion) { DenseSet dominated_values; if (block.getNumArguments() == 0 && !live_out_values.empty()) { - assert(false && "Block without arguments has live-out values"); + assert(false && "Block without arguments has live-out values, please " + "enable the --canonicalize-live-in pass."); } for (BlockArgument arg : block.getArguments()) { @@ -187,8 +172,10 @@ void assertLiveOutValuesDominatedByBlockArgs(Region ®ion) { } for (Value live_out : live_out_values) { if (!dominated_values.count(live_out)) { - assert(false && "Live-out value not dominated by block arguments or " - "live-in values"); + assert( + false && + "Live-out value not dominated by block arguments or " + "live-in values, please enable the --canonicalize-live-in pass."); } } } diff --git a/test/affine2neura/bert/bert_node1/bert_node1.mlir b/test/affine2neura/bert/bert_node1/bert_node1.mlir index c9ad5116..7de355ed 100644 --- a/test/affine2neura/bert/bert_node1/bert_node1.mlir +++ b/test/affine2neura/bert/bert_node1/bert_node1.mlir @@ -1,6 +1,23 @@ // RUN: mlir-opt %s --lower-affine --convert-scf-to-cf --convert-cf-to-llvm -o %t-llvm.mlir -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura | FileCheck %s -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --leverage-predicated-value --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: | FileCheck %s -check-prefix=CTRL2DATA module attributes {} { func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {} { affine.for %arg2 = 0 to 128 { @@ -46,39 +63,46 @@ module attributes {} { // CTRL2DATA: func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura"} { -// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.cast"(%4) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data // CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %9 = "neura.phi"(%8, %7) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.cast"(%9) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %11 = "neura.icmp"(%10, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.not"(%11) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = neura.grant_predicate %5, %11 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.cast"(%13) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %16 = "neura.phi"(%15, %14) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = "neura.cast"(%16) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.icmp"(%17, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %19 = "neura.not"(%18) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %20 = neura.grant_predicate %5, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %21 = neura.grant_predicate %17, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %22 = neura.load_indexed %arg0[%20, %20, %20, %20, %20, %21 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %23 = neura.grant_predicate %10, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %22 to %arg1[%20, %20, %23, %20, %20, %21 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %24 = neura.grant_predicate %1, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %25 = "neura.add"(%21, %24) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = "neura.cast"(%25) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %15 : !neura.data !neura.data -// CTRL2DATA-NEXT: %27 = neura.grant_predicate %10, %19 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %28 = neura.grant_predicate %1, %19 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %29 = "neura.add"(%27, %28) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %30 = "neura.cast"(%29) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %30 -> %8 : !neura.data !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %13 = "neura.phi"(%12, %9) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.icmp"(%13, %11) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %15 = "neura.not"(%14) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %9, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %17 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %18 = "neura.phi"(%17, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %19 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %20 = "neura.phi"(%19, %16) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.icmp"(%20, %18) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.grant_predicate %1, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %9, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %20, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %3, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %13, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %5, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %7, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.not"(%21) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %13, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %5, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %7, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.load_indexed %22[%23, %23, %23, %23, %23, %24 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %33 to %25[%23, %23, %26, %23, %23, %24 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %34 = "neura.add"(%24, %27) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %34 -> %19 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %28 -> %17 : !neura.data !neura.data +// CTRL2DATA-NEXT: %35 = "neura.add"(%30, %31) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %35 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %32 -> %10 : !neura.data !neura.data // CTRL2DATA-NEXT: "neura.return"() : () -> () // CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/affine2neura/bert/bert_node28/bert_node28.mlir b/test/affine2neura/bert/bert_node28/bert_node28.mlir index 90bb38f6..312bf9e2 100644 --- a/test/affine2neura/bert/bert_node28/bert_node28.mlir +++ b/test/affine2neura/bert/bert_node28/bert_node28.mlir @@ -1,6 +1,23 @@ // RUN: mlir-opt %s --lower-affine --convert-scf-to-cf --convert-cf-to-llvm -o %t-llvm.mlir -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura | FileCheck %s -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --leverage-predicated-value --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: | FileCheck %s -check-prefix=CTRL2DATA module attributes {} { func.func @_Z11bert_node28PA128_A768_KfPA768_S0_PA128_A768_f(%arg0: memref, %arg1: memref, %arg2: memref) attributes {} { affine.for %arg3 = 0 to 128 { @@ -65,59 +82,70 @@ module attributes {} { // CHECK-NEXT: "neura.return"() : () -> () -// CTRL2DATA: func.func @_Z11bert_node28PA128_A768_KfPA768_S0_PA128_A768_f(%arg0: memref, %arg1: memref, %arg2: memref) attributes {accelerator = "neura"} { -// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 768 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.cast"(%6) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %9) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.cast"(%11) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = "neura.icmp"(%12, %5) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.not"(%13) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = neura.grant_predicate %7, %13 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.cast"(%15) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %18 = "neura.phi"(%17, %16) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %19 = "neura.cast"(%18) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %20 = "neura.icmp"(%19, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %21 = "neura.not"(%20) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %22 = neura.grant_predicate %7, %20 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %23 = "neura.cast"(%22) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %24 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %25 = "neura.phi"(%24, %23) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = "neura.cast"(%25) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %27 = "neura.icmp"(%26, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %28 = "neura.not"(%27) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %29 = neura.grant_predicate %7, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %30 = neura.grant_predicate %12, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %31 = neura.grant_predicate %26, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %32 = neura.load_indexed %arg0[%29, %30, %31 : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %33 = neura.grant_predicate %19, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %34 = neura.load_indexed %arg1[%29, %31, %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %35 = neura.load_indexed %arg2[%29, %30, %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %36 = "neura.fmul"(%32, %34) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %37 = "neura.fadd"(%35, %36) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %37 to %arg2[%29, %30, %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %38 = neura.grant_predicate %3, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %39 = "neura.add"(%31, %38) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %40 = "neura.cast"(%39) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %40 -> %24 : !neura.data !neura.data -// CTRL2DATA-NEXT: %41 = neura.grant_predicate %19, %28 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %42 = neura.grant_predicate %3, %28 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %43 = "neura.add"(%41, %42) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %44 = "neura.cast"(%43) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %44 -> %17 : !neura.data !neura.data -// CTRL2DATA-NEXT: %45 = neura.grant_predicate %12, %21 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %46 = neura.grant_predicate %3, %21 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %47 = "neura.add"(%45, %46) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %48 = "neura.cast"(%47) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %48 -> %10 : !neura.data !neura.data -// CTRL2DATA-NEXT: "neura.return"() : () -> () -// CTRL2DATA-NEXT: } +// CTRL2DATA: func.func @_Z11bert_node28PA128_A768_KfPA768_S0_PA128_A768_f(%arg0: memref, %arg1: memref, %arg2: memref) attributes {accelerator = "neura"} { +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = "%arg2"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 768 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %15 = "neura.phi"(%14, %11) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %17 = "neura.phi"(%16, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = "neura.icmp"(%17, %15) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %19 = "neura.not"(%18) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %13, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %21 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %22 = "neura.phi"(%21, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %24 = "neura.phi"(%23, %20) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %25 = "neura.icmp"(%24, %22) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %13, %25 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %27 = "neura.not"(%25) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %17, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %9, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %11, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %32 = "neura.phi"(%31, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %34 = "neura.phi"(%33, %26) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %35 = "neura.icmp"(%34, %32) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %36 = neura.grant_predicate %1, %35 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %37 = neura.grant_predicate %13, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %38 = neura.grant_predicate %17, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.grant_predicate %34, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %40 = neura.grant_predicate %3, %35 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %41 = neura.grant_predicate %24, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %42 = neura.grant_predicate %5, %35 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %43 = neura.grant_predicate %9, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %44 = neura.grant_predicate %7, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %45 = "neura.not"(%35) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %46 = neura.grant_predicate %24, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %47 = neura.grant_predicate %9, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %48 = neura.grant_predicate %7, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %49 = neura.load_indexed %36[%37, %38, %39 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %50 = neura.load_indexed %40[%37, %39, %41 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %51 = neura.load_indexed %42[%37, %38, %41 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %52 = "neura.fmul"(%49, %50) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %53 = "neura.fadd"(%51, %52) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %53 to %42[%37, %38, %41 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %54 = "neura.add"(%39, %43) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %54 -> %33 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %44 -> %31 : !neura.data !neura.data +// CTRL2DATA-NEXT: %55 = "neura.add"(%46, %47) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %55 -> %23 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %48 -> %21 : !neura.data !neura.data +// CTRL2DATA-NEXT: %56 = "neura.add"(%28, %29) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %56 -> %16 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %30 -> %14 : !neura.data !neura.data +// CTRL2DATA-NEXT: "neura.return"() : () -> () +// CTRL2DATA-NEXT: } diff --git a/test/controflow_fuse/complex_nested/complex_nested.mlir b/test/controflow_fuse/complex_nested/complex_nested.mlir index 18e8c76f..5ff7a663 100644 --- a/test/controflow_fuse/complex_nested/complex_nested.mlir +++ b/test/controflow_fuse/complex_nested/complex_nested.mlir @@ -1,6 +1,23 @@ // RUN: mlir-opt %s --lower-affine --convert-scf-to-cf --convert-cf-to-llvm -o %t-llvm.mlir -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura | FileCheck %s -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --canonicalize-live-in --leverage-predicated-value --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: | FileCheck %s -check-prefix=CTRL2DATA module attributes {} { func.func @_Z14complex_nestedPA32_A32_iPS_(%arg0: memref, %arg1: memref) attributes {llvm.linkage = #llvm.linkage} { @@ -158,204 +175,173 @@ module attributes {} { // CHECK-NEXT: "neura.return"() : () -> () // CHECK-NEXT: } -// CTRL2DATA: func.func @_Z14complex_nestedPA32_A32_iPS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRL2DATA: func.func @_Z14complex_nestedPA32_A32_iPS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { // CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %2 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> -// CTRL2DATA-NEXT: %4 = "neura.grant_always"(%3) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%3) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %9 = "neura.constant"() <{predicate = true, value = 32 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.grant_always"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.constant"() <{predicate = true, value = 128 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %13 = "neura.grant_always"(%12) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = "neura.constant"() <{predicate = true, value = -128 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.grant_always"(%15) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = "neura.grant_once"(%15) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.constant"() <{predicate = true, value = 32 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %19 = "neura.grant_always"(%18) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %20 = "neura.grant_once"(%18) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %21 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %22 = "neura.grant_always"(%21) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %23 = "neura.grant_once"(%21) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %24 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %25 = "neura.grant_always"(%24) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = "neura.grant_once"(%24) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %27 = "neura.cast"(%24) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %28 = "neura.grant_once"(%27) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %29 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %30 = "neura.phi"(%29, %11) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %31 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %32 = "neura.phi"(%31, %28) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %33 = "neura.cast"(%32) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %34 = "neura.icmp"(%33, %30) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %35 = "neura.not"(%34) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %36 = neura.grant_predicate %26, %34 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %37 = "neura.cast"(%36) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %38 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %39 = "neura.phi"(%38, %11) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 32 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 128 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.constant"() <{predicate = true, value = -128 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = "neura.constant"() <{predicate = true, value = 32 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %15 = "neura.grant_once"(%14) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %17 = "neura.grant_once"(%16) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %19 = "neura.phi"(%18, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %21 = "neura.phi"(%20, %17) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = "neura.icmp"(%21, %19) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = "neura.not"(%22) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %17, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %26 = "neura.phi"(%25, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %27 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %28 = "neura.phi"(%27, %24) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.icmp"(%28, %26) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %15, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %3, %29 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %21, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.grant_predicate %28, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %34 = neura.grant_predicate %17, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %35 = "neura.not"(%29) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %36 = neura.grant_predicate %17, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %37 = neura.grant_predicate %15, %35 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %30 to %31[%32, %33 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %38 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %39 = "neura.phi"(%38, %7) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %40 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %41 = "neura.phi"(%40, %37) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %42 = "neura.cast"(%41) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %43 = "neura.icmp"(%42, %39) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %44 = neura.grant_predicate %23, %43 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %45 = neura.grant_predicate %5, %43 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %46 = neura.grant_predicate %33, %43 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %47 = neura.grant_predicate %42, %43 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %48 = neura.grant_predicate %26, %43 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %49 = "neura.not"(%43) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %50 = neura.grant_predicate %26, %49 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %51 = neura.grant_predicate %23, %49 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %44 to %45[%46, %47 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %52 = "neura.cast"(%48) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %53 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %54 = "neura.phi"(%53, %11) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %55 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %56 = "neura.phi"(%55, %52) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %57 = "neura.cast"(%56) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %58 = "neura.icmp"(%57, %54) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %59 = neura.grant_predicate %2, %58 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %60 = neura.grant_predicate %33, %58 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %61 = neura.grant_predicate %42, %58 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %62 = neura.grant_predicate %57, %58 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %63 = neura.grant_predicate %5, %58 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %64 = neura.grant_predicate %8, %58 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %65 = neura.grant_predicate %11, %58 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %66 = "neura.not"(%58) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %67 = neura.grant_predicate %42, %66 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %68 = neura.grant_predicate %8, %66 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %69 = neura.grant_predicate %11, %66 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %70 = neura.load_indexed %59[%60, %61, %62 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %71 = neura.load_indexed %63[%60, %61 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %72 = "neura.add"(%71, %70) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %72 to %63[%60, %61 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %73 = "neura.add"(%62, %64) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %74 = "neura.cast"(%73) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %74 -> %55 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %65 -> %53 : !neura.data !neura.data -// CTRL2DATA-NEXT: %75 = "neura.add"(%67, %68) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %76 = "neura.cast"(%75) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %76 -> %40 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %69 -> %38 : !neura.data !neura.data -// CTRL2DATA-NEXT: %77 = "neura.cast"(%50) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %78 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %79 = "neura.phi"(%78, %11) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %80 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %81 = "neura.phi"(%80, %51) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %41 = "neura.phi"(%40, %34) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %42 = "neura.icmp"(%41, %39) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %43 = neura.grant_predicate %1, %42 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %44 = neura.grant_predicate %21, %42 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %45 = neura.grant_predicate %28, %42 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %46 = neura.grant_predicate %41, %42 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %47 = neura.grant_predicate %3, %42 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %48 = neura.grant_predicate %5, %42 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %49 = neura.grant_predicate %7, %42 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %50 = "neura.not"(%42) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %51 = neura.grant_predicate %28, %50 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %52 = neura.grant_predicate %5, %50 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %53 = neura.grant_predicate %7, %50 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %54 = neura.load_indexed %43[%44, %45, %46 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %55 = neura.load_indexed %47[%44, %45 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %56 = "neura.add"(%55, %54) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %56 to %47[%44, %45 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %57 = "neura.add"(%46, %48) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %57 -> %40 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %49 -> %38 : !neura.data !neura.data +// CTRL2DATA-NEXT: %58 = "neura.add"(%51, %52) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %58 -> %27 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %53 -> %25 : !neura.data !neura.data +// CTRL2DATA-NEXT: %59 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %60 = "neura.phi"(%59, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %61 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %62 = "neura.phi"(%61, %37) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %63 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %64 = "neura.phi"(%63, %36) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %65 = "neura.icmp"(%64, %60) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %66 = neura.grant_predicate %3, %65 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %67 = neura.grant_predicate %21, %65 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %68 = neura.grant_predicate %64, %65 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %69 = neura.grant_predicate %62, %65 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %70 = neura.grant_predicate %5, %65 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %71 = neura.grant_predicate %7, %65 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %72 = "neura.not"(%65) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %73 = neura.grant_predicate %62, %72 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %74 = neura.grant_predicate %13, %72 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %75 = neura.grant_predicate %17, %72 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %76 = neura.load_indexed %66[%67, %68 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %77 = "neura.add"(%69, %76) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %78 = "neura.add"(%68, %70) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %78 -> %63 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %77 -> %61 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %71 -> %59 : !neura.data !neura.data +// CTRL2DATA-NEXT: %79 = "neura.div"(%73, %74) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %80 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %81 = "neura.phi"(%80, %7) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %82 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %83 = "neura.phi"(%82, %77) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %84 = "neura.cast"(%83) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %85 = "neura.icmp"(%84, %79) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %86 = neura.grant_predicate %5, %85 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %87 = neura.grant_predicate %33, %85 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %88 = neura.grant_predicate %84, %85 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %89 = neura.grant_predicate %81, %85 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %90 = neura.grant_predicate %8, %85 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %91 = neura.grant_predicate %11, %85 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %92 = "neura.not"(%85) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %93 = neura.grant_predicate %81, %92 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %94 = neura.grant_predicate %20, %92 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %95 = neura.grant_predicate %26, %92 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %96 = neura.load_indexed %86[%87, %88 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %97 = "neura.add"(%89, %96) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %98 = "neura.add"(%88, %90) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %99 = "neura.cast"(%98) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %99 -> %82 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %97 -> %80 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %91 -> %78 : !neura.data !neura.data -// CTRL2DATA-NEXT: %100 = "neura.div"(%93, %94) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %101 = "neura.cast"(%95) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %102 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %103 = "neura.phi"(%102, %11) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %104 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %105 = "neura.phi"(%104, %101) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %106 = "neura.cast"(%105) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %107 = "neura.icmp"(%106, %103) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %108 = neura.grant_predicate %26, %107 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %109 = neura.grant_predicate %17, %107 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %110 = "neura.not"(%107) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %111 = neura.grant_predicate %26, %110 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %112 = "neura.cast"(%108) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %113 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %114 = "neura.phi"(%113, %11) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %115 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %116 = "neura.phi"(%115, %109) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %117 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %118 = "neura.phi"(%117, %112) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %119 = "neura.cast"(%118) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %120 = "neura.icmp"(%119, %114) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %121 = neura.grant_predicate %2, %120 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %122 = neura.grant_predicate %119, %120 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %123 = neura.grant_predicate %106, %120 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %124 = neura.grant_predicate %33, %120 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %125 = neura.grant_predicate %116, %120 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %126 = neura.grant_predicate %8, %120 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %127 = neura.grant_predicate %11, %120 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %128 = "neura.not"(%120) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %129 = neura.grant_predicate %5, %128 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %130 = neura.grant_predicate %33, %128 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %131 = neura.grant_predicate %106, %128 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %132 = neura.grant_predicate %116, %128 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %133 = neura.grant_predicate %14, %128 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %134 = neura.grant_predicate %8, %128 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %135 = neura.grant_predicate %11, %128 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %136 = neura.load_indexed %121[%122, %123, %124 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %137 = "neura.icmp"(%136, %125) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %138 = "neura.sel"(%136, %125, %137) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %139 = "neura.add"(%122, %126) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %140 = "neura.cast"(%139) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %140 -> %117 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %138 -> %115 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %127 -> %113 : !neura.data !neura.data -// CTRL2DATA-NEXT: %141 = neura.load_indexed %129[%130, %131 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %142 = "neura.mul"(%141, %132) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %143 = "neura.div"(%142, %133) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %143 to %129[%130, %131 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %144 = "neura.add"(%131, %134) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %145 = "neura.cast"(%144) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %145 -> %104 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %135 -> %102 : !neura.data !neura.data -// CTRL2DATA-NEXT: %146 = "neura.cast"(%111) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %147 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %148 = "neura.phi"(%147, %11) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %149 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %150 = "neura.phi"(%149, %146) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %151 = "neura.cast"(%150) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %152 = "neura.icmp"(%151, %148) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %153 = neura.grant_predicate %5, %152 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %154 = neura.grant_predicate %33, %152 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %155 = neura.grant_predicate %151, %152 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %156 = neura.grant_predicate %100, %152 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %157 = "neura.not"(%152) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %158 = neura.grant_predicate %33, %157 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %159 = neura.grant_predicate %8, %157 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %160 = neura.grant_predicate %11, %157 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %161 = neura.load_indexed %153[%154, %155 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %162 = "neura.icmp"(%161, %156) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %163 = neura.grant_predicate %100, %162 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %164 = neura.grant_predicate %5, %162 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %165 = neura.grant_predicate %33, %162 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %166 = neura.grant_predicate %151, %162 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %167 = "neura.not"(%162) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %168 = neura.grant_predicate %151, %167 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %169 = neura.grant_predicate %8, %167 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %170 = neura.grant_predicate %11, %167 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %163 to %164[%165, %166 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %171 = "neura.phi"(%170, %11) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %172 = "neura.phi"(%169, %8) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %173 = "neura.phi"(%168, %151) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %174 = "neura.add"(%173, %172) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %175 = "neura.cast"(%174) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %175 -> %149 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %171 -> %147 : !neura.data !neura.data -// CTRL2DATA-NEXT: %176 = "neura.add"(%158, %159) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %177 = "neura.cast"(%176) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %177 -> %31 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %160 -> %29 : !neura.data !neura.data +// CTRL2DATA-NEXT: %83 = "neura.phi"(%82, %75) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %84 = "neura.icmp"(%83, %81) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %85 = neura.grant_predicate %17, %84 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %86 = neura.grant_predicate %11, %84 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %87 = "neura.not"(%84) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %88 = neura.grant_predicate %17, %87 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %89 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %90 = "neura.phi"(%89, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %91 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %92 = "neura.phi"(%91, %86) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %93 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %94 = "neura.phi"(%93, %85) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %95 = "neura.icmp"(%94, %90) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %96 = neura.grant_predicate %1, %95 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %97 = neura.grant_predicate %94, %95 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %98 = neura.grant_predicate %83, %95 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %99 = neura.grant_predicate %21, %95 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %100 = neura.grant_predicate %92, %95 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %101 = neura.grant_predicate %5, %95 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %102 = neura.grant_predicate %7, %95 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %103 = "neura.not"(%95) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %104 = neura.grant_predicate %3, %103 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %105 = neura.grant_predicate %21, %103 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %106 = neura.grant_predicate %83, %103 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %107 = neura.grant_predicate %92, %103 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %108 = neura.grant_predicate %9, %103 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %109 = neura.grant_predicate %5, %103 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %110 = neura.grant_predicate %7, %103 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %111 = neura.load_indexed %96[%97, %98, %99 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %112 = "neura.icmp"(%111, %100) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %113 = "neura.sel"(%111, %100, %112) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %114 = "neura.add"(%97, %101) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %114 -> %93 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %113 -> %91 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %102 -> %89 : !neura.data !neura.data +// CTRL2DATA-NEXT: %115 = neura.load_indexed %104[%105, %106 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %116 = "neura.mul"(%115, %107) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %117 = "neura.div"(%116, %108) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %117 to %104[%105, %106 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %118 = "neura.add"(%106, %109) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %118 -> %82 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %110 -> %80 : !neura.data !neura.data +// CTRL2DATA-NEXT: %119 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %120 = "neura.phi"(%119, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %121 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %122 = "neura.phi"(%121, %88) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %123 = "neura.icmp"(%122, %120) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %124 = neura.grant_predicate %3, %123 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %125 = neura.grant_predicate %21, %123 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %126 = neura.grant_predicate %122, %123 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %127 = neura.grant_predicate %79, %123 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %128 = "neura.not"(%123) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %129 = neura.grant_predicate %21, %128 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %130 = neura.grant_predicate %5, %128 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %131 = neura.grant_predicate %7, %128 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %132 = neura.load_indexed %124[%125, %126 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %133 = "neura.icmp"(%132, %127) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %134 = neura.grant_predicate %79, %133 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %135 = neura.grant_predicate %3, %133 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %136 = neura.grant_predicate %21, %133 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %137 = neura.grant_predicate %122, %133 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %138 = "neura.not"(%133) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %139 = neura.grant_predicate %122, %138 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %140 = neura.grant_predicate %5, %138 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %141 = neura.grant_predicate %7, %138 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %134 to %135[%136, %137 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %142 = "neura.phi"(%141, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %143 = "neura.phi"(%140, %5) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %144 = "neura.phi"(%139, %122) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %145 = "neura.add"(%144, %143) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %145 -> %121 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %142 -> %119 : !neura.data !neura.data +// CTRL2DATA-NEXT: %146 = "neura.add"(%129, %130) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %146 -> %20 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %131 -> %18 : !neura.data !neura.data // CTRL2DATA-NEXT: "neura.return"() : () -> () // CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/non_perfect_nested/non_perfect_nested.mlir b/test/controflow_fuse/non_perfect_nested/non_perfect_nested.mlir index de13abdd..1c978c97 100644 --- a/test/controflow_fuse/non_perfect_nested/non_perfect_nested.mlir +++ b/test/controflow_fuse/non_perfect_nested/non_perfect_nested.mlir @@ -1,6 +1,23 @@ // RUN: mlir-opt %s --lower-affine --convert-scf-to-cf --convert-cf-to-llvm -o %t-llvm.mlir -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura | FileCheck %s -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --canonicalize-live-in --leverage-predicated-value --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: | FileCheck %s -check-prefix=CTRL2DATA module attributes {} { func.func @_Z29non_perfect_extra_computationPA128_iS0_(%arg0: memref, %arg1: memref) attributes {llvm.linkage = #llvm.linkage} { @@ -122,136 +139,114 @@ module attributes {} { // CTRL2DATA: func.func @_Z29non_perfect_extra_computationPA128_iS0_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { // CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %2 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> -// CTRL2DATA-NEXT: %4 = "neura.grant_always"(%3) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%3) : (!neura.data, i1>) -> !neura.data, i1> -// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 4 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %9 = "neura.constant"() <{predicate = true, value = 3 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.grant_always"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.constant"() <{predicate = true, value = 2 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %13 = "neura.grant_always"(%12) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.grant_always"(%15) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = "neura.grant_once"(%15) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %19 = "neura.grant_always"(%18) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %20 = "neura.grant_once"(%18) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %21 = "neura.constant"() <{predicate = true, value = 100 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %22 = "neura.grant_always"(%21) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %23 = "neura.grant_once"(%21) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %24 = "neura.constant"() <{predicate = true, value = 3 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %25 = "neura.grant_always"(%24) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = "neura.grant_once"(%24) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %27 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %28 = "neura.grant_always"(%27) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %29 = "neura.grant_once"(%27) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %30 = "neura.constant"() <{predicate = true, value = 1000 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %31 = "neura.grant_always"(%30) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %32 = "neura.grant_once"(%30) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %33 = "neura.constant"() <{predicate = true, value = -1000 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %34 = "neura.grant_always"(%33) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %35 = "neura.grant_once"(%33) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %36 = "neura.constant"() <{predicate = true, value = 128 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %37 = "neura.grant_always"(%36) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %38 = "neura.grant_once"(%36) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %39 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %40 = "neura.grant_always"(%39) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %41 = "neura.grant_once"(%39) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %42 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %43 = "neura.grant_always"(%42) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %44 = "neura.grant_once"(%42) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %45 = "neura.cast"(%42) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %46 = "neura.grant_once"(%45) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %47 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %48 = "neura.phi"(%47, %20) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 4 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 3 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 2 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.constant"() <{predicate = true, value = 100 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %15 = "neura.grant_once"(%14) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.constant"() <{predicate = true, value = 3 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %17 = "neura.grant_once"(%16) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %19 = "neura.grant_once"(%18) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = "neura.constant"() <{predicate = true, value = 1000 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.grant_once"(%20) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = "neura.constant"() <{predicate = true, value = -1000 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %23 = "neura.grant_once"(%22) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %24 = "neura.constant"() <{predicate = true, value = 128 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %25 = "neura.grant_once"(%24) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %26 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %27 = "neura.grant_once"(%26) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %28 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.grant_once"(%28) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %31 = "neura.phi"(%30, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %33 = "neura.phi"(%32, %29) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %34 = "neura.icmp"(%33, %31) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %35 = "neura.not"(%34) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %36 = neura.grant_predicate %33, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %37 = neura.grant_predicate %19, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %38 = neura.grant_predicate %27, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.grant_predicate %17, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %40 = neura.grant_predicate %29, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %41 = neura.grant_predicate %21, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %42 = neura.grant_predicate %23, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %43 = "neura.cast"(%36) <{cast_type = "i64_to_i32"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %44 = "neura.div"(%43, %37) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %45 = "neura.mul"(%37, %44) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %46 = "neura.sub"(%43, %45) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %47 = "neura.icmp"(%46, %38) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %48 = "neura.sel"(%37, %39, %47) : (!neura.data, !neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %49 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %50 = "neura.phi"(%49, %46) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %51 = "neura.cast"(%50) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %52 = "neura.icmp"(%51, %48) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %53 = "neura.not"(%52) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %54 = neura.grant_predicate %51, %52 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %55 = neura.grant_predicate %29, %52 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %56 = neura.grant_predicate %41, %52 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %57 = neura.grant_predicate %26, %52 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %58 = neura.grant_predicate %44, %52 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %59 = neura.grant_predicate %32, %52 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %60 = neura.grant_predicate %35, %52 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %61 = "neura.cast"(%54) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %62 = "neura.div"(%61, %55) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %63 = "neura.mul"(%55, %62) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %64 = "neura.sub"(%61, %63) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %65 = "neura.icmp"(%64, %56) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %66 = "neura.sel"(%55, %57, %65) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %67 = "neura.cast"(%58) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %68 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %69 = "neura.phi"(%68, %20) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %70 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %71 = "neura.phi"(%70, %56) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %72 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %73 = "neura.phi"(%72, %60) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %74 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %75 = "neura.phi"(%74, %59) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %76 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %77 = "neura.phi"(%76, %67) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %78 = "neura.cast"(%77) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %79 = "neura.icmp"(%78, %69) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %80 = neura.grant_predicate %2, %79 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %81 = neura.grant_predicate %51, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %82 = neura.grant_predicate %78, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %83 = neura.grant_predicate %66, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %84 = neura.grant_predicate %5, %79 : !neura.data, i1>, !neura.data -> !neura.data, i1> -// CTRL2DATA-NEXT: %85 = neura.grant_predicate %71, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %86 = neura.grant_predicate %73, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %87 = neura.grant_predicate %75, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %88 = neura.grant_predicate %17, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %89 = neura.grant_predicate %20, %79 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %90 = "neura.not"(%79) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %91 = neura.grant_predicate %71, %90 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %92 = neura.grant_predicate %38, %90 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %93 = neura.grant_predicate %73, %90 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %94 = neura.grant_predicate %75, %90 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %95 = neura.grant_predicate %41, %90 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %96 = neura.load_indexed %80[%81, %82 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %97 = "neura.mul"(%96, %83) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %97 to %84[%81, %82 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %98 = neura.load_indexed %80[%81, %82 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %99 = "neura.add"(%85, %98) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %100 = "neura.icmp"(%98, %86) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %101 = "neura.sel"(%98, %86, %100) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %102 = "neura.icmp"(%98, %87) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %103 = "neura.sel"(%98, %87, %102) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %104 = "neura.add"(%82, %88) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %105 = "neura.cast"(%104) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %105 -> %76 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %103 -> %74 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %101 -> %72 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %99 -> %70 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %89 -> %68 : !neura.data !neura.data -// CTRL2DATA-NEXT: %106 = "neura.div"(%91, %92) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %107 = "neura.sub"(%93, %94) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %108 = "neura.icmp"(%107, %95) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %109 = neura.grant_predicate %106, %108 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %110 = neura.grant_predicate %23, %108 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %111 = neura.grant_predicate %107, %108 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %112 = "neura.not"(%108) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %113 = neura.grant_predicate %106, %112 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %114 = "neura.mul"(%109, %110) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %115 = "neura.div"(%114, %111) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %116 = "neura.phi"(%115, %113) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %106 to %5[%51, %44 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %73 to %5[%51, %17 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %75 to %5[%51, %14 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %116 to %5[%51, %11 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %107 to %5[%51, %8 : !neura.data, !neura.data] !neura.data, i1> : !neura.data -// CTRL2DATA-NEXT: %117 = "neura.add"(%51, %17) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %118 = "neura.cast"(%117) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %118 -> %49 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %20 -> %47 : !neura.data !neura.data +// CTRL2DATA-NEXT: %50 = "neura.phi"(%49, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %51 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %52 = "neura.phi"(%51, %38) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %53 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %54 = "neura.phi"(%53, %42) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %55 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %56 = "neura.phi"(%55, %41) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %57 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %58 = "neura.phi"(%57, %40) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %59 = "neura.icmp"(%58, %50) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %60 = neura.grant_predicate %1, %59 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %61 = neura.grant_predicate %33, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %62 = neura.grant_predicate %58, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %63 = neura.grant_predicate %48, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %64 = neura.grant_predicate %3, %59 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %65 = neura.grant_predicate %52, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %66 = neura.grant_predicate %54, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %67 = neura.grant_predicate %56, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %68 = neura.grant_predicate %11, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %69 = neura.grant_predicate %13, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %70 = "neura.not"(%59) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %71 = neura.grant_predicate %52, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %72 = neura.grant_predicate %25, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %73 = neura.grant_predicate %54, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %74 = neura.grant_predicate %56, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %75 = neura.grant_predicate %27, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %76 = neura.load_indexed %60[%61, %62 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %77 = "neura.mul"(%76, %63) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %77 to %64[%61, %62 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %78 = neura.load_indexed %60[%61, %62 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %79 = "neura.add"(%65, %78) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %80 = "neura.icmp"(%78, %66) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %81 = "neura.sel"(%78, %66, %80) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %82 = "neura.icmp"(%78, %67) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %83 = "neura.sel"(%78, %67, %82) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %84 = "neura.add"(%62, %68) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %84 -> %57 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %83 -> %55 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %81 -> %53 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %79 -> %51 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %69 -> %49 : !neura.data !neura.data +// CTRL2DATA-NEXT: %85 = "neura.div"(%71, %72) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %86 = "neura.sub"(%73, %74) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %87 = "neura.icmp"(%86, %75) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %88 = neura.grant_predicate %85, %87 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %89 = neura.grant_predicate %15, %87 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %90 = neura.grant_predicate %86, %87 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %91 = "neura.not"(%87) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %92 = neura.grant_predicate %85, %91 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %93 = "neura.mul"(%88, %89) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %94 = "neura.div"(%93, %90) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %95 = "neura.phi"(%94, %92) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %85 to %3[%33, %29 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %54 to %3[%33, %11 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %56 to %3[%33, %9 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %95 to %3[%33, %7 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %86 to %3[%33, %5 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %96 = "neura.add"(%33, %11) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %96 -> %32 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %13 -> %30 : !neura.data !neura.data // CTRL2DATA-NEXT: "neura.return"() : () -> () // CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/perfect_nested/perfect_nested.mlir b/test/controflow_fuse/perfect_nested/perfect_nested.mlir index 4f115df6..10b16f1d 100644 --- a/test/controflow_fuse/perfect_nested/perfect_nested.mlir +++ b/test/controflow_fuse/perfect_nested/perfect_nested.mlir @@ -1,7 +1,32 @@ // RUN: mlir-opt %s --lower-affine --convert-scf-to-cf --convert-cf-to-llvm -o %t-llvm.mlir -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura | FileCheck %s -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --canonicalize-cast | FileCheck %s --check-prefix=CAST -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --leverage-predicated-value --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: | FileCheck %s --check-prefix=CAST + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: | FileCheck %s -check-prefix=CTRL2DATA module attributes {} { func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {llvm.linkage = #llvm.linkage} { @@ -71,39 +96,47 @@ module attributes {} { // CAST-NEXT: "neura.return"() : () -> () // CAST-NEXT: } -// CTRL2DATA: func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.cast"(%4) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA: func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data // CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %9 = "neura.phi"(%8, %7) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.cast"(%9) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %11 = "neura.icmp"(%10, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.not"(%11) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = neura.grant_predicate %5, %11 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.cast"(%13) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %16 = "neura.phi"(%15, %14) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = "neura.cast"(%16) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.icmp"(%17, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %19 = "neura.not"(%18) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %20 = neura.grant_predicate %5, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %21 = neura.grant_predicate %17, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %22 = neura.load_indexed %arg0[%20, %20, %20, %20, %20, %21 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %23 = neura.grant_predicate %10, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %22 to %arg1[%20, %20, %23, %20, %20, %21 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %24 = neura.grant_predicate %1, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %25 = "neura.add"(%21, %24) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = "neura.cast"(%25) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %15 : !neura.data !neura.data -// CTRL2DATA-NEXT: %27 = neura.grant_predicate %10, %19 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %28 = neura.grant_predicate %1, %19 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %29 = "neura.add"(%27, %28) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %30 = "neura.cast"(%29) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %30 -> %8 : !neura.data !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %13 = "neura.phi"(%12, %9) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.icmp"(%13, %11) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %15 = "neura.not"(%14) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %9, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %17 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %18 = "neura.phi"(%17, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %19 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %20 = "neura.phi"(%19, %16) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.icmp"(%20, %18) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.grant_predicate %1, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %9, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %20, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %3, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %13, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %5, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %7, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.not"(%21) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %13, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %5, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %7, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.load_indexed %22[%23, %23, %23, %23, %23, %24 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %33 to %25[%23, %23, %26, %23, %23, %24 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %34 = "neura.add"(%24, %27) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %34 -> %19 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %28 -> %17 : !neura.data !neura.data +// CTRL2DATA-NEXT: %35 = "neura.add"(%30, %31) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %35 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %32 -> %10 : !neura.data !neura.data // CTRL2DATA-NEXT: "neura.return"() : () -> () +// CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir b/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir index d77f57f1..b309843b 100644 --- a/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir +++ b/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir @@ -1,7 +1,33 @@ // RUN: mlir-opt %s --lower-affine --convert-scf-to-cf --convert-cf-to-llvm -o %t-llvm.mlir -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura | FileCheck %s -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --canonicalize-cast | FileCheck %s --check-prefix=CAST -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --leverage-predicated-value --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: | FileCheck %s --check-prefix=CAST + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: | FileCheck %s -check-prefix=CTRL2DATA module attributes {} { func.func @_Z27perfect_nested_reduction_2dPA128_i(%arg0: memref) -> i32 attributes {llvm.linkage = #llvm.linkage} { @@ -78,46 +104,54 @@ module attributes {} { // CAST-NEXT: } // CTRL2DATA: func.func @_Z27perfect_nested_reduction_2dPA128_i(%arg0: memref) -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.cast"(%6) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data // CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %5) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %13 = "neura.phi"(%12, %9) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.cast"(%13) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = "neura.icmp"(%14, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.not"(%15) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = neura.grant_predicate %7, %15 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.cast"(%17) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %19 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %20 = "neura.phi"(%19, %11) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %5) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %13 = "neura.phi"(%12, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %15 = "neura.phi"(%14, %9) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.icmp"(%15, %11) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %17 = neura.grant_predicate %9, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %18 = neura.grant_predicate %13, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %19 = "neura.not"(%16) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %13, %19 : !neura.data, !neura.data -> !neura.data // CTRL2DATA-NEXT: %21 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %22 = "neura.phi"(%21, %18) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %23 = "neura.cast"(%22) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %24 = "neura.icmp"(%23, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %25 = "neura.not"(%24) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = neura.grant_predicate %14, %24 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %27 = neura.grant_predicate %23, %24 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %28 = neura.load_indexed %arg0[%26, %27 : !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %29 = "neura.add"(%20, %28) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %30 = neura.grant_predicate %1, %24 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %31 = "neura.add"(%27, %30) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %32 = "neura.cast"(%31) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %32 -> %21 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %29 -> %19 : !neura.data !neura.data -// CTRL2DATA-NEXT: %33 = neura.grant_predicate %14, %25 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %34 = neura.grant_predicate %1, %25 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %35 = "neura.add"(%33, %34) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %36 = "neura.cast"(%35) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %36 -> %12 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %20 -> %10 : !neura.data !neura.data -// CTRL2DATA-NEXT: "neura.return"(%11) : (!neura.data) -> () +// CTRL2DATA-NEXT: %22 = "neura.phi"(%21, %5) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %24 = "neura.phi"(%23, %18) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %26 = "neura.phi"(%25, %17) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %27 = "neura.icmp"(%26, %22) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %1, %27 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %15, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %26, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %24, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %3, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.grant_predicate %5, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %34 = "neura.not"(%27) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %35 = neura.grant_predicate %15, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %36 = neura.grant_predicate %3, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %37 = neura.grant_predicate %24, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %38 = neura.grant_predicate %5, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.load_indexed %28[%29, %30 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %40 = "neura.add"(%31, %39) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %41 = "neura.add"(%30, %32) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %41 -> %25 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %40 -> %23 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %33 -> %21 : !neura.data !neura.data +// CTRL2DATA-NEXT: %42 = "neura.add"(%35, %36) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %42 -> %14 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %37 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %38 -> %10 : !neura.data !neura.data +// CTRL2DATA-NEXT: "neura.return"(%20) : (!neura.data) -> () // CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/simple_loop/simple_loop.cpp b/test/controflow_fuse/simple_loop/simple_loop.cpp new file mode 100644 index 00000000..46eedcc0 --- /dev/null +++ b/test/controflow_fuse/simple_loop/simple_loop.cpp @@ -0,0 +1,5 @@ +void simple_loop(int data[128], int output[128]) { + for (int i = 0; i < 128; ++i) { + output[i] = data[i] * 2 + 1; + } +} \ No newline at end of file diff --git a/test/controflow_fuse/simple_loop/simple_loop.mlir b/test/controflow_fuse/simple_loop/simple_loop.mlir new file mode 100644 index 00000000..a56f0b36 --- /dev/null +++ b/test/controflow_fuse/simple_loop/simple_loop.mlir @@ -0,0 +1,249 @@ +// RUN: mlir-opt %s \ +// RUN: --lower-affine \ +// RUN: --convert-scf-to-cf \ +// RUN: --convert-cf-to-llvm -o %t-llvm.mlir + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in | FileCheck %s --check-prefix=CANO + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: --fuse-control-flow | FileCheck %s -check-prefix=CTRLFUSE + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: --fuse-control-flow \ +// RUN: --insert-data-mov \ +// RUN: --map-to-accelerator="mapping-strategy=heuristic" | FileCheck %s -check-prefix=CTRLFUSE-MAPPING + +module attributes {} { + func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {llvm.linkage = #llvm.linkage} { + %c1_i32 = arith.constant 1 : i32 + %c2_i32 = arith.constant 2 : i32 + affine.for %arg2 = 0 to 128 { + %0 = affine.load %arg0[%arg2] : memref + %1 = arith.muli %0, %c2_i32 : i32 + %2 = arith.addi %1, %c1_i32 : i32 + affine.store %2, %arg1[%arg2] : memref + } + return + } +} + + +// CHECK: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CHECK-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> index +// CHECK-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> index +// CHECK-NEXT: %2 = "neura.constant"() <{predicate = true, value = 1 : i32}> : () -> i32 +// CHECK-NEXT: %3 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> i32 +// CHECK-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> index +// CHECK-NEXT: %5 = "neura.cast"(%4) <{cast_type = "index_to_int"}> : (index) -> i64 +// CHECK-NEXT: neura.br %5 : i64 to ^bb1 +// CHECK-NEXT: ^bb1(%6: i64): // 2 preds: ^bb0, ^bb2 +// CHECK-NEXT: %7 = "neura.cast"(%6) <{cast_type = "int_to_index"}> : (i64) -> index +// CHECK-NEXT: %8 = "neura.icmp"(%7, %1) <{cmpType = "slt"}> : (index, index) -> i1 +// CHECK-NEXT: neura.cond_br %8 : i1 then to ^bb2 else to ^bb3 +// CHECK-NEXT: ^bb2: // pred: ^bb1 +// CHECK-NEXT: %9 = neura.load_indexed %arg0[%7 : index] memref : i32 +// CHECK-NEXT: %10 = "neura.mul"(%9, %3) : (i32, i32) -> i32 +// CHECK-NEXT: %11 = "neura.add"(%10, %2) : (i32, i32) -> i32 +// CHECK-NEXT: neura.store_indexed %11 to %arg1[%7 : index] memref : i32 +// CHECK-NEXT: %12 = "neura.add"(%7, %0) : (index, index) -> index +// CHECK-NEXT: %13 = "neura.cast"(%12) <{cast_type = "index_to_int"}> : (index) -> i64 +// CHECK-NEXT: neura.br %13 : i64 to ^bb1 +// CHECK-NEXT: ^bb3: // pred: ^bb1 +// CHECK-NEXT: "neura.return"() : () -> () +// CHECK-NEXT: } + +// CANO: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CANO-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> memref +// CANO-NEXT: %1 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> memref +// CANO-NEXT: %2 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> i64 +// CANO-NEXT: %3 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> i64 +// CANO-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i32}> : () -> i32 +// CANO-NEXT: %5 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> i32 +// CANO-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> i64 +// CANO-NEXT: neura.br %6, %3 : i64, i64 to ^bb1 +// CANO-NEXT: ^bb1(%7: i64, %8: i64): // 2 preds: ^bb0, ^bb2 +// CANO-NEXT: %9 = "neura.icmp"(%7, %8) <{cmpType = "slt"}> : (i64, i64) -> i1 +// CANO-NEXT: neura.cond_br %9 : i1 then %0, %7, %5, %4, %1, %2, %3 : memref, i64, i32, i32, memref, i64, i64 to ^bb2 else to ^bb3 +// CANO-NEXT: ^bb2(%10: memref, %11: i64, %12: i32, %13: i32, %14: memref, %15: i64, %16: i64): // pred: ^bb1 +// CANO-NEXT: %17 = neura.load_indexed %10[%11 : i64] memref : i32 +// CANO-NEXT: %18 = "neura.mul"(%17, %12) : (i32, i32) -> i32 +// CANO-NEXT: %19 = "neura.add"(%18, %13) : (i32, i32) -> i32 +// CANO-NEXT: neura.store_indexed %19 to %14[%11 : i64] memref : i32 +// CANO-NEXT: %20 = "neura.add"(%11, %15) : (i64, i64) -> i64 +// CANO-NEXT: neura.br %20, %16 : i64, i64 to ^bb1 +// CANO-NEXT: ^bb3: // pred: ^bb1 +// CANO-NEXT: "neura.return"() : () -> () +// CANO-NEXT: } + +// CTRL2DATA: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %15 = "neura.phi"(%14, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %17 = "neura.phi"(%16, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = "neura.icmp"(%17, %15) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %19 = "neura.not"(%18) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %1, %18 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %21 = neura.grant_predicate %17, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.grant_predicate %11, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %9, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %3, %18 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %5, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %7, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %27 = neura.load_indexed %20[%21 : !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %28 = "neura.mul"(%27, %22) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.add"(%28, %23) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %29 to %24[%21 : !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %30 = "neura.add"(%21, %25) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %30 -> %16 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %14 : !neura.data !neura.data +// CTRL2DATA-NEXT: "neura.return"() : () -> () +// CTRL2DATA-NEXT: } + + +// CTRLFUSE: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRLFUSE-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data, i1> +// CTRLFUSE-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> +// CTRLFUSE-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRLFUSE-NEXT: %5 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data +// CTRLFUSE-NEXT: %6 = "neura.grant_always"(%5) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %7 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i32}> : () -> !neura.data +// CTRLFUSE-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %10 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> !neura.data +// CTRLFUSE-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRLFUSE-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %14 = "neura.constant"() <{predicate = true, value = true}> : () -> !neura.data +// CTRLFUSE-NEXT: %15 = "neura.grant_always"(%14) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %15, start = %13, end = %6, step = %7) {iterationType = "increment"} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// CTRLFUSE-NEXT: %16 = "neura.not"(%valid) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %17 = neura.grant_predicate %1, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRLFUSE-NEXT: %18 = neura.grant_predicate %11, %valid : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-NEXT: %19 = neura.grant_predicate %9, %valid : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-NEXT: %20 = neura.grant_predicate %3, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRLFUSE-NEXT: %21 = neura.load_indexed %17[%nextindex : !neura.data] !neura.data, i1> : !neura.data +// CTRLFUSE-NEXT: %22 = "neura.mul"(%21, %18) : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-NEXT: %23 = "neura.add"(%22, %19) : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-NEXT: neura.store_indexed %23 to %20[%nextindex : !neura.data] !neura.data, i1> : !neura.data +// CTRLFUSE-NEXT: "neura.return"() : () -> () +// CTRLFUSE-NEXT: } + +// CTRLFUSE-MAPPING: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {CompiledII = 4 : i32, RecMII = 1 : i32, ResMII = 2 : i32, accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRLFUSE-MAPPING-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %1 = "neura.data_mov"(%0) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %2 = "neura.grant_once"(%1) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %3 = "neura.constant"() <{predicate = true, value = "%arg1"}> {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : () -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %4 = "neura.data_mov"(%3) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 4 : i32}, {id = 0 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %5 = "neura.grant_once"(%4) {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 6 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %6 = "neura.constant"() <{predicate = true, value = 1 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %7 = "neura.constant"() <{predicate = true, value = 128 : i64}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 1 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %8 = "neura.data_mov"(%7) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %9 = "neura.grant_always"(%8) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%6) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %11 = "neura.grant_always"(%10) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %12 = "neura.constant"() <{predicate = true, value = 1 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %13 = "neura.data_mov"(%12) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %14 = "neura.grant_once"(%13) {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %15 = "neura.constant"() <{predicate = true, value = 2 : i32}> {mapping_locs = [{id = 3 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 0 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %16 = "neura.data_mov"(%15) {mapping_locs = [{id = 8 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %17 = "neura.grant_once"(%16) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %18 = "neura.constant"() <{predicate = true, value = 0 : i64}> {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 3 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %19 = "neura.data_mov"(%18) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %20 = "neura.grant_once"(%19) {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %21 = "neura.constant"() <{predicate = true, value = true}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %22 = "neura.data_mov"(%21) {mapping_locs = [{id = 37 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %23 = "neura.grant_always"(%22) {mapping_locs = [{id = 15 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%23) {mapping_locs = [{id = 46 : i32, resource = "link", time_step = 1 : i32}, {id = 45 : i32, resource = "link", time_step = 2 : i32}, {id = 33 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %25 = "neura.data_mov"(%20) {mapping_locs = [{id = 42 : i32, resource = "link", time_step = 1 : i32}, {id = 29 : i32, resource = "link", time_step = 2 : i32}, {id = 14 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %26 = "neura.data_mov"(%9) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 1 : i32}, {id = 33 : i32, resource = "link", time_step = 2 : i32}, {id = 24 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%11) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 1 : i32}, {id = 7 : i32, resource = "link", time_step = 2 : i32}, {id = 25 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %24, start = %25, end = %26, step = %27) {iterationType = "increment", mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// CTRLFUSE-MAPPING-NEXT: %28 = "neura.data_mov"(%valid) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %29 = "neura.not"(%28) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%2) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 2 : i32}, {id = 8 : i32, resource = "register", time_step = 3 : i32}, {id = 8 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %31 = "neura.data_mov"(%valid) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %32 = neura.grant_predicate %30, %31 {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%17) {mapping_locs = [{id = 5 : i32, resource = "link", time_step = 3 : i32}, {id = 4 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %34 = "neura.data_mov"(%valid) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %35 = neura.grant_predicate %33, %34 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %36 = "neura.data_mov"(%14) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 4 : i32}, {id = 16 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %37 = "neura.data_mov"(%valid) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 4 : i32}, {id = 31 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %38 = neura.grant_predicate %36, %37 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %39 = "neura.data_mov"(%5) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 6 : i32}, {id = 3 : i32, resource = "link", time_step = 7 : i32}, {id = 6 : i32, resource = "link", time_step = 8 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %40 = "neura.data_mov"(%valid) {mapping_locs = [{id = 18 : i32, resource = "link", time_step = 4 : i32}, {id = 22 : i32, resource = "link", time_step = 5 : i32}, {id = 12 : i32, resource = "register", time_step = 6 : i32}, {id = 12 : i32, resource = "register", time_step = 7 : i32}, {id = 12 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %41 = neura.grant_predicate %39, %40 {mapping_locs = [{id = 3 : i32, resource = "tile", time_step = 9 : i32, x = 3 : i32, y = 0 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %42 = "neura.data_mov"(%32) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %43 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %44 = neura.load_indexed %42[%43 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data +// CTRLFUSE-MAPPING-NEXT: %45 = "neura.data_mov"(%44) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %46 = "neura.data_mov"(%35) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %47 = "neura.mul"(%45, %46) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %48 = "neura.data_mov"(%47) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %49 = "neura.data_mov"(%38) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %50 = "neura.add"(%48, %49) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %51 = "neura.data_mov"(%50) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 8 : i32}, {id = 33 : i32, resource = "link", time_step = 9 : i32}, {id = 26 : i32, resource = "register", time_step = 10 : i32}, {id = 26 : i32, resource = "register", time_step = 11 : i32}, {id = 26 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %52 = "neura.data_mov"(%41) {mapping_locs = [{id = 9 : i32, resource = "link", time_step = 9 : i32}, {id = 21 : i32, resource = "link", time_step = 10 : i32}, {id = 27 : i32, resource = "register", time_step = 11 : i32}, {id = 27 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// CTRLFUSE-MAPPING-NEXT: %53 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: neura.store_indexed %51 to %52[%53 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 13 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data +// CTRLFUSE-MAPPING-NEXT: "neura.return"() {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : () -> () +// CTRLFUSE-MAPPING-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/simpleloop/simpleloop.cpp b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.cpp similarity index 100% rename from test/controflow_fuse/simpleloop/simpleloop.cpp rename to test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.cpp diff --git a/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir new file mode 100644 index 00000000..fdac5a3f --- /dev/null +++ b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir @@ -0,0 +1,206 @@ +// RUN: mlir-opt %s \ +// RUN: --lower-affine \ +// RUN: --convert-scf-to-cf \ +// RUN: --convert-cf-to-llvm -o %t-llvm.mlir + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: | FileCheck %s + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast | FileCheck %s --check-prefix=CAST + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: --fuse-control-flow | FileCheck %s -check-prefix=CTRLFUSE + +// RUN: mlir-neura-opt %t-llvm.mlir \ +// RUN: --assign-accelerator \ +// RUN: --lower-arith-to-neura \ +// RUN: --lower-memref-to-neura \ +// RUN: --lower-builtin-to-neura \ +// RUN: --lower-llvm-to-neura \ +// RUN: --canonicalize-cast \ +// RUN: --canonicalize-live-in \ +// RUN: --leverage-predicated-value \ +// RUN: --transform-ctrl-to-data-flow \ +// RUN: --fuse-control-flow \ +// RUN: --insert-data-mov \ +// RUN: --map-to-accelerator="mapping-strategy=heuristic" | FileCheck %s -check-prefix=CTRLFUSE-MAPPING + +module attributes {} { + func.func @_Z10simpleloopv() -> i32 attributes {llvm.linkage = #llvm.linkage} { + %c0_i32 = arith.constant 0 : i32 + %0 = affine.for %arg0 = 0 to 128 iter_args(%arg1 = %c0_i32) -> (i32) { + %1 = arith.index_cast %arg0 : index to i32 + %2 = arith.addi %arg1, %1 : i32 + affine.yield %2 : i32 + } + return %0 : i32 + } +} + +// CHECK: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CHECK-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> index +// CHECK-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> index +// CHECK-NEXT: %2 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> i32 +// CHECK-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> index +// CHECK-NEXT: %4 = "neura.cast"(%3) <{cast_type = "index_to_int"}> : (index) -> i64 +// CHECK-NEXT: neura.br %4, %2 : i64, i32 to ^bb1 +// CHECK-NEXT: ^bb1(%5: i64, %6: i32): // 2 preds: ^bb0, ^bb2 +// CHECK-NEXT: %7 = "neura.cast"(%5) <{cast_type = "int_to_index"}> : (i64) -> index +// CHECK-NEXT: %8 = "neura.icmp"(%7, %1) <{cmpType = "slt"}> : (index, index) -> i1 +// CHECK-NEXT: neura.cond_br %8 : i1 then to ^bb2 else to ^bb3 +// CHECK-NEXT: ^bb2: // pred: ^bb1 +// CHECK-NEXT: %9 = "neura.cast"(%7) <{cast_type = "index_to_int"}> : (index) -> i32 +// CHECK-NEXT: %10 = "neura.add"(%6, %9) : (i32, i32) -> i32 +// CHECK-NEXT: %11 = "neura.add"(%7, %0) : (index, index) -> index +// CHECK-NEXT: %12 = "neura.cast"(%11) <{cast_type = "index_to_int"}> : (index) -> i64 +// CHECK-NEXT: neura.br %12, %10 : i64, i32 to ^bb1 +// CHECK-NEXT: ^bb3: // pred: ^bb1 +// CHECK-NEXT: "neura.return"(%6) : (i32) -> () +// CHECK-NEXT: } + +// CAST: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CAST-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> i64 +// CAST-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> i64 +// CAST-NEXT: %2 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> i32 +// CAST-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> i64 +// CAST-NEXT: neura.br %3, %2 : i64, i32 to ^bb1 +// CAST-NEXT: ^bb1(%4: i64, %5: i32): // 2 preds: ^bb0, ^bb2 +// CAST-NEXT: %6 = "neura.icmp"(%4, %1) <{cmpType = "slt"}> : (i64, i64) -> i1 +// CAST-NEXT: neura.cond_br %6 : i1 then to ^bb2 else to ^bb3 +// CAST-NEXT: ^bb2: // pred: ^bb1 +// CAST-NEXT: %7 = "neura.cast"(%4) <{cast_type = "i64_to_i32"}> : (i64) -> i32 +// CAST-NEXT: %8 = "neura.add"(%5, %7) : (i32, i32) -> i32 +// CAST-NEXT: %9 = "neura.add"(%4, %0) : (i64, i64) -> i64 +// CAST-NEXT: neura.br %9, %8 : i64, i32 to ^bb1 +// CAST-NEXT: ^bb3: // pred: ^bb1 +// CAST-NEXT: "neura.return"(%5) : (i32) -> () +// CAST-NEXT: } + +// CTRL2DATA: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %9 = "neura.phi"(%8, %3) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %5) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %13 = "neura.phi"(%12, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.icmp"(%13, %9) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %13, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %11, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %17 = neura.grant_predicate %1, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %18 = neura.grant_predicate %3, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %19 = "neura.not"(%14) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %11, %19 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.cast"(%15) <{cast_type = "i64_to_i32"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = "neura.add"(%16, %21) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = "neura.add"(%15, %17) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %23 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %22 -> %10 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %18 -> %8 : !neura.data !neura.data +// CTRL2DATA-NEXT: "neura.return"(%20) : (!neura.data) -> () +// CTRL2DATA-NEXT: } + + +// CTRLFUSE: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRLFUSE-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRLFUSE-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !neura.data +// CTRLFUSE-NEXT: %2 = "neura.grant_always"(%1) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %3 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data +// CTRLFUSE-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRLFUSE-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %8 = "neura.constant"() <{predicate = true, value = true}> : () -> !neura.data +// CTRLFUSE-NEXT: %9 = "neura.grant_always"(%8) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %9, start = %7, end = %2, step = %3) {iterationType = "increment"} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// CTRLFUSE-NEXT: %10 = "neura.not"(%valid) : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %11 = neura.reserve : !neura.data +// CTRLFUSE-NEXT: %12 = "neura.phi"(%11, %5) : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-NEXT: %13 = neura.grant_predicate %12, %valid : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-NEXT: %14 = neura.grant_predicate %12, %10 : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-NEXT: %15 = "neura.cast"(%nextindex) <{cast_type = "i64_to_i32"}> : (!neura.data) -> !neura.data +// CTRLFUSE-NEXT: %16 = "neura.add"(%13, %15) : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-NEXT: neura.ctrl_mov %16 -> %11 : !neura.data !neura.data +// CTRLFUSE-NEXT: "neura.return"(%14) : (!neura.data) -> () +// CTRLFUSE-NEXT: } + + +// CTRLFUSE-MAPPING: func.func @_Z10simpleloopv() -> i32 attributes {CompiledII = 3 : i32, RecMII = 3 : i32, ResMII = 2 : i32, accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CTRLFUSE-MAPPING-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : i64}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : i64}> {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %2 = "neura.data_mov"(%1) {mapping_locs = [{id = 39 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %3 = "neura.grant_always"(%2) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %4 = "neura.data_mov"(%0) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %5 = "neura.grant_always"(%4) {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %7 = "neura.data_mov"(%6) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %8 = "neura.grant_once"(%7) {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %9 = "neura.constant"() <{predicate = true, value = 0 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%9) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %11 = "neura.grant_once"(%10) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %12 = "neura.constant"() <{predicate = true, value = true}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 2 : i32}]} : () -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %13 = "neura.data_mov"(%12) {mapping_locs = [{id = 29 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %14 = "neura.grant_always"(%13) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %15 = "neura.data_mov"(%14) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %16 = "neura.data_mov"(%11) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 1 : i32}, {id = 20 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %17 = "neura.data_mov"(%3) {mapping_locs = [{id = 24 : i32, resource = "link", time_step = 1 : i32}, {id = 29 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %18 = "neura.data_mov"(%5) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 1 : i32}, {id = 21 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %15, start = %16, end = %17, step = %18) {iterationType = "increment", mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data +// CTRLFUSE-MAPPING-NEXT: %19 = "neura.data_mov"(%valid) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %20 = "neura.not"(%19) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %21 = neura.reserve : !neura.data +// CTRLFUSE-MAPPING-NEXT: %22 = "neura.data_mov"(%8) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 4 : i32, resource = "register", time_step = 3 : i32}, {id = 4 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %23 = "neura.phi"(%21, %22) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%23) {mapping_locs = []} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %25 = "neura.data_mov"(%valid) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 3 : i32}, {id = 5 : i32, resource = "register", time_step = 4 : i32}, {id = 5 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %26 = neura.grant_predicate %24, %25 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%23) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %28 = "neura.data_mov"(%20) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 4 : i32}, {id = 8 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %29 = neura.grant_predicate %27, %28 {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%nextindex) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %31 = "neura.cast"(%30) <{cast_type = "i64_to_i32"}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %32 = "neura.data_mov"(%26) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%31) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 4 : i32}, {id = 33 : i32, resource = "link", time_step = 5 : i32}, {id = 19 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: %34 = "neura.add"(%32, %33) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: neura.ctrl_mov %34 -> %21 {mapping_locs = [{id = 5 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data +// CTRLFUSE-MAPPING-NEXT: %35 = "neura.data_mov"(%29) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// CTRLFUSE-MAPPING-NEXT: "neura.return"(%35) {mapping_locs = [{id = 3 : i32, resource = "tile", time_step = 7 : i32, x = 3 : i32, y = 0 : i32}]} : (!neura.data) -> () +// CTRLFUSE-MAPPING-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/simpleloop/simpleloop.mlir b/test/controflow_fuse/simpleloop/simpleloop.mlir deleted file mode 100644 index 41cdad3a..00000000 --- a/test/controflow_fuse/simpleloop/simpleloop.mlir +++ /dev/null @@ -1,83 +0,0 @@ -// RUN: mlir-opt %s --lower-affine --convert-scf-to-cf --convert-cf-to-llvm -o %t-llvm.mlir -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura | FileCheck %s -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --canonicalize-cast | FileCheck %s --check-prefix=CAST -// RUN: mlir-neura-opt %t-llvm.mlir --assign-accelerator --lower-arith-to-neura --lower-memref-to-neura --lower-builtin-to-neura --lower-llvm-to-neura --leverage-predicated-value --transform-ctrl-to-data-flow | FileCheck %s -check-prefix=CTRL2DATA - -module attributes {} { - func.func @_Z10simpleloopv() -> i32 attributes {llvm.linkage = #llvm.linkage} { - %c0_i32 = arith.constant 0 : i32 - %0 = affine.for %arg0 = 0 to 128 iter_args(%arg1 = %c0_i32) -> (i32) { - %1 = arith.index_cast %arg0 : index to i32 - %2 = arith.addi %arg1, %1 : i32 - affine.yield %2 : i32 - } - return %0 : i32 - } -} - -// CHECK: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CHECK-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> index -// CHECK-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> index -// CHECK-NEXT: %2 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> i32 -// CHECK-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> index -// CHECK-NEXT: %4 = "neura.cast"(%3) <{cast_type = "index_to_int"}> : (index) -> i64 -// CHECK-NEXT: neura.br %4, %2 : i64, i32 to ^bb1 -// CHECK-NEXT: ^bb1(%5: i64, %6: i32): // 2 preds: ^bb0, ^bb2 -// CHECK-NEXT: %7 = "neura.cast"(%5) <{cast_type = "int_to_index"}> : (i64) -> index -// CHECK-NEXT: %8 = "neura.icmp"(%7, %1) <{cmpType = "slt"}> : (index, index) -> i1 -// CHECK-NEXT: neura.cond_br %8 : i1 then to ^bb2 else to ^bb3 -// CHECK-NEXT: ^bb2: // pred: ^bb1 -// CHECK-NEXT: %9 = "neura.cast"(%7) <{cast_type = "index_to_int"}> : (index) -> i32 -// CHECK-NEXT: %10 = "neura.add"(%6, %9) : (i32, i32) -> i32 -// CHECK-NEXT: %11 = "neura.add"(%7, %0) : (index, index) -> index -// CHECK-NEXT: %12 = "neura.cast"(%11) <{cast_type = "index_to_int"}> : (index) -> i64 -// CHECK-NEXT: neura.br %12, %10 : i64, i32 to ^bb1 -// CHECK-NEXT: ^bb3: // pred: ^bb1 -// CHECK-NEXT: "neura.return"(%6) : (i32) -> () -// CHECK-NEXT: } - -// CAST: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CAST-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> i64 -// CAST-NEXT: %1 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> i64 -// CAST-NEXT: %2 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> i32 -// CAST-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> i64 -// CAST-NEXT: neura.br %3, %2 : i64, i32 to ^bb1 -// CAST-NEXT: ^bb1(%4: i64, %5: i32): // 2 preds: ^bb0, ^bb2 -// CAST-NEXT: %6 = "neura.icmp"(%4, %1) <{cmpType = "slt"}> : (i64, i64) -> i1 -// CAST-NEXT: neura.cond_br %6 : i1 then to ^bb2 else to ^bb3 -// CAST-NEXT: ^bb2: // pred: ^bb1 -// CAST-NEXT: %7 = "neura.cast"(%4) <{cast_type = "i64_to_i32"}> : (i64) -> i32 -// CAST-NEXT: %8 = "neura.add"(%5, %7) : (i32, i32) -> i32 -// CAST-NEXT: %9 = "neura.add"(%4, %0) : (i64, i64) -> i64 -// CAST-NEXT: neura.br %9, %8 : i64, i32 to ^bb1 -// CAST-NEXT: ^bb3: // pred: ^bb1 -// CAST-NEXT: "neura.return"(%5) : (i32) -> () -// CAST-NEXT: } - -// CTRL2DATA: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { -// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.cast"(%6) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %9 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %10 = "neura.phi"(%9, %5) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %11 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %12 = "neura.phi"(%11, %8) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = "neura.cast"(%12) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.icmp"(%13, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = "neura.not"(%14) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %16 = neura.grant_predicate %13, %14 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %17 = "neura.cast"(%16) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.add"(%10, %17) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %19 = neura.grant_predicate %1, %14 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %20 = "neura.add"(%16, %19) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %21 = "neura.cast"(%20) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %21 -> %11 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %18 -> %9 : !neura.data !neura.data -// CTRL2DATA-NEXT: "neura.return"(%10) : (!neura.data) -> () -// CTRL2DATA-NEXT: } diff --git a/test/neura/ctrl/branch_for.mlir b/test/neura/ctrl/branch_for.mlir index a7994e9d..97c91c63 100644 --- a/test/neura/ctrl/branch_for.mlir +++ b/test/neura/ctrl/branch_for.mlir @@ -84,7 +84,7 @@ func.func @loop_test() -> f32 { // CHECK-NEXT: "neura.return"(%10) : (!neura.data) -> () // CHECK-NEXT: } -// CANONICALIZE: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { +// CANONICALIZE: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { // CANONICALIZE-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> : () -> !neura.data // CANONICALIZE-NEXT: %1 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data // CANONICALIZE-NEXT: %2 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data @@ -100,197 +100,182 @@ func.func @loop_test() -> f32 { // CANONICALIZE-NEXT: "neura.return"(%13) : (!neura.data) -> () // CANONICALIZE-NEXT: } -// CTRL2DATA: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { +// CTRL2DATA: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { // CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.grant_once"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.grant_once"(%3) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.grant_always"(%5) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%5) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %9 = "neura.grant_always"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %11 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.grant_once"(%11) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %14 = "neura.phi"(%13, %2) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %16 = "neura.phi"(%15, %7) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %18 = "neura.phi"(%17, %10) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %19 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %20 = "neura.phi"(%19, %12) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %21 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %22 = "neura.phi"(%21, %4) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %23 = "neura.fadd"(%20, %18) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %24 = "neura.add"(%22, %16) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %25 = "neura.icmp"(%24, %14) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = neura.grant_predicate %24, %25 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %21 : !neura.data !neura.data -// CTRL2DATA-NEXT: %27 = neura.grant_predicate %23, %25 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %27 -> %19 : !neura.data !neura.data -// CTRL2DATA-NEXT: %28 = neura.grant_predicate %10, %25 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %28 -> %17 : !neura.data !neura.data -// CTRL2DATA-NEXT: %29 = neura.grant_predicate %7, %25 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %29 -> %15 : !neura.data !neura.data -// CTRL2DATA-NEXT: %30 = neura.grant_predicate %2, %25 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %30 -> %13 : !neura.data !neura.data -// CTRL2DATA-NEXT: %31 = "neura.not"(%25) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %32 = neura.grant_predicate %23, %31 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: "neura.return"(%32) : (!neura.data) -> () +// CTRL2DATA-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %1) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %13 = "neura.phi"(%12, %5) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %15 = "neura.phi"(%14, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %17 = "neura.phi"(%16, %9) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %19 = "neura.phi"(%18, %3) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = "neura.fadd"(%17, %15) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.add"(%19, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = "neura.icmp"(%21, %11) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %21, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %23 -> %18 : !neura.data !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %20, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %24 -> %16 : !neura.data !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %7, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %25 -> %14 : !neura.data !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %5, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %1, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %27 -> %10 : !neura.data !neura.data +// CTRL2DATA-NEXT: %28 = "neura.not"(%22) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %20, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: "neura.return"(%29) : (!neura.data) -> () // CTRL2DATA-NEXT: } -// MOV: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { +// MOV: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { // MOV-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> : () -> !neura.data // MOV-NEXT: %1 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// MOV-NEXT: %2 = "neura.grant_always"(%1) : (!neura.data) -> !neura.data -// MOV-NEXT: %3 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// MOV-NEXT: %4 = "neura.grant_once"(%3) : (!neura.data) -> !neura.data -// MOV-NEXT: %5 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// MOV-NEXT: %6 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// MOV-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// MOV-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// MOV-NEXT: %9 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data -// MOV-NEXT: %10 = "neura.grant_always"(%9) : (!neura.data) -> !neura.data -// MOV-NEXT: %11 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data -// MOV-NEXT: %12 = "neura.grant_once"(%11) : (!neura.data) -> !neura.data -// MOV-NEXT: %13 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data -// MOV-NEXT: %14 = "neura.data_mov"(%13) : (!neura.data) -> !neura.data -// MOV-NEXT: %15 = "neura.grant_always"(%14) : (!neura.data) -> !neura.data -// MOV-NEXT: %16 = "neura.data_mov"(%13) : (!neura.data) -> !neura.data -// MOV-NEXT: %17 = "neura.grant_once"(%16) : (!neura.data) -> !neura.data -// MOV-NEXT: %18 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> : () -> !neura.data -// MOV-NEXT: %19 = "neura.data_mov"(%18) : (!neura.data) -> !neura.data -// MOV-NEXT: %20 = "neura.grant_once"(%19) : (!neura.data) -> !neura.data -// MOV-NEXT: %21 = neura.reserve : !neura.data -// MOV-NEXT: %22 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data -// MOV-NEXT: %23 = "neura.phi"(%21, %22) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %24 = neura.reserve : !neura.data -// MOV-NEXT: %25 = "neura.data_mov"(%12) : (!neura.data) -> !neura.data -// MOV-NEXT: %26 = "neura.phi"(%24, %25) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %27 = neura.reserve : !neura.data -// MOV-NEXT: %28 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data -// MOV-NEXT: %29 = "neura.phi"(%27, %28) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %30 = neura.reserve : !neura.data -// MOV-NEXT: %31 = "neura.data_mov"(%20) : (!neura.data) -> !neura.data -// MOV-NEXT: %32 = "neura.phi"(%30, %31) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %33 = neura.reserve : !neura.data -// MOV-NEXT: %34 = "neura.data_mov"(%7) : (!neura.data) -> !neura.data -// MOV-NEXT: %35 = "neura.phi"(%33, %34) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %36 = "neura.data_mov"(%32) : (!neura.data) -> !neura.data -// MOV-NEXT: %37 = "neura.data_mov"(%29) : (!neura.data) -> !neura.data -// MOV-NEXT: %38 = "neura.fadd"(%36, %37) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %2 = "neura.grant_once"(%1) : (!neura.data) -> !neura.data +// MOV-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// MOV-NEXT: %4 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// MOV-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// MOV-NEXT: %6 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// MOV-NEXT: %7 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data +// MOV-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data +// MOV-NEXT: %9 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data +// MOV-NEXT: %10 = "neura.data_mov"(%9) : (!neura.data) -> !neura.data +// MOV-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// MOV-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> : () -> !neura.data +// MOV-NEXT: %13 = "neura.data_mov"(%12) : (!neura.data) -> !neura.data +// MOV-NEXT: %14 = "neura.grant_once"(%13) : (!neura.data) -> !neura.data +// MOV-NEXT: %15 = neura.reserve : !neura.data +// MOV-NEXT: %16 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// MOV-NEXT: %17 = "neura.phi"(%15, %16) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %18 = neura.reserve : !neura.data +// MOV-NEXT: %19 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data +// MOV-NEXT: %20 = "neura.phi"(%18, %19) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %21 = neura.reserve : !neura.data +// MOV-NEXT: %22 = "neura.data_mov"(%11) : (!neura.data) -> !neura.data +// MOV-NEXT: %23 = "neura.phi"(%21, %22) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %24 = neura.reserve : !neura.data +// MOV-NEXT: %25 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data +// MOV-NEXT: %26 = "neura.phi"(%24, %25) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %27 = neura.reserve : !neura.data +// MOV-NEXT: %28 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data +// MOV-NEXT: %29 = "neura.phi"(%27, %28) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %30 = "neura.data_mov"(%26) : (!neura.data) -> !neura.data +// MOV-NEXT: %31 = "neura.data_mov"(%23) : (!neura.data) -> !neura.data +// MOV-NEXT: %32 = "neura.fadd"(%30, %31) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %33 = "neura.data_mov"(%29) : (!neura.data) -> !neura.data +// MOV-NEXT: %34 = "neura.data_mov"(%20) : (!neura.data) -> !neura.data +// MOV-NEXT: %35 = "neura.add"(%33, %34) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %36 = "neura.data_mov"(%35) : (!neura.data) -> !neura.data +// MOV-NEXT: %37 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data +// MOV-NEXT: %38 = "neura.icmp"(%36, %37) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data // MOV-NEXT: %39 = "neura.data_mov"(%35) : (!neura.data) -> !neura.data -// MOV-NEXT: %40 = "neura.data_mov"(%26) : (!neura.data) -> !neura.data -// MOV-NEXT: %41 = "neura.add"(%39, %40) : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %42 = "neura.data_mov"(%41) : (!neura.data) -> !neura.data -// MOV-NEXT: %43 = "neura.data_mov"(%23) : (!neura.data) -> !neura.data -// MOV-NEXT: %44 = "neura.icmp"(%42, %43) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %45 = "neura.data_mov"(%41) : (!neura.data) -> !neura.data -// MOV-NEXT: %46 = "neura.data_mov"(%44) : (!neura.data) -> !neura.data -// MOV-NEXT: %47 = neura.grant_predicate %45, %46 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %47 -> %33 : !neura.data !neura.data -// MOV-NEXT: %48 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %49 = "neura.data_mov"(%44) : (!neura.data) -> !neura.data -// MOV-NEXT: %50 = neura.grant_predicate %48, %49 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %50 -> %30 : !neura.data !neura.data -// MOV-NEXT: %51 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data -// MOV-NEXT: %52 = "neura.data_mov"(%44) : (!neura.data) -> !neura.data -// MOV-NEXT: %53 = neura.grant_predicate %51, %52 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %53 -> %27 : !neura.data !neura.data -// MOV-NEXT: %54 = "neura.data_mov"(%12) : (!neura.data) -> !neura.data -// MOV-NEXT: %55 = "neura.data_mov"(%44) : (!neura.data) -> !neura.data -// MOV-NEXT: %56 = neura.grant_predicate %54, %55 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %56 -> %24 : !neura.data !neura.data -// MOV-NEXT: %57 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data -// MOV-NEXT: %58 = "neura.data_mov"(%44) : (!neura.data) -> !neura.data -// MOV-NEXT: %59 = neura.grant_predicate %57, %58 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %59 -> %21 : !neura.data !neura.data -// MOV-NEXT: %60 = "neura.data_mov"(%44) : (!neura.data) -> !neura.data -// MOV-NEXT: %61 = "neura.not"(%60) : (!neura.data) -> !neura.data -// MOV-NEXT: %62 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data -// MOV-NEXT: %63 = "neura.data_mov"(%61) : (!neura.data) -> !neura.data -// MOV-NEXT: %64 = neura.grant_predicate %62, %63 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: %65 = "neura.data_mov"(%64) : (!neura.data) -> !neura.data -// MOV-NEXT: "neura.return"(%65) : (!neura.data) -> () +// MOV-NEXT: %40 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data +// MOV-NEXT: %41 = neura.grant_predicate %39, %40 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %41 -> %27 : !neura.data !neura.data +// MOV-NEXT: %42 = "neura.data_mov"(%32) : (!neura.data) -> !neura.data +// MOV-NEXT: %43 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data +// MOV-NEXT: %44 = neura.grant_predicate %42, %43 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %44 -> %24 : !neura.data !neura.data +// MOV-NEXT: %45 = "neura.data_mov"(%11) : (!neura.data) -> !neura.data +// MOV-NEXT: %46 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data +// MOV-NEXT: %47 = neura.grant_predicate %45, %46 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %47 -> %21 : !neura.data !neura.data +// MOV-NEXT: %48 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data +// MOV-NEXT: %49 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data +// MOV-NEXT: %50 = neura.grant_predicate %48, %49 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %50 -> %18 : !neura.data !neura.data +// MOV-NEXT: %51 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// MOV-NEXT: %52 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data +// MOV-NEXT: %53 = neura.grant_predicate %51, %52 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %53 -> %15 : !neura.data !neura.data +// MOV-NEXT: %54 = "neura.data_mov"(%38) : (!neura.data) -> !neura.data +// MOV-NEXT: %55 = "neura.not"(%54) : (!neura.data) -> !neura.data +// MOV-NEXT: %56 = "neura.data_mov"(%32) : (!neura.data) -> !neura.data +// MOV-NEXT: %57 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// MOV-NEXT: %58 = neura.grant_predicate %56, %57 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: %59 = "neura.data_mov"(%58) : (!neura.data) -> !neura.data +// MOV-NEXT: "neura.return"(%59) : (!neura.data) -> () // MOV-NEXT: } -// MAPPING: func.func @loop_test() -> f32 attributes {CompiledII = 6 : i32, RecMII = 4 : i32, ResMII = 2 : i32, accelerator = "neura"} { -// MAPPING-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %1 = "neura.data_mov"(%0) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 1 : i32}, {id = 12 : i32, resource = "link", time_step = 2 : i32}, {id = 26 : i32, resource = "link", time_step = 3 : i32}, {id = 48 : i32, resource = "register", time_step = 4 : i32}, {id = 48 : i32, resource = "register", time_step = 5 : i32}, {id = 48 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %2 = "neura.grant_always"(%1) {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %3 = "neura.data_mov"(%0) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %4 = "neura.grant_once"(%3) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %5 = "neura.constant"() <{predicate = true, value = 0 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %6 = "neura.data_mov"(%5) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %7 = "neura.grant_once"(%6) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i64}> {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 0 : i32, x = 2 : i32, y = 0 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %9 = "neura.data_mov"(%8) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 0 : i32}, {id = 12 : i32, resource = "register", time_step = 1 : i32}, {id = 12 : i32, resource = "register", time_step = 2 : i32}, {id = 12 : i32, resource = "register", time_step = 3 : i32}, {id = 12 : i32, resource = "register", time_step = 4 : i32}, {id = 12 : i32, resource = "register", time_step = 5 : i32}, {id = 12 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %10 = "neura.grant_always"(%9) {mapping_locs = [{id = 3 : i32, resource = "tile", time_step = 7 : i32, x = 3 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %11 = "neura.data_mov"(%8) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %12 = "neura.grant_once"(%11) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 1 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %13 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 3 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %14 = "neura.data_mov"(%13) {mapping_locs = [{id = 43 : i32, resource = "link", time_step = 2 : i32}, {id = 40 : i32, resource = "link", time_step = 3 : i32}, {id = 39 : i32, resource = "link", time_step = 4 : i32}, {id = 32 : i32, resource = "register", time_step = 5 : i32}, {id = 32 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %15 = "neura.grant_always"(%14) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %16 = "neura.data_mov"(%13) {mapping_locs = [{id = 45 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %17 = "neura.grant_once"(%16) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %18 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data -// MAPPING-NEXT: %19 = "neura.data_mov"(%18) {mapping_locs = [{id = 36 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %20 = "neura.grant_once"(%19) {mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %21 = neura.reserve : !neura.data -// MAPPING-NEXT: %22 = "neura.data_mov"(%4) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %23 = "neura.phi"(%21, %22) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %24 = neura.reserve : !neura.data -// MAPPING-NEXT: %25 = "neura.data_mov"(%12) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %26 = "neura.phi"(%24, %25) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %27 = neura.reserve : !neura.data -// MAPPING-NEXT: %28 = "neura.data_mov"(%17) {mapping_locs = [{id = 34 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %29 = "neura.phi"(%27, %28) {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %30 = neura.reserve : !neura.data -// MAPPING-NEXT: %31 = "neura.data_mov"(%20) {mapping_locs = [{id = 21 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %32 = "neura.phi"(%30, %31) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %33 = neura.reserve : !neura.data -// MAPPING-NEXT: %34 = "neura.data_mov"(%7) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %35 = "neura.phi"(%33, %34) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %36 = "neura.data_mov"(%32) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %37 = "neura.data_mov"(%29) {mapping_locs = [{id = 45 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %38 = "neura.fadd"(%36, %37) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %39 = "neura.data_mov"(%35) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %40 = "neura.data_mov"(%26) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %41 = "neura.add"(%39, %40) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %42 = "neura.data_mov"(%41) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %43 = "neura.data_mov"(%23) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %44 = "neura.icmp"(%42, %43) <{cmpType = "slt"}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %45 = "neura.data_mov"(%41) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %46 = "neura.data_mov"(%44) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %47 = neura.grant_predicate %45, %46 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %47 -> %33 {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 5 : i32}, {id = 20 : i32, resource = "register", time_step = 6 : i32}, {id = 20 : i32, resource = "register", time_step = 7 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %48 = "neura.data_mov"(%38) {mapping_locs = [{id = 33 : i32, resource = "link", time_step = 5 : i32}, {id = 17 : i32, resource = "link", time_step = 6 : i32}, {id = 21 : i32, resource = "register", time_step = 7 : i32}, {id = 21 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %49 = "neura.data_mov"(%44) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %50 = neura.grant_predicate %48, %49 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %50 -> %30 {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 9 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %51 = "neura.data_mov"(%17) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 3 : i32}, {id = 37 : i32, resource = "register", time_step = 4 : i32}, {id = 37 : i32, resource = "register", time_step = 5 : i32}, {id = 37 : i32, resource = "register", time_step = 6 : i32}, {id = 37 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %52 = "neura.data_mov"(%44) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 4 : i32}, {id = 12 : i32, resource = "link", time_step = 5 : i32}, {id = 24 : i32, resource = "link", time_step = 6 : i32}, {id = 36 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %53 = neura.grant_predicate %51, %52 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %53 -> %27 {mapping_locs = [{id = 30 : i32, resource = "link", time_step = 8 : i32}, {id = 41 : i32, resource = "link", time_step = 9 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %54 = "neura.data_mov"(%12) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 1 : i32}, {id = 24 : i32, resource = "register", time_step = 2 : i32}, {id = 24 : i32, resource = "register", time_step = 3 : i32}, {id = 24 : i32, resource = "register", time_step = 4 : i32}, {id = 24 : i32, resource = "register", time_step = 5 : i32}, {id = 24 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %55 = "neura.data_mov"(%44) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 4 : i32}, {id = 28 : i32, resource = "link", time_step = 5 : i32}, {id = 33 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %56 = neura.grant_predicate %54, %55 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %56 -> %24 {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %57 = "neura.data_mov"(%4) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 2 : i32}, {id = 21 : i32, resource = "register", time_step = 3 : i32}, {id = 21 : i32, resource = "register", time_step = 4 : i32}, {id = 21 : i32, resource = "register", time_step = 5 : i32}, {id = 21 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %58 = "neura.data_mov"(%44) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %59 = neura.grant_predicate %57, %58 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %59 -> %21 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 7 : i32}, {id = 4 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %60 = "neura.data_mov"(%44) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %61 = "neura.not"(%60) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %62 = "neura.data_mov"(%38) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 5 : i32}, {id = 36 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %63 = "neura.data_mov"(%61) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 5 : i32}, {id = 16 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %64 = neura.grant_predicate %62, %63 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: %65 = "neura.data_mov"(%64) {mapping_locs = [{id = 27 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: "neura.return"(%65) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> () -// MAPPING-NEXT: } +// MAPPING: func.func @loop_test() -> f32 attributes {CompiledII = 6 : i32, RecMII = 4 : i32, ResMII = 2 : i32, accelerator = "neura"} { +// MAPPING-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %1 = "neura.data_mov"(%0) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %2 = "neura.grant_once"(%1) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %3 = "neura.constant"() <{predicate = true, value = 0 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %4 = "neura.data_mov"(%3) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %5 = "neura.grant_once"(%4) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %6 = "neura.constant"() <{predicate = true, value = 1 : i64}> {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 0 : i32, x = 2 : i32, y = 0 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %7 = "neura.data_mov"(%6) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %8 = "neura.grant_once"(%7) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 1 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %9 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 3 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %10 = "neura.data_mov"(%9) {mapping_locs = [{id = 45 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %11 = "neura.grant_once"(%10) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %12 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 2 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// MAPPING-NEXT: %13 = "neura.data_mov"(%12) {mapping_locs = [{id = 36 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %14 = "neura.grant_once"(%13) {mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %15 = neura.reserve : !neura.data +// MAPPING-NEXT: %16 = "neura.data_mov"(%2) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %17 = "neura.phi"(%15, %16) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %18 = neura.reserve : !neura.data +// MAPPING-NEXT: %19 = "neura.data_mov"(%8) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %20 = "neura.phi"(%18, %19) {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %21 = neura.reserve : !neura.data +// MAPPING-NEXT: %22 = "neura.data_mov"(%11) {mapping_locs = [{id = 34 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %23 = "neura.phi"(%21, %22) {mapping_locs = [{id = 14 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 3 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %24 = neura.reserve : !neura.data +// MAPPING-NEXT: %25 = "neura.data_mov"(%14) {mapping_locs = [{id = 21 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %26 = "neura.phi"(%24, %25) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %27 = neura.reserve : !neura.data +// MAPPING-NEXT: %28 = "neura.data_mov"(%5) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %29 = "neura.phi"(%27, %28) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %30 = "neura.data_mov"(%26) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %31 = "neura.data_mov"(%23) {mapping_locs = [{id = 45 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %32 = "neura.fadd"(%30, %31) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %33 = "neura.data_mov"(%29) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %34 = "neura.data_mov"(%20) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %35 = "neura.add"(%33, %34) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %36 = "neura.data_mov"(%35) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %37 = "neura.data_mov"(%17) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %38 = "neura.icmp"(%36, %37) <{cmpType = "slt"}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// MAPPING-NEXT: %39 = "neura.data_mov"(%35) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %40 = "neura.data_mov"(%38) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %41 = neura.grant_predicate %39, %40 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %41 -> %27 {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 5 : i32}, {id = 20 : i32, resource = "register", time_step = 6 : i32}, {id = 20 : i32, resource = "register", time_step = 7 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %42 = "neura.data_mov"(%32) {mapping_locs = [{id = 33 : i32, resource = "link", time_step = 5 : i32}, {id = 17 : i32, resource = "link", time_step = 6 : i32}, {id = 21 : i32, resource = "register", time_step = 7 : i32}, {id = 21 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %43 = "neura.data_mov"(%38) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %44 = neura.grant_predicate %42, %43 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %44 -> %24 {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 9 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %45 = "neura.data_mov"(%11) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 3 : i32}, {id = 27 : i32, resource = "link", time_step = 4 : i32}, {id = 32 : i32, resource = "register", time_step = 5 : i32}, {id = 32 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %46 = "neura.data_mov"(%38) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 4 : i32}, {id = 12 : i32, resource = "link", time_step = 5 : i32}, {id = 33 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %47 = neura.grant_predicate %45, %46 {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %47 -> %21 {mapping_locs = [{id = 24 : i32, resource = "link", time_step = 7 : i32}, {id = 30 : i32, resource = "link", time_step = 8 : i32}, {id = 41 : i32, resource = "link", time_step = 9 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %48 = "neura.data_mov"(%8) {mapping_locs = [{id = 7 : i32, resource = "link", time_step = 1 : i32}, {id = 24 : i32, resource = "register", time_step = 2 : i32}, {id = 24 : i32, resource = "register", time_step = 3 : i32}, {id = 24 : i32, resource = "register", time_step = 4 : i32}, {id = 24 : i32, resource = "register", time_step = 5 : i32}, {id = 24 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %49 = "neura.data_mov"(%38) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 4 : i32}, {id = 28 : i32, resource = "link", time_step = 5 : i32}, {id = 33 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %50 = neura.grant_predicate %48, %49 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %50 -> %18 {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 7 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %51 = "neura.data_mov"(%2) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 2 : i32}, {id = 21 : i32, resource = "register", time_step = 3 : i32}, {id = 21 : i32, resource = "register", time_step = 4 : i32}, {id = 21 : i32, resource = "register", time_step = 5 : i32}, {id = 21 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %52 = "neura.data_mov"(%38) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %53 = neura.grant_predicate %51, %52 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %53 -> %15 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 7 : i32}, {id = 4 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %54 = "neura.data_mov"(%38) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %55 = "neura.not"(%54) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %56 = "neura.data_mov"(%32) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 5 : i32}, {id = 36 : i32, resource = "register", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %57 = "neura.data_mov"(%55) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 5 : i32}, {id = 16 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %58 = neura.grant_predicate %56, %57 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: %59 = "neura.data_mov"(%58) {mapping_locs = [{id = 30 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: "neura.return"(%59) {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 3 : i32}]} : (!neura.data) -> () +// MAPPING-NEXT: } // INST: "name": "neura.fadd", // INST-NEXT: "operands": [ diff --git a/test/neura/ctrl/nested_branch.mlir b/test/neura/ctrl/nested_branch.mlir index 30984b67..5977d418 100644 --- a/test/neura/ctrl/nested_branch.mlir +++ b/test/neura/ctrl/nested_branch.mlir @@ -60,40 +60,38 @@ func.func @complex_test(%in: i64) -> f32 { // CHECK-NEXT: "neura.return"(%17) : (!neura.data) -> () // CHECK-NEXT: } -// CTRL2DATA: func.func @complex_test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { +// CTRL2DATA: func.func @complex_test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { // CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data // CTRL2DATA-NEXT: %1 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data // CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 1.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.grant_always"(%5) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%5) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 4.000000e+00 : f32}> : () -> !neura.data // CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.constant"() <{predicate = true, value = 4.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.icmp"(%0, %1) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %14 = neura.grant_predicate %9, %13 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %15 = neura.grant_predicate %11, %13 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.not"(%13) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = neura.grant_predicate %4, %16 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %18 = neura.grant_predicate %7, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.icmp"(%0, %1) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.grant_predicate %7, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %13 = neura.grant_predicate %9, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.not"(%11) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %3, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %5, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %17 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %18 = "neura.phi"(%17, %16) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %19 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %20 = "neura.phi"(%19, %18) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %21 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %22 = "neura.phi"(%21, %17) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %23 = "neura.fcmp"(%22, %20) <{cmpType = "olt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %24 = neura.grant_predicate %22, %23 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %25 = neura.grant_predicate %4, %23 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %26 = neura.grant_predicate %7, %23 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %27 = "neura.not"(%23) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %28 = neura.grant_predicate %22, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %29 = "neura.fadd"(%24, %25) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %29 -> %21 : !neura.data !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %19 : !neura.data !neura.data -// CTRL2DATA-NEXT: %30 = "neura.fmul"(%14, %15) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %31 = "neura.phi"(%28, %30) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: "neura.return"(%31) : (!neura.data) -> () +// CTRL2DATA-NEXT: %20 = "neura.phi"(%19, %15) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.fcmp"(%20, %18) <{cmpType = "olt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.grant_predicate %20, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %3, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %5, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = "neura.not"(%21) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %20, %25 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %27 = "neura.fadd"(%22, %23) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %27 -> %19 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %24 -> %17 : !neura.data !neura.data +// CTRL2DATA-NEXT: %28 = "neura.fmul"(%12, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.phi"(%26, %28) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: "neura.return"(%29) : (!neura.data) -> () // CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/neura/for_loop/test.mlir b/test/neura/for_loop/test.mlir index 531e113e..618b887d 100644 --- a/test/neura/for_loop/test.mlir +++ b/test/neura/for_loop/test.mlir @@ -55,172 +55,157 @@ // CHECK-NEXT: } // Verifies the neura ops are generated. And fusion happens. -// CHECK-FUSED: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { -// CHECK-FUSED: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %2 = "neura.grant_once"(%0) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %3 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %4 = "neura.grant_always"(%3) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %5 = "neura.grant_once"(%3) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %6 = "neura.constant"() <{predicate = true, value = "%arg2"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %8 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %9 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %11 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %12 = "neura.grant_always"(%11) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %13 = "neura.grant_once"(%11) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %14 = "neura.constant"() <{predicate = true, value = 32 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %15 = "neura.grant_always"(%14) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %16 = "neura.grant_once"(%14) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %17 = "neura.load"(%3) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %18 = "neura.grant_once"(%17) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %19 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %20 = "neura.phi"(%19, %16) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %21 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %22 = "neura.phi"(%21, %13) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %23 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %24 = "neura.phi"(%23, %5) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %25 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %26 = "neura.phi"(%25, %8) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %27 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %28 = "neura.phi"(%27, %2) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %29 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %30 = "neura.phi"(%29, %18) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %31 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %32 = "neura.phi"(%31, %10) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %33 = "neura.gep"(%28, %32) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %34 = "neura.load"(%33) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %35 = "neura.gep"(%26, %32) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %36 = "neura.load"(%35) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %37 = "neura.fmul_fadd"(%34, %36, %30) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: "neura.store"(%37, %24) : (!neura.data, !neura.data) -> () -// CHECK-FUSED-NEXT: %38 = "neura.add"(%32, %22) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %39 = "neura.icmp"(%38, %20) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %40 = "neura.not"(%39) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %41 = neura.grant_predicate %38, %40 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %41 -> %31 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %42 = neura.grant_predicate %37, %40 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %42 -> %29 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %43 = neura.grant_predicate %2, %40 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %43 -> %27 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %44 = neura.grant_predicate %8, %40 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %44 -> %25 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %45 = neura.grant_predicate %5, %40 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %45 -> %23 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %46 = neura.grant_predicate %13, %40 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %46 -> %21 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %47 = neura.grant_predicate %16, %40 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %47 -> %19 : !neura.data !neura.data +// CHECK-FUSED: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { +// CHECK-FUSED-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data +// CHECK-FUSED-NEXT: %1 = "neura.grant_once"(%0) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data +// CHECK-FUSED-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %4 = "neura.constant"() <{predicate = true, value = "%arg2"}> : () -> !neura.data +// CHECK-FUSED-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %6 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CHECK-FUSED-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %8 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CHECK-FUSED-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %10 = "neura.constant"() <{predicate = true, value = 32 : i64}> : () -> !neura.data +// CHECK-FUSED-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %12 = "neura.load"(%2) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %14 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %15 = "neura.phi"(%14, %11) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %16 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %17 = "neura.phi"(%16, %9) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %18 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %19 = "neura.phi"(%18, %3) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %20 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %21 = "neura.phi"(%20, %5) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %22 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %23 = "neura.phi"(%22, %1) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %24 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %25 = "neura.phi"(%24, %13) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %26 = neura.reserve : !neura.data +// CHECK-FUSED-NEXT: %27 = "neura.phi"(%26, %7) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %28 = "neura.gep"(%23, %27) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %29 = "neura.load"(%28) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %30 = "neura.gep"(%21, %27) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %31 = "neura.load"(%30) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %32 = "neura.fmul_fadd"(%29, %31, %25) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: "neura.store"(%32, %19) : (!neura.data, !neura.data) -> () +// CHECK-FUSED-NEXT: %33 = "neura.add"(%27, %17) : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %34 = "neura.icmp"(%33, %15) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %35 = "neura.not"(%34) : (!neura.data) -> !neura.data +// CHECK-FUSED-NEXT: %36 = neura.grant_predicate %33, %35 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %36 -> %26 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %37 = neura.grant_predicate %32, %35 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %37 -> %24 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %38 = neura.grant_predicate %1, %35 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %38 -> %22 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %39 = neura.grant_predicate %5, %35 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %39 -> %20 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %40 = neura.grant_predicate %3, %35 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %40 -> %18 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %41 = neura.grant_predicate %9, %35 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %41 -> %16 : !neura.data !neura.data +// CHECK-FUSED-NEXT: %42 = neura.grant_predicate %11, %35 : !neura.data, !neura.data -> !neura.data +// CHECK-FUSED-NEXT: neura.ctrl_mov %42 -> %14 : !neura.data !neura.data // CHECK-FUSED-NEXT: "neura.return"() : () -> () // CHECK-FUSED-NEXT: } -// CHECK-MOV: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { -// CHECK-MOV-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data -// CHECK-MOV-NEXT: %1 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %2 = "neura.grant_always"(%1) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %3 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %4 = "neura.grant_once"(%3) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %5 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data -// CHECK-MOV-NEXT: %6 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %8 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %10 = "neura.constant"() <{predicate = true, value = "%arg2"}> : () -> !neura.data -// CHECK-MOV-NEXT: %11 = "neura.data_mov"(%10) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %12 = "neura.grant_always"(%11) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %13 = "neura.data_mov"(%10) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %14 = "neura.grant_once"(%13) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %15 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %16 = "neura.data_mov"(%15) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %17 = "neura.grant_once"(%16) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %18 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %19 = "neura.data_mov"(%18) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %20 = "neura.grant_always"(%19) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %21 = "neura.data_mov"(%18) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %22 = "neura.grant_once"(%21) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %23 = "neura.constant"() <{predicate = true, value = 32 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %24 = "neura.data_mov"(%23) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %25 = "neura.grant_always"(%24) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %26 = "neura.data_mov"(%23) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %27 = "neura.grant_once"(%26) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %28 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %29 = "neura.load"(%28) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %30 = "neura.data_mov"(%29) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %31 = "neura.grant_once"(%30) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %32 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %33 = "neura.data_mov"(%27) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %34 = "neura.phi"(%32, %33) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %35 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %36 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %37 = "neura.phi"(%35, %36) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %38 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %39 = "neura.data_mov"(%9) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %40 = "neura.phi"(%38, %39) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %41 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %42 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %43 = "neura.phi"(%41, %42) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %44 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %45 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %46 = "neura.phi"(%44, %45) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %47 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %48 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %49 = "neura.phi"(%47, %48) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %50 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %51 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %52 = "neura.phi"(%50, %51) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %53 = "neura.data_mov"(%46) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %54 = "neura.data_mov"(%52) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %55 = "neura.gep"(%53, %54) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %56 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %57 = "neura.load"(%56) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %58 = "neura.data_mov"(%43) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %59 = "neura.data_mov"(%52) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %60 = "neura.gep"(%58, %59) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %61 = "neura.data_mov"(%60) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %62 = "neura.load"(%61) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %63 = "neura.data_mov"(%57) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %64 = "neura.data_mov"(%62) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %65 = "neura.data_mov"(%49) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %66 = "neura.fmul_fadd"(%63, %64, %65) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %67 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %68 = "neura.data_mov"(%40) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: "neura.store"(%67, %68) : (!neura.data, !neura.data) -> () -// CHECK-MOV-NEXT: %69 = "neura.data_mov"(%52) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %70 = "neura.data_mov"(%37) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %71 = "neura.add"(%69, %70) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %72 = "neura.data_mov"(%71) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %73 = "neura.data_mov"(%34) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %74 = "neura.icmp"(%72, %73) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %75 = "neura.data_mov"(%74) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %76 = "neura.not"(%75) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %77 = "neura.data_mov"(%71) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %78 = "neura.data_mov"(%76) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %79 = neura.grant_predicate %77, %78 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %79 -> %50 : !neura.data !neura.data -// CHECK-MOV-NEXT: %80 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %81 = "neura.data_mov"(%76) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %82 = neura.grant_predicate %80, %81 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %82 -> %47 : !neura.data !neura.data -// CHECK-MOV-NEXT: %83 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %84 = "neura.data_mov"(%76) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %85 = neura.grant_predicate %83, %84 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %85 -> %44 : !neura.data !neura.data -// CHECK-MOV-NEXT: %86 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %87 = "neura.data_mov"(%76) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %88 = neura.grant_predicate %86, %87 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %88 -> %41 : !neura.data !neura.data -// CHECK-MOV-NEXT: %89 = "neura.data_mov"(%9) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %90 = "neura.data_mov"(%76) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %91 = neura.grant_predicate %89, %90 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %91 -> %38 : !neura.data !neura.data -// CHECK-MOV-NEXT: %92 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %93 = "neura.data_mov"(%76) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %94 = neura.grant_predicate %92, %93 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %94 -> %35 : !neura.data !neura.data -// CHECK-MOV-NEXT: %95 = "neura.data_mov"(%27) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %96 = "neura.data_mov"(%76) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %97 = neura.grant_predicate %95, %96 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %97 -> %32 : !neura.data !neura.data -// CHECK-MOV-NEXT: "neura.return"() : () -> () -// CHECK-MOV-NEXT: } \ No newline at end of file +// CHECK-MOV: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { +// CHECK-MOV-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data +// CHECK-MOV-NEXT: %1 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %2 = "neura.grant_once"(%1) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %3 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data +// CHECK-MOV-NEXT: %4 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %6 = "neura.constant"() <{predicate = true, value = "%arg2"}> : () -> !neura.data +// CHECK-MOV-NEXT: %7 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %9 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CHECK-MOV-NEXT: %10 = "neura.data_mov"(%9) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %12 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CHECK-MOV-NEXT: %13 = "neura.data_mov"(%12) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %14 = "neura.grant_once"(%13) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %15 = "neura.constant"() <{predicate = true, value = 32 : i64}> : () -> !neura.data +// CHECK-MOV-NEXT: %16 = "neura.data_mov"(%15) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %17 = "neura.grant_once"(%16) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %18 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %19 = "neura.load"(%18) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %20 = "neura.data_mov"(%19) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %21 = "neura.grant_once"(%20) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %22 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %23 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %24 = "neura.phi"(%22, %23) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %25 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %26 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %27 = "neura.phi"(%25, %26) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %28 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %29 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %30 = "neura.phi"(%28, %29) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %31 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %32 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %33 = "neura.phi"(%31, %32) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %34 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %35 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %36 = "neura.phi"(%34, %35) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %37 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %38 = "neura.data_mov"(%21) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %39 = "neura.phi"(%37, %38) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %40 = neura.reserve : !neura.data +// CHECK-MOV-NEXT: %41 = "neura.data_mov"(%11) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %42 = "neura.phi"(%40, %41) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %43 = "neura.data_mov"(%36) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %44 = "neura.data_mov"(%42) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %45 = "neura.gep"(%43, %44) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %46 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %47 = "neura.load"(%46) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %48 = "neura.data_mov"(%33) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %49 = "neura.data_mov"(%42) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %50 = "neura.gep"(%48, %49) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %51 = "neura.data_mov"(%50) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %52 = "neura.load"(%51) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %53 = "neura.data_mov"(%47) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %54 = "neura.data_mov"(%52) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %55 = "neura.data_mov"(%39) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %56 = "neura.fmul_fadd"(%53, %54, %55) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %57 = "neura.data_mov"(%56) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %58 = "neura.data_mov"(%30) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: "neura.store"(%57, %58) : (!neura.data, !neura.data) -> () +// CHECK-MOV-NEXT: %59 = "neura.data_mov"(%42) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %60 = "neura.data_mov"(%27) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %61 = "neura.add"(%59, %60) : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %62 = "neura.data_mov"(%61) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %63 = "neura.data_mov"(%24) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %64 = "neura.icmp"(%62, %63) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// CHECK-MOV-NEXT: %65 = "neura.data_mov"(%64) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %66 = "neura.not"(%65) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %67 = "neura.data_mov"(%61) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %68 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %69 = neura.grant_predicate %67, %68 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %69 -> %40 : !neura.data !neura.data +// CHECK-MOV-NEXT: %70 = "neura.data_mov"(%56) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %71 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %72 = neura.grant_predicate %70, %71 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %72 -> %37 : !neura.data !neura.data +// CHECK-MOV-NEXT: %73 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %74 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %75 = neura.grant_predicate %73, %74 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %75 -> %34 : !neura.data !neura.data +// CHECK-MOV-NEXT: %76 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %77 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %78 = neura.grant_predicate %76, %77 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %78 -> %31 : !neura.data !neura.data +// CHECK-MOV-NEXT: %79 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %80 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %81 = neura.grant_predicate %79, %80 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %81 -> %28 : !neura.data !neura.data +// CHECK-MOV-NEXT: %82 = "neura.data_mov"(%14) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %83 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %84 = neura.grant_predicate %82, %83 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %84 -> %25 : !neura.data !neura.data +// CHECK-MOV-NEXT: %85 = "neura.data_mov"(%17) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %86 = "neura.data_mov"(%66) : (!neura.data) -> !neura.data +// CHECK-MOV-NEXT: %87 = neura.grant_predicate %85, %86 : !neura.data, !neura.data -> !neura.data +// CHECK-MOV-NEXT: neura.ctrl_mov %87 -> %22 : !neura.data !neura.data +// CHECK-MOV-NEXT: "neura.return"() : () -> () +// CHECK-MOV-NEXT: } \ No newline at end of file