diff --git a/include/NeuraDialect/NeuraOps.td b/include/NeuraDialect/NeuraOps.td index 227d4382..3c4902c7 100644 --- a/include/NeuraDialect/NeuraOps.td +++ b/include/NeuraDialect/NeuraOps.td @@ -89,8 +89,17 @@ def Neura_FDivOp : Op { // Defines a bitwise OR operation. def Neura_OrOp : Op { let summary = "Bitwise OR operation"; - let arguments = (ins AnySignlessInteger:$lhs, AnySignlessInteger:$rhs, Optional:$predicate); - let results = (outs AnySignlessInteger:$result); + let arguments = (ins AnyType:$lhs, AnyType:$rhs, Optional:$predicate); + let results = (outs AnyType:$result); + // let assemblyFormat = "$lhs `,` $rhs `,` $predicate attr-dict `:` type($result)"; + let traits = [SameOperandsAndResultElementType]; +} + +// Defines a bitwise AND operation. +def Neura_AndOp : Op { + let summary = "Bitwise AND operation"; + let arguments = (ins AnyType:$lhs, AnyType:$rhs, Optional:$predicate); + let results = (outs AnyType:$result); // let assemblyFormat = "$lhs `,` $rhs `,` $predicate attr-dict `:` type($result)"; let traits = [SameOperandsAndResultElementType]; } diff --git a/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp b/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp index 43762599..0a9ca678 100644 --- a/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp +++ b/lib/NeuraDialect/Transforms/MapToAcceleratorPass.cpp @@ -179,7 +179,7 @@ struct MapToAcceleratorPass // func->setAttr("ResMII", res_mii_attr); const int possibleMinII = std::max(rec_mii, res_mii); - constexpr int maxII = 10; + constexpr int maxII = 15; std::vector topologically_sorted_ops = getTopologicallySortedOps(func); if (topologically_sorted_ops.empty()) { diff --git a/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp b/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp index 3da40737..66b18ea7 100644 --- a/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp +++ b/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp @@ -14,11 +14,13 @@ #include "mlir/IR/Value.h" #include "mlir/Pass/Pass.h" #include "mlir/Support/LLVM.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Error.h" #include "llvm/Support/raw_ostream.h" +#include #include #include @@ -187,6 +189,12 @@ void assertLiveOutValuesDominatedByBlockArgs(Region ®ion) { // Builds control flow info for the given function. void buildControlFlowInfo(Region ®ion, ControlFlowInfo &ctrl_info, DominanceInfo &dom_info) { + ctrl_info.all_edges.clear(); + ctrl_info.incoming_edges.clear(); + ctrl_info.outgoing_edges.clear(); + ctrl_info.back_edges.clear(); + ctrl_info.forward_edges.clear(); + ctrl_info.blocks_with_back_edges.clear(); for (Block &block : region) { Operation *terminator = block.getTerminator(); @@ -271,7 +279,7 @@ void buildControlFlowInfo(Region ®ion, ControlFlowInfo &ctrl_info, } } -Value getPrecessedCondition(Value condition, bool is_not_condition, +Value getProcessedCondition(Value condition, bool is_not_condition, llvm::MapVector &condition_cache, OpBuilder &builder) { if (!is_not_condition) { @@ -291,6 +299,217 @@ Value getPrecessedCondition(Value condition, bool is_not_condition, return not_condition; } +Value createGrantPredicateOrSkip(OpBuilder &builder, Location loc, Value value, + Value predicate) { + if (value == predicate) { + return value; + } + + return builder.create(loc, value.getType(), value, + predicate); +} + +// Calculates the block execution conditions for each block in the region. +void calculateBlockExecuteConditions( + Region ®ion, ControlFlowInfo &ctrl_info, + llvm::MapVector &condition_cache, OpBuilder &builder) { + // Tracks the execution condition for each block. + llvm::MapVector block_execution_conditions; + + // Tracks the value need to be grant_predicated in each block. + llvm::MapVector value_to_predicated_value; + + // Sorts the blocks in topological order based on DFS. + SmallVector topological_order_blocks; + DenseSet visited; + std::function dfs = [&](Block *block) { + if (visited.count(block)) { + return; + } + visited.insert(block); + for (auto *edge : ctrl_info.outgoing_edges[block]) { + if (edge->is_back_edge) { + continue; + } + dfs(edge->target); + } + + topological_order_blocks.push_back(block); + }; + + Block *entry_block = ®ion.front(); + dfs(entry_block); + std::reverse(topological_order_blocks.begin(), + topological_order_blocks.end()); + + // Initializes the entry block condition to nullptr (always true). + block_execution_conditions[entry_block] = nullptr; + + for (Block *block : topological_order_blocks) { + if (block == entry_block) { + continue; + } + + Value block_condition = nullptr; + + // Collects all non-backward incoming edges. + SmallVector incoming_non_back_edges; + for (ControlFlowInfo::Edge *edge : ctrl_info.incoming_edges[block]) { + if (!edge->is_back_edge) + incoming_non_back_edges.push_back(edge); + } + + // Calculates the block condition by OR all incoming non-back edges. + for (ControlFlowInfo::Edge *edge : incoming_non_back_edges) { + Value edge_condition = nullptr; + + // Gets the execute condition of the predecessor block. + Value pred_condition = block_execution_conditions[edge->source]; + + // Gets the edge condition. + if (edge->condition) { + Value processed_edge_condition = getProcessedCondition( + edge->condition, edge->is_not_condition, condition_cache, builder); + + // If the predecessor condition is not null, combine it with the edge + // condition. + if (pred_condition) { + builder.setInsertionPoint(edge->source->getTerminator()); + edge_condition = builder.create( + edge->condition.getLoc(), edge->condition.getType(), + pred_condition, processed_edge_condition, nullptr); + } else { + // If the predecessor condition is null, use the edge condition. + edge_condition = processed_edge_condition; + } + } else { + // If the edge has no condition, use the predecessor condition. + edge_condition = pred_condition; + } + + // If the block has multiple incoming edges, we need to OR them. + // Adds this edge condition to the block condition (OR combination). + if (edge_condition) { + if (!block_condition) { + block_condition = edge_condition; + } else { + builder.setInsertionPoint(edge->source->getTerminator()); + block_condition = builder.create( + edge_condition.getLoc(), edge_condition.getType(), + block_condition, edge_condition, nullptr); + } + } + } + block_execution_conditions[block] = block_condition; + } + + // // Prints debug information + // llvm::errs() << "[ctrl2data] Block execution conditions (initial):\n"; + // for (auto &pair : block_execution_conditions) { + // llvm::errs() << " Block: " << *pair.first; + // if (pair.second) + // llvm::errs() << " Condition: " << pair.second << "\n"; + // else + // llvm::errs() << " Condition: \n"; + // } + + // We need to grant_predicate all the live-in values in each block based on + // the block execution condition. + for (Block &block : region) { + // If the block is the entry block, we skip it. + if (&block == entry_block) { + continue; + } + + Value block_condition = block_execution_conditions[&block]; + + // If the block condition is null, it means the block is always executed. + if (!block_condition) { + continue; + } + + // Collects all live-in values that need to be predicated. + SetVector live_in_values; + for (Operation &op : block) { + // If the operation is a control flow operation, we skip it. + // Because they belong to Type 1 & 3 edges, we will handle them later. + if (isa(&op)) { + continue; + } + + // If the live-in value is a block condition (e.g., neura.and(%cond1, + // %cond2)), we skip it. Because they are already handled by the block + // execution. + bool is_block_condition = false; + for (auto &[block, condition] : block_execution_conditions) { + if (condition && condition.getDefiningOp() && + condition.getDefiningOp() == &op) { + llvm::errs() << "[ctrl2data] Checking block condition: " << condition + << "\n"; + is_block_condition = true; + break; + } + } + if (is_block_condition) { + continue; + } + + for (Value operand : op.getOperands()) { + if (operand.getDefiningOp() && + operand.getDefiningOp()->getBlock() != &block && + isa(operand.getType()) && + !isa(operand.getDefiningOp())) { + live_in_values.insert(operand); + } + } + } + + // Grants predicate for each live-in value. + for (Value live_in_value : live_in_values) { + // Find the earliest use point. + Operation *earliest_use = nullptr; + for (Operation &op : block) { + for (Value operand : op.getOperands()) { + if (operand == live_in_value) { + earliest_use = &op; + break; + } + } + if (earliest_use) + break; + } + + // Sets the insertion point to the earliest use or to the start of the + // block. + if (earliest_use) { + builder.setInsertionPoint(earliest_use); + } else { + builder.setInsertionPointToStart(&block); + } + + // Grants predicate for live-in value. + Value predicated_value = createGrantPredicateOrSkip( + builder, live_in_value.getLoc(), live_in_value, block_condition); + + // Records replacement. + value_to_predicated_value[live_in_value] = predicated_value; + + // Replaces all uses of the live-in value in the block with the predicated + // value. + for (OpOperand &use : + llvm::make_early_inc_range(live_in_value.getUses())) { + if (use.getOwner()->getBlock() == &block && + use.getOwner() != predicated_value.getDefiningOp()) { + use.set(predicated_value); + } + } + } + } + + // llvm::outs() << "[ctrl2data] Current function:\n"; + // llvm::outs() << *region.getParentOp() << "\n"; +} + void createReserveAndPhiOps( Region ®ion, ControlFlowInfo &ctrl_info, llvm::MapVector &arg_to_reserve, @@ -299,31 +518,48 @@ void createReserveAndPhiOps( DominanceInfo dom_info(region.getParentOp()); // ================================================ - // Step 1: Categorizes edges into six types. + // Step 0: Categorizes edges into six types. // ================================================ - // Type 1: Backward cond_br edges with arguments. + // Type 1: Backward cond_br edges with values. // Type 2: Backward br edges with values. // Type 3: Forward cond_br edges with values. // Type 4: Forward br edges with values. // Type 5: Forward cond_br edges without values. // Type 6: Forward br edges without values. - // For Backward edges without values, they can be transformed into type 1 or 2 + // For Backward edges without values, they can be transformed into type 1 + // or 2. + // For Type 5 and 6, since we already have the canonicalize-live-in + // pass and grant all the live-ins based on the block execution + // conditions, we can skip them. + + // Summary: We only need to handle Type 1, 2, 3, and 4 edges. + + llvm::MapVector condition_cache; + + // ================================================ + // Step 1: Calculates block execution conditions. + // ================================================ + // This step handles the Type 5 and 6 edges. + calculateBlockExecuteConditions(region, ctrl_info, condition_cache, builder); + + // ================================================= + // Step 2: Updates the control flow info with the + // calculated block execution conditions. + // ================================================= + buildControlFlowInfo(region, ctrl_info, dom_info); + + // ================================================= + // Step 3: Preparations for Type 1, 2, 3, and 4 edges. + // ================================================= // Uses llvm::MapVector instead of DenseMap to maintain insertion order. llvm::MapVector> backward_value_edges; llvm::MapVector> forward_value_edges; - llvm::MapVector> - block_conditional_edges; - - llvm::MapVector condition_cache; llvm::MapVector> arg_to_phi_operands; - // Tracks the mapping of live-out values. - llvm::MapVector value_to_predicated_value; - for (auto &edge : ctrl_info.all_edges) { Block *target = edge->target; @@ -341,7 +577,6 @@ void createReserveAndPhiOps( } // Type 3 & 4: Forward cond_br/br edges with values. else if (!edge->is_back_edge && !edge->passed_values.empty()) { - ; if (edge->passed_values.size() != target->getNumArguments()) { llvm::errs() << "[ctrl2data] Error: Number of passed values does not match " @@ -352,113 +587,11 @@ void createReserveAndPhiOps( forward_value_edges[arg].push_back(edge.get()); } } - // Type 5 & 6: Forward cond_br/br edges without values. - else if (!edge->is_back_edge && edge->passed_values.empty()) { - if (edge->condition) { - // Only Type 5 needs to be processed here. - // If the edge has a condition, store it for later use. - block_conditional_edges[target].push_back(edge.get()); - } - } - } - - // ================================================ - // Step 2: Handles Forward cond_br edges without values. - // ================================================ - // Handles Type 5 edges. - for (auto &condition_pair : block_conditional_edges) { - Block *target = condition_pair.first; - auto &edges = condition_pair.second; - - if (edges.empty()) { - continue; - } - - // Collects all conditions for the target block. - SmallVector conditions; - for (ControlFlowInfo::Edge *edge : edges) { - Value condition = getPrecessedCondition( - edge->condition, edge->is_not_condition, condition_cache, builder); - conditions.push_back(condition); - } - - // Unsupported case: multiple conditions for a single block. - // TODO: Adds support if needed. - if (conditions.size() > 1) { - llvm::errs() << "[ctrl2data] Unsupported case: multiple conditions for a " - "single block: " - << *target << "\n"; - assert(false); - } - - if (target->getArguments().empty()) { - // Grants predicate for all the live-in values in the target block. - // Uses SetVector instead of DenseSet to maintain insertion order. - SetVector live_in_values; - for (Operation &op : target->getOperations()) { - for (Value operand : op.getOperands()) { - if (operand.getDefiningOp() && - operand.getDefiningOp()->getBlock() != target && - !isa(operand.getDefiningOp())) { - live_in_values.insert(operand); - } - } - } - - // Applies grant_predicate for each live-in value. - for (Value live_in_value : live_in_values) { - // Finds the earliest use of the live-in value. - Operation *earliest_use = nullptr; - for (Operation &op : target->getOperations()) { - for (Value operand : op.getOperands()) { - if (operand == live_in_value) { - earliest_use = &op; - break; - } - } - if (earliest_use) { - break; - } - } - - if (earliest_use) { - builder.setInsertionPoint(earliest_use); - } else { - builder.setInsertionPointToStart(target); - } - - // Creates predicated version of the live-in value. - Value predicated_value = builder.create( - live_in_value.getLoc(), live_in_value.getType(), live_in_value, - conditions[0]); - - value_to_predicated_value[live_in_value] = predicated_value; - - // Replace uses of the live-in value within this block only. - for (OpOperand &use : - llvm::make_early_inc_range(live_in_value.getUses())) { - if (use.getOwner()->getBlock() == target && - use.getOwner() != predicated_value.getDefiningOp()) { - use.set(predicated_value); - } - } - } - } - } - - // Updates the passed values in edges with predicated values. - for (auto &edge_ptr : ctrl_info.all_edges) { - ControlFlowInfo::Edge *edge = edge_ptr.get(); - for (size_t i = 0; i < edge->passed_values.size(); ++i) { - Value val = edge->passed_values[i]; - if (value_to_predicated_value.count(val)) { - edge->passed_values[i] = value_to_predicated_value[val]; - } - } } // ================================================ - // Step 3: Creates reserve and ctrl_mov operations for needed blockarguments. + // Step 4: Creates reserve and ctrl_mov operations for needed + // blockarguments. // ================================================ // Handles Type 1 & 2 edges. for (auto &backward_pair : backward_value_edges) { @@ -478,7 +611,7 @@ void createReserveAndPhiOps( Value predicated_val = val; if (edge->condition) { - Value processed_condition = getPrecessedCondition( + Value processed_condition = getProcessedCondition( edge->condition, edge->is_not_condition, condition_cache, builder); predicated_val = builder.create( edge->condition.getLoc(), val.getType(), predicated_val, @@ -492,7 +625,7 @@ void createReserveAndPhiOps( } // ================================================ - // Step 4: Prepares for creating phi operations. + // Step 5: Prepares for creating phi operations. // ================================================ // Handles Type 3 & 4 edges. @@ -506,7 +639,7 @@ void createReserveAndPhiOps( Value predicated_val = val; if (edge->condition) { builder.setInsertionPoint(edge->source->getTerminator()); - Value processed_condition = getPrecessedCondition( + Value processed_condition = getProcessedCondition( edge->condition, edge->is_not_condition, condition_cache, builder); predicated_val = builder.create( @@ -519,7 +652,7 @@ void createReserveAndPhiOps( } // ================================================ - // Step 5: Creates phi operations for each block argument. + // Step 6: Creates phi operations for each block argument. // ================================================ for (auto &arg_to_phi_pair : arg_to_phi_operands) { BlockArgument arg = arg_to_phi_pair.first; @@ -559,6 +692,52 @@ void createReserveAndPhiOps( } } +// Since we may insert some block execution conditions and we do not use them at +// all, we need to remove them. +void removeUnusedOperations(Block *block) { + llvm::errs() << "[ctrl2data] Removing unused operations\n"; + + // We will iterate through the block and remove operations that are not used + // anywhere in the block or outside of it. + // Because removing one operation may lead to another operation + // becoming unused, we will repeat this process until no more operations can + // be removed. + bool changed = true; + int iterations = 0; + int removed = 0; + const int k_max_iterations = 10; + + while (changed && iterations < k_max_iterations) { + changed = false; + iterations++; + for (Operation &op : llvm::make_early_inc_range(*block)) { + // Skip operations that are naturally do not have users. + if (isa(op) || isa(op) || + isa(op) || isa(op)) { + continue; + } + + bool all_results_unused = true; + for (Value result : op.getResults()) { + if (!result.use_empty()) { + all_results_unused = false; + break; + } + } + + if (all_results_unused) { + llvm::errs() << "[ctrl2data] Removing unused op: " << op << "\n"; + op.erase(); + changed = true; + removed++; + } + } + } + + llvm::errs() << "[ctrl2data] Removed " << removed << " unused operations in " + << iterations << " iterations\n"; +} + // Transforms control flow into data flow. void transformControlFlowToDataFlow(Region ®ion, ControlFlowInfo &ctrl_info, DominanceInfo &dom_info, @@ -618,6 +797,8 @@ void transformControlFlowToDataFlow(Region ®ion, ControlFlowInfo &ctrl_info, for (Block *block : blocks_to_flatten) { block->erase(); } + + removeUnusedOperations(entryBlock); } namespace { diff --git a/test/affine2neura/bert/bert_node1/bert_node1.mlir b/test/affine2neura/bert/bert_node1/bert_node1.mlir index 7de355ed..dd2e0a2b 100644 --- a/test/affine2neura/bert/bert_node1/bert_node1.mlir +++ b/test/affine2neura/bert/bert_node1/bert_node1.mlir @@ -62,7 +62,7 @@ module attributes {} { // CHECK-NEXT: } -// CTRL2DATA: func.func @_Z10bert_node1PA1_A1_A1_A1_A128_bPA1_A128_S1_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura"} { +// 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 = "%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> @@ -78,29 +78,29 @@ module attributes {} { // 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: %15 = neura.grant_predicate %9, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %7, %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: %18 = "neura.phi"(%17, %16) : (!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: %20 = "neura.phi"(%19, %15) : (!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: %22 = "neura.not"(%21) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %1, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %9, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %20, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %3, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %13, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %5, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %7, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %13, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %5, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %7, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.load_indexed %23[%24, %24, %24, %24, %24, %25 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %33 to %26[%24, %24, %27, %24, %24, %25 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %34 = "neura.add"(%25, %28) : (!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: neura.ctrl_mov %29 -> %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 diff --git a/test/affine2neura/bert/bert_node28/bert_node28.mlir b/test/affine2neura/bert/bert_node28/bert_node28.mlir index 312bf9e2..78ce5a6a 100644 --- a/test/affine2neura/bert/bert_node28/bert_node28.mlir +++ b/test/affine2neura/bert/bert_node28/bert_node28.mlir @@ -82,7 +82,7 @@ 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: 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> @@ -102,50 +102,52 @@ module attributes {} { // 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: %19 = neura.grant_predicate %13, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %7, %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: %22 = "neura.phi"(%21, %20) : (!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: %24 = "neura.phi"(%23, %19) : (!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: %26 = "neura.not"(%25) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %27 = "neura.and"(%18, %25) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %13, %25 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %17, %26 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %9, %26 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %11, %26 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %7, %27 : !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: %34 = "neura.phi"(%33, %32) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %35 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %36 = "neura.phi"(%35, %28) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %37 = "neura.icmp"(%36, %34) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %38 = "neura.not"(%37) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.grant_predicate %1, %37 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %40 = neura.grant_predicate %13, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %41 = neura.grant_predicate %17, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %42 = neura.grant_predicate %36, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %43 = neura.grant_predicate %3, %37 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %44 = neura.grant_predicate %24, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %45 = neura.grant_predicate %5, %37 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %46 = neura.grant_predicate %9, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %47 = neura.grant_predicate %7, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %48 = neura.grant_predicate %24, %38 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %49 = neura.grant_predicate %9, %38 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %50 = neura.grant_predicate %7, %38 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %51 = neura.load_indexed %39[%40, %41, %42 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %52 = neura.load_indexed %43[%40, %42, %44 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %53 = neura.load_indexed %45[%40, %41, %44 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %54 = "neura.fmul"(%51, %52) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %55 = "neura.fadd"(%53, %54) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %55 to %45[%40, %41, %44 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %56 = "neura.add"(%42, %46) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %56 -> %35 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %47 -> %33 : !neura.data !neura.data +// CTRL2DATA-NEXT: %57 = "neura.add"(%48, %49) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %57 -> %23 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %50 -> %21 : !neura.data !neura.data +// CTRL2DATA-NEXT: %58 = "neura.add"(%29, %30) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %58 -> %16 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %31 -> %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 5ff7a663..50e40ac9 100644 --- a/test/controflow_fuse/complex_nested/complex_nested.mlir +++ b/test/controflow_fuse/complex_nested/complex_nested.mlir @@ -175,173 +175,187 @@ 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-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 = 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, %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, %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 +// 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_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.grant_predicate %17, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %7, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %26 = "neura.phi"(%25, %24) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %27 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %28 = "neura.phi"(%27, %23) : (!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.not"(%29) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %31 = "neura.and"(%22, %30) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %32 = "neura.and"(%22, %29) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.grant_predicate %15, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %34 = neura.grant_predicate %3, %29 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %35 = neura.grant_predicate %21, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %36 = neura.grant_predicate %28, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %37 = neura.grant_predicate %17, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %38 = neura.grant_predicate %17, %30 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.grant_predicate %15, %30 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %33 to %34[%35, %36 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %40 = neura.grant_predicate %7, %32 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %41 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %42 = "neura.phi"(%41, %40) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %43 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %44 = "neura.phi"(%43, %37) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %45 = "neura.icmp"(%44, %42) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %46 = "neura.not"(%45) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %47 = neura.grant_predicate %1, %45 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %48 = neura.grant_predicate %21, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %49 = neura.grant_predicate %28, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %50 = neura.grant_predicate %44, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %51 = neura.grant_predicate %3, %45 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %52 = neura.grant_predicate %5, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %53 = neura.grant_predicate %7, %45 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %54 = neura.grant_predicate %28, %46 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %55 = neura.grant_predicate %5, %46 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %56 = neura.grant_predicate %7, %46 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %57 = neura.load_indexed %47[%48, %49, %50 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %58 = neura.load_indexed %51[%48, %49 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %59 = "neura.add"(%58, %57) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %59 to %51[%48, %49 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %60 = "neura.add"(%50, %52) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %60 -> %43 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %53 -> %41 : !neura.data !neura.data +// CTRL2DATA-NEXT: %61 = "neura.add"(%54, %55) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %61 -> %27 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %56 -> %25 : !neura.data !neura.data +// CTRL2DATA-NEXT: %62 = neura.grant_predicate %7, %31 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %63 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %64 = "neura.phi"(%63, %62) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %65 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %66 = "neura.phi"(%65, %39) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %67 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %68 = "neura.phi"(%67, %38) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %69 = "neura.icmp"(%68, %64) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %70 = "neura.not"(%69) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %71 = "neura.and"(%31, %70) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %72 = neura.grant_predicate %3, %69 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %73 = neura.grant_predicate %21, %69 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %74 = neura.grant_predicate %68, %69 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %75 = neura.grant_predicate %66, %69 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %76 = neura.grant_predicate %5, %69 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %77 = neura.grant_predicate %7, %69 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %78 = neura.grant_predicate %66, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %79 = neura.grant_predicate %13, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %80 = neura.grant_predicate %17, %70 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %81 = neura.load_indexed %72[%73, %74 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %82 = "neura.add"(%75, %81) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %83 = "neura.add"(%74, %76) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %83 -> %67 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %82 -> %65 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %77 -> %63 : !neura.data !neura.data +// CTRL2DATA-NEXT: %84 = "neura.div"(%78, %79) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %85 = neura.grant_predicate %7, %71 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %86 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %87 = "neura.phi"(%86, %85) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %88 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %89 = "neura.phi"(%88, %80) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %90 = "neura.icmp"(%89, %87) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %91 = "neura.not"(%90) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %92 = "neura.and"(%71, %91) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %93 = "neura.and"(%71, %90) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %94 = neura.grant_predicate %17, %90 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %95 = neura.grant_predicate %11, %90 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %96 = neura.grant_predicate %17, %91 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %97 = neura.grant_predicate %7, %93 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %98 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %99 = "neura.phi"(%98, %97) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %100 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %101 = "neura.phi"(%100, %95) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %102 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %103 = "neura.phi"(%102, %94) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %104 = "neura.icmp"(%103, %99) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %105 = "neura.not"(%104) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %106 = neura.grant_predicate %1, %104 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %107 = neura.grant_predicate %103, %104 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %108 = neura.grant_predicate %89, %104 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %109 = neura.grant_predicate %21, %104 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %110 = neura.grant_predicate %101, %104 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %111 = neura.grant_predicate %5, %104 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %112 = neura.grant_predicate %7, %104 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %113 = neura.grant_predicate %3, %105 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %114 = neura.grant_predicate %21, %105 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %115 = neura.grant_predicate %89, %105 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %116 = neura.grant_predicate %101, %105 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %117 = neura.grant_predicate %9, %105 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %118 = neura.grant_predicate %5, %105 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %119 = neura.grant_predicate %7, %105 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %120 = neura.load_indexed %106[%107, %108, %109 : !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %121 = "neura.icmp"(%120, %110) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %122 = "neura.sel"(%120, %110, %121) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %123 = "neura.add"(%107, %111) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %123 -> %102 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %122 -> %100 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %112 -> %98 : !neura.data !neura.data +// CTRL2DATA-NEXT: %124 = neura.load_indexed %113[%114, %115 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %125 = "neura.mul"(%124, %116) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %126 = "neura.div"(%125, %117) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %126 to %113[%114, %115 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %127 = "neura.add"(%115, %118) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %127 -> %88 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %119 -> %86 : !neura.data !neura.data +// CTRL2DATA-NEXT: %128 = neura.grant_predicate %7, %92 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %129 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %130 = "neura.phi"(%129, %128) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %131 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %132 = "neura.phi"(%131, %96) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %133 = "neura.icmp"(%132, %130) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %134 = "neura.not"(%133) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %135 = "neura.and"(%92, %133) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %136 = neura.grant_predicate %3, %133 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %137 = neura.grant_predicate %21, %133 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %138 = neura.grant_predicate %132, %133 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %139 = neura.grant_predicate %84, %133 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %140 = neura.grant_predicate %21, %134 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %141 = neura.grant_predicate %5, %134 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %142 = neura.grant_predicate %7, %134 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %143 = neura.load_indexed %136[%137, %138 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %144 = "neura.icmp"(%143, %139) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %145 = "neura.and"(%135, %144) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %146 = "neura.not"(%144) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %147 = neura.grant_predicate %84, %144 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %148 = neura.grant_predicate %3, %144 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %149 = neura.grant_predicate %21, %144 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %150 = neura.grant_predicate %132, %144 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %151 = neura.grant_predicate %132, %146 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %152 = neura.grant_predicate %5, %146 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %153 = neura.grant_predicate %7, %146 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %147 to %148[%149, %150 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %154 = neura.grant_predicate %5, %145 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %155 = neura.grant_predicate %7, %145 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %156 = "neura.phi"(%153, %155) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %157 = "neura.phi"(%152, %154) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %158 = "neura.phi"(%151, %132) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %159 = "neura.add"(%158, %157) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %159 -> %131 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %156 -> %129 : !neura.data !neura.data +// CTRL2DATA-NEXT: %160 = "neura.add"(%140, %141) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %160 -> %20 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %142 -> %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 1c978c97..603cc24f 100644 --- a/test/controflow_fuse/non_perfect_nested/non_perfect_nested.mlir +++ b/test/controflow_fuse/non_perfect_nested/non_perfect_nested.mlir @@ -137,7 +137,7 @@ module attributes {} { // CHECK-NEXT: "neura.return"() : () -> () // CHECK-NEXT: } -// CTRL2DATA: func.func @_Z29non_perfect_extra_computationPA128_iS0_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// 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_once"(%0) : (!neura.data, i1>) -> !neura.data, i1> // CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data, i1> @@ -173,80 +173,93 @@ module attributes {} { // 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: %35 = neura.grant_predicate %33, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %36 = neura.grant_predicate %19, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %37 = neura.grant_predicate %27, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %38 = neura.grant_predicate %17, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.grant_predicate %29, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %40 = neura.grant_predicate %21, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %41 = neura.grant_predicate %23, %34 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %42 = "neura.cast"(%35) <{cast_type = "i64_to_i32"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %43 = "neura.div"(%42, %36) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %44 = "neura.mul"(%36, %43) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %45 = "neura.sub"(%42, %44) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %46 = "neura.icmp"(%45, %37) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %47 = "neura.sel"(%36, %38, %46) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %48 = neura.grant_predicate %13, %34 : !neura.data, !neura.data -> !neura.data // CTRL2DATA-NEXT: %49 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %50 = "neura.phi"(%49, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %50 = "neura.phi"(%49, %48) : (!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: %52 = "neura.phi"(%51, %37) : (!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: %54 = "neura.phi"(%53, %41) : (!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: %56 = "neura.phi"(%55, %40) : (!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: %58 = "neura.phi"(%57, %39) : (!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: %60 = "neura.not"(%59) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %61 = "neura.and"(%34, %60) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %62 = neura.grant_predicate %1, %59 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %63 = neura.grant_predicate %33, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %64 = neura.grant_predicate %58, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %65 = neura.grant_predicate %47, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %66 = neura.grant_predicate %3, %59 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %67 = neura.grant_predicate %52, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %68 = neura.grant_predicate %54, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %69 = neura.grant_predicate %56, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %70 = neura.grant_predicate %11, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %71 = neura.grant_predicate %13, %59 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %72 = neura.grant_predicate %52, %60 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %73 = neura.grant_predicate %25, %60 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %74 = neura.grant_predicate %54, %60 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %75 = neura.grant_predicate %56, %60 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %76 = neura.grant_predicate %27, %60 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %77 = neura.load_indexed %62[%63, %64 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %78 = "neura.mul"(%77, %65) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %78 to %66[%63, %64 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %79 = neura.load_indexed %62[%63, %64 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %80 = "neura.add"(%67, %79) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %81 = "neura.icmp"(%79, %68) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %82 = "neura.sel"(%79, %68, %81) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %83 = "neura.icmp"(%79, %69) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %84 = "neura.sel"(%79, %69, %83) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %85 = "neura.add"(%64, %70) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %85 -> %57 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %84 -> %55 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %82 -> %53 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %80 -> %51 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %71 -> %49 : !neura.data !neura.data +// CTRL2DATA-NEXT: %86 = "neura.div"(%72, %73) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %87 = "neura.sub"(%74, %75) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %88 = "neura.icmp"(%87, %76) <{cmpType = "sgt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %89 = "neura.not"(%88) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %90 = "neura.and"(%61, %89) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %91 = "neura.and"(%61, %88) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %92 = neura.grant_predicate %86, %88 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %93 = neura.grant_predicate %15, %88 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %94 = neura.grant_predicate %87, %88 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %95 = neura.grant_predicate %86, %89 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %96 = "neura.mul"(%92, %93) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %97 = "neura.div"(%96, %94) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %98 = "neura.or"(%91, %90) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %99 = "neura.phi"(%97, %95) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %100 = neura.grant_predicate %86, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %101 = neura.grant_predicate %3, %98 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %102 = neura.grant_predicate %29, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %103 = neura.grant_predicate %11, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %104 = neura.grant_predicate %9, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %105 = neura.grant_predicate %7, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %106 = neura.grant_predicate %87, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %107 = neura.grant_predicate %5, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %108 = neura.grant_predicate %13, %98 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %100 to %101[%33, %102 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %54 to %101[%33, %103 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %56 to %101[%33, %104 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %99 to %101[%33, %105 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %106 to %101[%33, %107 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %109 = "neura.add"(%33, %103) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %109 -> %32 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %108 -> %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 10b16f1d..9ea7162b 100644 --- a/test/controflow_fuse/perfect_nested/perfect_nested.mlir +++ b/test/controflow_fuse/perfect_nested/perfect_nested.mlir @@ -96,7 +96,7 @@ 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: 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> @@ -112,29 +112,29 @@ module attributes {} { // 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: %15 = neura.grant_predicate %9, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %7, %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: %18 = "neura.phi"(%17, %16) : (!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: %20 = "neura.phi"(%19, %15) : (!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: %22 = "neura.not"(%21) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %1, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %9, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %20, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %3, %21 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %13, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %5, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %7, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %13, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %5, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %7, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.load_indexed %23[%24, %24, %24, %24, %24, %25 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %33 to %26[%24, %24, %27, %24, %24, %25 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %34 = "neura.add"(%25, %28) : (!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: neura.ctrl_mov %29 -> %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 diff --git a/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir b/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir index b309843b..aa3dd5ac 100644 --- a/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir +++ b/test/controflow_fuse/perfect_reduction/perfect_reduction.mlir @@ -103,7 +103,7 @@ module attributes {} { // CAST-NEXT: "neura.return"(%5) : (i32) -> () // CAST-NEXT: } -// CTRL2DATA: func.func @_Z27perfect_nested_reduction_2dPA128_i(%arg0: memref) -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// 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 = "%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 @@ -121,37 +121,38 @@ module attributes {} { // 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, %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: %17 = "neura.not"(%16) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = neura.grant_predicate %9, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %19 = neura.grant_predicate %13, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %13, %17 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %21 = neura.grant_predicate %5, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %23 = "neura.phi"(%22, %21) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %25 = "neura.phi"(%24, %19) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %27 = "neura.phi"(%26, %18) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %28 = "neura.icmp"(%27, %23) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.not"(%28) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %1, %28 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %15, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.grant_predicate %27, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.grant_predicate %25, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %34 = neura.grant_predicate %3, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %35 = neura.grant_predicate %5, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %36 = neura.grant_predicate %15, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %37 = neura.grant_predicate %3, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %38 = neura.grant_predicate %25, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.grant_predicate %5, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %40 = neura.load_indexed %30[%31, %32 : !neura.data, !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %41 = "neura.add"(%33, %40) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %42 = "neura.add"(%32, %34) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %42 -> %26 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %41 -> %24 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %35 -> %22 : !neura.data !neura.data +// CTRL2DATA-NEXT: %43 = "neura.add"(%36, %37) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %43 -> %14 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %38 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %39 -> %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.mlir b/test/controflow_fuse/simple_loop/simple_loop.mlir index 4752c2f1..08c73c38 100644 --- a/test/controflow_fuse/simple_loop/simple_loop.mlir +++ b/test/controflow_fuse/simple_loop/simple_loop.mlir @@ -122,7 +122,7 @@ module attributes {} { // CANO-NEXT: "neura.return"() : () -> () // CANO-NEXT: } -// CTRL2DATA: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// 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> @@ -142,25 +142,23 @@ module attributes {} { // 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: %19 = neura.grant_predicate %1, %18 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %17, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %21 = neura.grant_predicate %11, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.grant_predicate %9, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %3, %18 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %5, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %7, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.load_indexed %19[%20 : !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %27 = "neura.mul"(%26, %21) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %28 = "neura.add"(%27, %22) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %28 to %23[%20 : !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %29 = "neura.add"(%20, %24) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %29 -> %16 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %25 -> %14 : !neura.data !neura.data // CTRL2DATA-NEXT: "neura.return"() : () -> () // CTRL2DATA-NEXT: } - // FUSE: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { // FUSE-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data, i1> // FUSE-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data, i1> @@ -171,58 +169,55 @@ module attributes {} { // FUSE-NEXT: %6 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data // FUSE-NEXT: %7 = "neura.grant_always"() <{constant_value = true}> : () -> !neura.data // FUSE-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %7, start = %6, end = %3, step = %2) {iterationType = "increment"} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data -// FUSE-NEXT: %8 = "neura.not"(%valid) : (!neura.data) -> !neura.data -// FUSE-NEXT: %9 = neura.grant_predicate %0, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> -// FUSE-NEXT: %10 = neura.grant_predicate %5, %valid : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: %11 = neura.grant_predicate %4, %valid : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: %12 = neura.grant_predicate %1, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> -// FUSE-NEXT: %13 = neura.load_indexed %9[%nextindex : !neura.data] !neura.data, i1> : !neura.data -// FUSE-NEXT: %14 = "neura.mul"(%13, %10) : (!neura.data, !neura.data) -> !neura.data -// FUSE-NEXT: %15 = "neura.add"(%14, %11) : (!neura.data, !neura.data) -> !neura.data -// FUSE-NEXT: neura.store_indexed %15 to %12[%nextindex : !neura.data] !neura.data, i1> : !neura.data +// FUSE-NEXT: %8 = neura.grant_predicate %0, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-NEXT: %9 = neura.grant_predicate %5, %valid : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %10 = neura.grant_predicate %4, %valid : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %11 = neura.grant_predicate %1, %valid : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-NEXT: %12 = neura.load_indexed %8[%nextindex : !neura.data] !neura.data, i1> : !neura.data +// FUSE-NEXT: %13 = "neura.mul"(%12, %9) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %14 = "neura.add"(%13, %10) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: neura.store_indexed %14 to %11[%nextindex : !neura.data] !neura.data, i1> : !neura.data // FUSE-NEXT: "neura.return"() : () -> () // FUSE-NEXT: } -// FUSE-MAPPING: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 5 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 1 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { -// FUSE-MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 1 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 4 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %2 = "neura.grant_always"() <{constant_value = 1 : i64}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data -// FUSE-MAPPING-NEXT: %3 = "neura.grant_always"() <{constant_value = 128 : i64}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 2 : i32}]} : () -> !neura.data -// FUSE-MAPPING-NEXT: %4 = "neura.grant_once"() <{constant_value = 1 : i32}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data -// FUSE-MAPPING-NEXT: %5 = "neura.grant_once"() <{constant_value = 2 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data -// FUSE-MAPPING-NEXT: %6 = "neura.grant_once"() <{constant_value = 0 : i64}> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 0 : i32, x = 2 : i32, y = 1 : i32}]} : () -> !neura.data -// FUSE-MAPPING-NEXT: %7 = "neura.grant_always"() <{constant_value = true}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data -// FUSE-MAPPING-NEXT: %8 = "neura.data_mov"(%7) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 0 : i32}, {id = 14 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %9 = "neura.data_mov"(%6) {mapping_locs = []} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%3) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 0 : i32}, {id = 33 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %11 = "neura.data_mov"(%2) {mapping_locs = [{id = 36 : i32, resource = "link", time_step = 0 : i32}, {id = 21 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %8, start = %9, end = %10, step = %11) {iterationType = "increment", mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 2 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data, !neura.data, !neura.data -> !neura.data, !neura.data -// FUSE-MAPPING-NEXT: %12 = "neura.data_mov"(%valid) {mapping_locs = []} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %13 = "neura.not"(%12) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %14 = "neura.data_mov"(%0) {mapping_locs = [{id = 36 : i32, resource = "link", time_step = 1 : i32}, {id = 28 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %15 = "neura.data_mov"(%valid) {mapping_locs = [{id = 18 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %16 = neura.grant_predicate %14, %15 {mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 3 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %17 = "neura.data_mov"(%5) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 4 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %18 = "neura.data_mov"(%valid) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 2 : i32}, {id = 15 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %19 = neura.grant_predicate %17, %18 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data -// FUSE-MAPPING-NEXT: %20 = "neura.data_mov"(%4) {mapping_locs = [{id = 35 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %21 = "neura.data_mov"(%valid) {mapping_locs = [{id = 20 : i32, resource = "link", time_step = 2 : i32}, {id = 40 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %22 = neura.grant_predicate %20, %21 {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data -// FUSE-MAPPING-NEXT: %23 = "neura.data_mov"(%1) {mapping_locs = [{id = 36 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%valid) {mapping_locs = [{id = 19 : i32, resource = "link", time_step = 2 : i32}, {id = 6 : i32, resource = "link", time_step = 3 : i32}, {id = 9 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %25 = neura.grant_predicate %23, %24 {mapping_locs = [{id = 7 : i32, resource = "tile", time_step = 5 : i32, x = 3 : i32, y = 1 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %26 = "neura.data_mov"(%16) {mapping_locs = [{id = 21 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %28 = neura.load_indexed %26[%27 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 4 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data -// FUSE-MAPPING-NEXT: %29 = "neura.data_mov"(%28) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%19) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %31 = "neura.mul"(%29, %30) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %32 = "neura.data_mov"(%31) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%22) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 4 : i32}, {id = 36 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %34 = "neura.add"(%32, %33) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %35 = "neura.data_mov"(%34) {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 6 : i32}, {id = 33 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: %36 = "neura.data_mov"(%25) {mapping_locs = [{id = 21 : i32, resource = "link", time_step = 5 : i32}, {id = 24 : i32, resource = "register", time_step = 6 : i32}, {id = 24 : i32, resource = "register", time_step = 7 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> -// FUSE-MAPPING-NEXT: %37 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data -// FUSE-MAPPING-NEXT: neura.store_indexed %35 to %36[%37 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 8 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data -// FUSE-MAPPING-NEXT: "neura.return"() {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 6 : i32, x = 0 : i32, y = 0 : i32}]} : () -> () +// FUSE-MAPPING: func.func @_Z11simple_loopPiS_(%arg0: memref, %arg1: memref) attributes {accelerator = "neura", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 4 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 1 : i32, res_mii = 2 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { +// FUSE-MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 2 : i32}]} : () -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %2 = "neura.grant_always"() <{constant_value = 1 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %3 = "neura.grant_always"() <{constant_value = 128 : i64}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 1 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %4 = "neura.grant_once"() <{constant_value = 1 : i32}> {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 3 : i32, x = 2 : i32, y = 2 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %5 = "neura.grant_once"() <{constant_value = 2 : i32}> {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %6 = "neura.grant_once"() <{constant_value = 0 : i64}> {mapping_locs = [{id = 13 : i32, resource = "tile", time_step = 0 : i32, x = 1 : i32, y = 3 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %7 = "neura.grant_always"() <{constant_value = true}> {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 0 : i32, x = 3 : i32, y = 2 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %8 = "neura.data_mov"(%7) {mapping_locs = [{id = 35 : i32, resource = "link", time_step = 0 : i32}, {id = 31 : i32, resource = "link", time_step = 1 : i32}, {id = 29 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %9 = "neura.data_mov"(%6) {mapping_locs = [{id = 42 : i32, resource = "link", time_step = 0 : i32}, {id = 29 : i32, resource = "link", time_step = 1 : i32}, {id = 20 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%3) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %11 = "neura.data_mov"(%2) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}, {id = 4 : i32, resource = "link", time_step = 1 : i32}, {id = 21 : i32, resource = "register", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %nextindex, %valid = neura.loop_control(parent_valid = %8, start = %9, end = %10, step = %11) {iterationType = "increment", mapping_locs = [{id = 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 +// FUSE-MAPPING-NEXT: %12 = "neura.data_mov"(%0) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 1 : i32}, {id = 4 : i32, resource = "register", time_step = 2 : i32}, {id = 4 : i32, resource = "register", time_step = 3 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %13 = "neura.data_mov"(%valid) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %14 = neura.grant_predicate %12, %13 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %15 = "neura.data_mov"(%5) {mapping_locs = [{id = 39 : i32, resource = "link", time_step = 2 : i32}, {id = 25 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %16 = "neura.data_mov"(%valid) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %17 = neura.grant_predicate %15, %16 {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 4 : i32, x = 0 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %18 = "neura.data_mov"(%4) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %19 = "neura.data_mov"(%valid) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %20 = neura.grant_predicate %18, %19 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %21 = "neura.data_mov"(%1) {mapping_locs = []} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %22 = "neura.data_mov"(%valid) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 3 : i32}, {id = 36 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %23 = neura.grant_predicate %21, %22 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%14) {mapping_locs = [{id = 3 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %25 = "neura.data_mov"(%nextindex) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 3 : i32}, {id = 19 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %26 = neura.load_indexed %24[%25 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 2 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 0 : i32}]} : !neura.data +// FUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%26) {mapping_locs = [{id = 5 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %28 = "neura.data_mov"(%17) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 4 : i32}, {id = 15 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %29 = "neura.mul"(%27, %28) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%29) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %31 = "neura.data_mov"(%20) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 5 : i32}, {id = 11 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %32 = "neura.add"(%30, %31) {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 7 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%32) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 7 : i32}, {id = 4 : i32, resource = "link", time_step = 8 : i32}, {id = 20 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %34 = "neura.data_mov"(%23) {mapping_locs = [{id = 27 : i32, resource = "link", time_step = 5 : i32}, {id = 25 : i32, resource = "link", time_step = 6 : i32}, {id = 10 : i32, resource = "link", time_step = 7 : i32}, {id = 21 : i32, resource = "register", time_step = 8 : i32}, {id = 21 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %35 = "neura.data_mov"(%nextindex) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: neura.store_indexed %33 to %34[%35 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data +// FUSE-MAPPING-NEXT: "neura.return"() {mapping_locs = [{id = 11 : i32, resource = "tile", time_step = 6 : i32, x = 3 : i32, y = 2 : i32}]} : () -> () // FUSE-MAPPING-NEXT: } \ No newline at end of file diff --git a/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir index 8b4044f6..70028758 100644 --- a/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir +++ b/test/controflow_fuse/simple_loop_reduction/simple_loop_reduction.mlir @@ -110,7 +110,7 @@ module attributes {} { // CAST-NEXT: "neura.return"(%5) : (i32) -> () // CAST-NEXT: } -// CTRL2DATA: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// 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 @@ -126,18 +126,18 @@ module attributes {} { // 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: %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.grant_predicate %11, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %18 = neura.grant_predicate %1, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %19 = neura.grant_predicate %3, %14 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %11, %15 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.cast"(%16) <{cast_type = "i64_to_i32"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = "neura.add"(%17, %21) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = "neura.add"(%16, %18) : (!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.ctrl_mov %19 -> %8 : !neura.data !neura.data // CTRL2DATA-NEXT: "neura.return"(%20) : (!neura.data) -> () // CTRL2DATA-NEXT: } @@ -158,7 +158,7 @@ module attributes {} { // FUSE-NEXT: %11 = "neura.add"(%8, %10) : (!neura.data, !neura.data) -> !neura.data // FUSE-NEXT: neura.ctrl_mov %11 -> %6 : !neura.data !neura.data // FUSE-NEXT: "neura.return"(%9) : (!neura.data) -> () -// FUSE-NEXT: } +// FUSE-NEXT: } // FUSE-MAPPING: func.func @_Z10simpleloopv() -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 3 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 3 : i32, res_mii = 1 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { diff --git a/test/mapping_quality/branch_for.mlir b/test/mapping_quality/branch_for.mlir index 4817c572..01973e46 100644 --- a/test/mapping_quality/branch_for.mlir +++ b/test/mapping_quality/branch_for.mlir @@ -136,18 +136,18 @@ func.func @loop_test() -> f32 { // 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: %23 = "neura.not"(%22) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %21, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %24 -> %18 : !neura.data !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %20, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %25 -> %16 : !neura.data !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %7, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %14 : !neura.data !neura.data +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %5, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %27 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %1, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %28 -> %10 : !neura.data !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %20, %23 : !neura.data, !neura.data -> !neura.data // CTRL2DATA-NEXT: "neura.return"(%29) : (!neura.data) -> () // CTRL2DATA-NEXT: } @@ -170,18 +170,18 @@ func.func @loop_test() -> f32 { // FUSE-NEXT: %15 = "neura.fadd"(%12, %10) : (!neura.data, !neura.data) -> !neura.data // FUSE-NEXT: %16 = "neura.add"(%14, %8) : (!neura.data, !neura.data) -> !neura.data // FUSE-NEXT: %17 = "neura.icmp"(%16, %6) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// FUSE-NEXT: %18 = neura.grant_predicate %16, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %18 -> %13 : !neura.data !neura.data -// FUSE-NEXT: %19 = neura.grant_predicate %15, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %19 -> %11 : !neura.data !neura.data -// FUSE-NEXT: %20 = neura.grant_predicate %3, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %20 -> %9 : !neura.data !neura.data -// FUSE-NEXT: %21 = neura.grant_predicate %2, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %21 -> %7 : !neura.data !neura.data -// FUSE-NEXT: %22 = neura.grant_predicate %0, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %22 -> %5 : !neura.data !neura.data -// FUSE-NEXT: %23 = "neura.not"(%17) : (!neura.data) -> !neura.data -// FUSE-NEXT: %24 = neura.grant_predicate %15, %23 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %18 = "neura.not"(%17) : (!neura.data) -> !neura.data +// FUSE-NEXT: %19 = neura.grant_predicate %16, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %19 -> %13 : !neura.data !neura.data +// FUSE-NEXT: %20 = neura.grant_predicate %15, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %20 -> %11 : !neura.data !neura.data +// FUSE-NEXT: %21 = neura.grant_predicate %3, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %21 -> %9 : !neura.data !neura.data +// FUSE-NEXT: %22 = neura.grant_predicate %2, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %22 -> %7 : !neura.data !neura.data +// FUSE-NEXT: %23 = neura.grant_predicate %0, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %23 -> %5 : !neura.data !neura.data +// FUSE-NEXT: %24 = neura.grant_predicate %15, %18 : !neura.data, !neura.data -> !neura.data // FUSE-NEXT: "neura.return"(%24) : (!neura.data) -> () // FUSE-NEXT: } @@ -215,30 +215,30 @@ func.func @loop_test() -> f32 { // MOV-NEXT: %26 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data // MOV-NEXT: %27 = "neura.data_mov"(%7) : (!neura.data) -> !neura.data // MOV-NEXT: %28 = "neura.icmp"(%26, %27) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %29 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data -// MOV-NEXT: %30 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %31 = neura.grant_predicate %29, %30 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %31 -> %17 : !neura.data !neura.data -// MOV-NEXT: %32 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data -// MOV-NEXT: %33 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %34 = neura.grant_predicate %32, %33 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %34 -> %14 : !neura.data !neura.data -// MOV-NEXT: %35 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data -// MOV-NEXT: %36 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %37 = neura.grant_predicate %35, %36 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %37 -> %11 : !neura.data !neura.data -// MOV-NEXT: %38 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data -// MOV-NEXT: %39 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %40 = neura.grant_predicate %38, %39 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %40 -> %8 : !neura.data !neura.data -// MOV-NEXT: %41 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// MOV-NEXT: %42 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %43 = neura.grant_predicate %41, %42 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %43 -> %5 : !neura.data !neura.data +// MOV-NEXT: %29 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %30 = "neura.not"(%29) : (!neura.data) -> !neura.data +// MOV-NEXT: %31 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data +// MOV-NEXT: %32 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %33 = neura.grant_predicate %31, %32 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %33 -> %17 : !neura.data !neura.data +// MOV-NEXT: %34 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data +// MOV-NEXT: %35 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %36 = neura.grant_predicate %34, %35 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %36 -> %14 : !neura.data !neura.data +// MOV-NEXT: %37 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// MOV-NEXT: %38 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %39 = neura.grant_predicate %37, %38 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %39 -> %11 : !neura.data !neura.data +// MOV-NEXT: %40 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// MOV-NEXT: %41 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %42 = neura.grant_predicate %40, %41 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %42 -> %8 : !neura.data !neura.data +// MOV-NEXT: %43 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data // MOV-NEXT: %44 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %45 = "neura.not"(%44) : (!neura.data) -> !neura.data +// MOV-NEXT: %45 = neura.grant_predicate %43, %44 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %45 -> %5 : !neura.data !neura.data // MOV-NEXT: %46 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data -// MOV-NEXT: %47 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// MOV-NEXT: %47 = "neura.data_mov"(%30) : (!neura.data) -> !neura.data // MOV-NEXT: %48 = neura.grant_predicate %46, %47 : !neura.data, !neura.data -> !neura.data // MOV-NEXT: %49 = "neura.data_mov"(%48) : (!neura.data) -> !neura.data // MOV-NEXT: "neura.return"(%49) : (!neura.data) -> () @@ -274,30 +274,30 @@ func.func @loop_test() -> f32 { // MAPPING-NEXT: %26 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data // MAPPING-NEXT: %27 = "neura.data_mov"(%7) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %28 = "neura.icmp"(%26, %27) <{cmpType = "slt"}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %29 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %30 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %31 = neura.grant_predicate %29, %30 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %31 -> %17 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 4 : i32}, {id = 4 : i32, resource = "register", time_step = 5 : i32}, {id = 4 : i32, resource = "register", time_step = 6 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %32 = "neura.data_mov"(%22) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %33 = "neura.data_mov"(%28) {mapping_locs = [{id = 16 : 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}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %34 = neura.grant_predicate %32, %33 {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: neura.ctrl_mov %34 -> %14 {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 7 : i32}, {id = 32 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %35 = "neura.data_mov"(%3) {mapping_locs = [{id = 12 : i32, resource = "link", time_step = 2 : i32}, {id = 24 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, resource = "link", time_step = 4 : i32}, {id = 15 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %36 = "neura.data_mov"(%28) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 3 : i32}, {id = 11 : i32, resource = "link", time_step = 4 : i32}, {id = 0 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %37 = neura.grant_predicate %35, %36 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %37 -> %11 {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 6 : i32}, {id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 0 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %38 = "neura.data_mov"(%2) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 0 : i32}, {id = 9 : i32, resource = "link", time_step = 1 : i32}, {id = 21 : i32, resource = "link", 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}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %39 = "neura.data_mov"(%28) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 3 : i32}, {id = 25 : i32, resource = "register", time_step = 4 : i32}, {id = 25 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %40 = neura.grant_predicate %38, %39 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %40 -> %8 {mapping_locs = []} : !neura.data !neura.data -// MAPPING-NEXT: %41 = "neura.data_mov"(%0) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 1 : i32}, {id = 10 : i32, resource = "link", time_step = 2 : i32}, {id = 20 : i32, resource = "register", time_step = 3 : i32}, {id = 20 : i32, resource = "register", time_step = 4 : i32}, {id = 20 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %42 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %43 = neura.grant_predicate %41, %42 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %43 -> %5 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 6 : i32}, {id = 4 : i32, resource = "register", time_step = 7 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %44 = "neura.data_mov"(%28) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %45 = "neura.not"(%44) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %29 = "neura.data_mov"(%28) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %30 = "neura.not"(%29) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %31 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %32 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {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: neura.ctrl_mov %33 -> %17 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 4 : i32}, {id = 4 : i32, resource = "register", time_step = 5 : i32}, {id = 4 : i32, resource = "register", time_step = 6 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %34 = "neura.data_mov"(%22) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %35 = "neura.data_mov"(%28) {mapping_locs = [{id = 16 : 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}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %36 = neura.grant_predicate %34, %35 {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: neura.ctrl_mov %36 -> %14 {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 7 : i32}, {id = 32 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %37 = "neura.data_mov"(%3) {mapping_locs = [{id = 12 : i32, resource = "link", time_step = 2 : i32}, {id = 24 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, resource = "link", time_step = 4 : i32}, {id = 15 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %38 = "neura.data_mov"(%28) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 3 : i32}, {id = 11 : i32, resource = "link", time_step = 4 : i32}, {id = 0 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %39 = neura.grant_predicate %37, %38 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %39 -> %11 {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 6 : i32}, {id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 0 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %40 = "neura.data_mov"(%2) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 0 : i32}, {id = 9 : i32, resource = "link", time_step = 1 : i32}, {id = 21 : i32, resource = "link", 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}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %41 = "neura.data_mov"(%28) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 3 : i32}, {id = 25 : i32, resource = "register", time_step = 4 : i32}, {id = 25 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %42 = neura.grant_predicate %40, %41 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %42 -> %8 {mapping_locs = []} : !neura.data !neura.data +// MAPPING-NEXT: %43 = "neura.data_mov"(%0) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 1 : i32}, {id = 10 : i32, resource = "link", time_step = 2 : i32}, {id = 20 : i32, resource = "register", time_step = 3 : i32}, {id = 20 : i32, resource = "register", time_step = 4 : i32}, {id = 20 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %44 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %45 = neura.grant_predicate %43, %44 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %45 -> %5 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 6 : i32}, {id = 4 : i32, resource = "register", time_step = 7 : i32}]} : !neura.data !neura.data // MAPPING-NEXT: %46 = "neura.data_mov"(%22) {mapping_locs = [{id = 27 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %47 = "neura.data_mov"(%45) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 4 : i32}, {id = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 12 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %47 = "neura.data_mov"(%30) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 4 : i32}, {id = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 12 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %48 = neura.grant_predicate %46, %47 {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: %49 = "neura.data_mov"(%48) {mapping_locs = []} : (!neura.data) -> !neura.data // MAPPING-NEXT: "neura.return"(%49) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> () diff --git a/test/neura/ctrl/branch.mlir b/test/neura/ctrl/branch.mlir index 60aae1ef..aaf58c46 100644 --- a/test/neura/ctrl/branch.mlir +++ b/test/neura/ctrl/branch.mlir @@ -54,7 +54,7 @@ func.func @test(%in: i64) -> f32 { // CHECK-NEXT: "neura.return"(%13) : (!neura.data) -> () // CHECK-NEXT: } -// CTRL2DATA: func.func @test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { +// CTRL2DATA: func.func @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 @@ -67,13 +67,13 @@ func.func @test(%in: i64) -> f32 { // CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!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: %12 = "neura.not"(%11) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %13 = neura.grant_predicate %7, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.grant_predicate %9, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %3, %12 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %5, %12 : !neura.data, !neura.data -> !neura.data // CTRL2DATA-NEXT: %17 = "neura.fadd"(%15, %16) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.fmul"(%12, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = "neura.fmul"(%13, %14) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %19 = "neura.phi"(%17, %18) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: "neura.return"(%19) : (!neura.data) -> () // CTRL2DATA-NEXT: } diff --git a/test/neura/ctrl/branch_for.mlir b/test/neura/ctrl/branch_for.mlir index b7196a5a..cf223d71 100644 --- a/test/neura/ctrl/branch_for.mlir +++ b/test/neura/ctrl/branch_for.mlir @@ -136,18 +136,18 @@ func.func @loop_test() -> f32 { // 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: %23 = "neura.not"(%22) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %21, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %24 -> %18 : !neura.data !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %20, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %25 -> %16 : !neura.data !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %7, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %14 : !neura.data !neura.data +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %5, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %27 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %1, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %28 -> %10 : !neura.data !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %20, %23 : !neura.data, !neura.data -> !neura.data // CTRL2DATA-NEXT: "neura.return"(%29) : (!neura.data) -> () // CTRL2DATA-NEXT: } @@ -170,18 +170,18 @@ func.func @loop_test() -> f32 { // FUSE-NEXT: %15 = "neura.fadd"(%12, %10) : (!neura.data, !neura.data) -> !neura.data // FUSE-NEXT: %16 = "neura.add"(%14, %8) : (!neura.data, !neura.data) -> !neura.data // FUSE-NEXT: %17 = "neura.icmp"(%16, %6) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// FUSE-NEXT: %18 = neura.grant_predicate %16, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %18 -> %13 : !neura.data !neura.data -// FUSE-NEXT: %19 = neura.grant_predicate %15, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %19 -> %11 : !neura.data !neura.data -// FUSE-NEXT: %20 = neura.grant_predicate %3, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %20 -> %9 : !neura.data !neura.data -// FUSE-NEXT: %21 = neura.grant_predicate %2, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %21 -> %7 : !neura.data !neura.data -// FUSE-NEXT: %22 = neura.grant_predicate %0, %17 : !neura.data, !neura.data -> !neura.data -// FUSE-NEXT: neura.ctrl_mov %22 -> %5 : !neura.data !neura.data -// FUSE-NEXT: %23 = "neura.not"(%17) : (!neura.data) -> !neura.data -// FUSE-NEXT: %24 = neura.grant_predicate %15, %23 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: %18 = "neura.not"(%17) : (!neura.data) -> !neura.data +// FUSE-NEXT: %19 = neura.grant_predicate %16, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %19 -> %13 : !neura.data !neura.data +// FUSE-NEXT: %20 = neura.grant_predicate %15, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %20 -> %11 : !neura.data !neura.data +// FUSE-NEXT: %21 = neura.grant_predicate %3, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %21 -> %9 : !neura.data !neura.data +// FUSE-NEXT: %22 = neura.grant_predicate %2, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %22 -> %7 : !neura.data !neura.data +// FUSE-NEXT: %23 = neura.grant_predicate %0, %17 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %23 -> %5 : !neura.data !neura.data +// FUSE-NEXT: %24 = neura.grant_predicate %15, %18 : !neura.data, !neura.data -> !neura.data // FUSE-NEXT: "neura.return"(%24) : (!neura.data) -> () // FUSE-NEXT: } @@ -215,30 +215,30 @@ func.func @loop_test() -> f32 { // MOV-NEXT: %26 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data // MOV-NEXT: %27 = "neura.data_mov"(%7) : (!neura.data) -> !neura.data // MOV-NEXT: %28 = "neura.icmp"(%26, %27) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// MOV-NEXT: %29 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data -// MOV-NEXT: %30 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %31 = neura.grant_predicate %29, %30 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %31 -> %17 : !neura.data !neura.data -// MOV-NEXT: %32 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data -// MOV-NEXT: %33 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %34 = neura.grant_predicate %32, %33 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %34 -> %14 : !neura.data !neura.data -// MOV-NEXT: %35 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data -// MOV-NEXT: %36 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %37 = neura.grant_predicate %35, %36 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %37 -> %11 : !neura.data !neura.data -// MOV-NEXT: %38 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data -// MOV-NEXT: %39 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %40 = neura.grant_predicate %38, %39 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %40 -> %8 : !neura.data !neura.data -// MOV-NEXT: %41 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// MOV-NEXT: %42 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %43 = neura.grant_predicate %41, %42 : !neura.data, !neura.data -> !neura.data -// MOV-NEXT: neura.ctrl_mov %43 -> %5 : !neura.data !neura.data +// MOV-NEXT: %29 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %30 = "neura.not"(%29) : (!neura.data) -> !neura.data +// MOV-NEXT: %31 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data +// MOV-NEXT: %32 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %33 = neura.grant_predicate %31, %32 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %33 -> %17 : !neura.data !neura.data +// MOV-NEXT: %34 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data +// MOV-NEXT: %35 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %36 = neura.grant_predicate %34, %35 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %36 -> %14 : !neura.data !neura.data +// MOV-NEXT: %37 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// MOV-NEXT: %38 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %39 = neura.grant_predicate %37, %38 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %39 -> %11 : !neura.data !neura.data +// MOV-NEXT: %40 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// MOV-NEXT: %41 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %42 = neura.grant_predicate %40, %41 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %42 -> %8 : !neura.data !neura.data +// MOV-NEXT: %43 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data // MOV-NEXT: %44 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// MOV-NEXT: %45 = "neura.not"(%44) : (!neura.data) -> !neura.data +// MOV-NEXT: %45 = neura.grant_predicate %43, %44 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %45 -> %5 : !neura.data !neura.data // MOV-NEXT: %46 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data -// MOV-NEXT: %47 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// MOV-NEXT: %47 = "neura.data_mov"(%30) : (!neura.data) -> !neura.data // MOV-NEXT: %48 = neura.grant_predicate %46, %47 : !neura.data, !neura.data -> !neura.data // MOV-NEXT: %49 = "neura.data_mov"(%48) : (!neura.data) -> !neura.data // MOV-NEXT: "neura.return"(%49) : (!neura.data) -> () @@ -274,30 +274,30 @@ func.func @loop_test() -> f32 { // MAPPING-NEXT: %26 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data // MAPPING-NEXT: %27 = "neura.data_mov"(%7) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %28 = "neura.icmp"(%26, %27) <{cmpType = "slt"}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data -// MAPPING-NEXT: %29 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %30 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %31 = neura.grant_predicate %29, %30 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %31 -> %17 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 4 : i32}, {id = 4 : i32, resource = "register", time_step = 5 : i32}, {id = 4 : i32, resource = "register", time_step = 6 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %32 = "neura.data_mov"(%22) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %33 = "neura.data_mov"(%28) {mapping_locs = [{id = 16 : 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}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %34 = neura.grant_predicate %32, %33 {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: neura.ctrl_mov %34 -> %14 {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 7 : i32}, {id = 32 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %35 = "neura.data_mov"(%3) {mapping_locs = [{id = 12 : i32, resource = "link", time_step = 2 : i32}, {id = 24 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, resource = "link", time_step = 4 : i32}, {id = 15 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %36 = "neura.data_mov"(%28) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 3 : i32}, {id = 11 : i32, resource = "link", time_step = 4 : i32}, {id = 0 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %37 = neura.grant_predicate %35, %36 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %37 -> %11 {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 6 : i32}, {id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 0 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %38 = "neura.data_mov"(%2) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 0 : i32}, {id = 9 : i32, resource = "link", time_step = 1 : i32}, {id = 21 : i32, resource = "link", 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}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %39 = "neura.data_mov"(%28) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 3 : i32}, {id = 25 : i32, resource = "register", time_step = 4 : i32}, {id = 25 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %40 = neura.grant_predicate %38, %39 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %40 -> %8 {mapping_locs = []} : !neura.data !neura.data -// MAPPING-NEXT: %41 = "neura.data_mov"(%0) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 1 : i32}, {id = 10 : i32, resource = "link", time_step = 2 : i32}, {id = 20 : i32, resource = "register", time_step = 3 : i32}, {id = 20 : i32, resource = "register", time_step = 4 : i32}, {id = 20 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %42 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %43 = neura.grant_predicate %41, %42 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data -// MAPPING-NEXT: neura.ctrl_mov %43 -> %5 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 6 : i32}, {id = 4 : i32, resource = "register", time_step = 7 : i32}]} : !neura.data !neura.data -// MAPPING-NEXT: %44 = "neura.data_mov"(%28) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %45 = "neura.not"(%44) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %29 = "neura.data_mov"(%28) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %30 = "neura.not"(%29) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %31 = "neura.data_mov"(%25) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %32 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %33 = neura.grant_predicate %31, %32 {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: neura.ctrl_mov %33 -> %17 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 4 : i32}, {id = 4 : i32, resource = "register", time_step = 5 : i32}, {id = 4 : i32, resource = "register", time_step = 6 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %34 = "neura.data_mov"(%22) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %35 = "neura.data_mov"(%28) {mapping_locs = [{id = 16 : 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}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %36 = neura.grant_predicate %34, %35 {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: neura.ctrl_mov %36 -> %14 {mapping_locs = [{id = 28 : i32, resource = "link", time_step = 7 : i32}, {id = 32 : i32, resource = "link", time_step = 8 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %37 = "neura.data_mov"(%3) {mapping_locs = [{id = 12 : i32, resource = "link", time_step = 2 : i32}, {id = 24 : i32, resource = "link", time_step = 3 : i32}, {id = 29 : i32, resource = "link", time_step = 4 : i32}, {id = 15 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %38 = "neura.data_mov"(%28) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 3 : i32}, {id = 11 : i32, resource = "link", time_step = 4 : i32}, {id = 0 : i32, resource = "link", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %39 = neura.grant_predicate %37, %38 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %39 -> %11 {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 6 : i32}, {id = 0 : i32, resource = "register", time_step = 7 : i32}, {id = 0 : i32, resource = "register", time_step = 8 : i32}]} : !neura.data !neura.data +// MAPPING-NEXT: %40 = "neura.data_mov"(%2) {mapping_locs = [{id = 6 : i32, resource = "link", time_step = 0 : i32}, {id = 9 : i32, resource = "link", time_step = 1 : i32}, {id = 21 : i32, resource = "link", 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}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %41 = "neura.data_mov"(%28) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 3 : i32}, {id = 25 : i32, resource = "register", time_step = 4 : i32}, {id = 25 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %42 = neura.grant_predicate %40, %41 {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %42 -> %8 {mapping_locs = []} : !neura.data !neura.data +// MAPPING-NEXT: %43 = "neura.data_mov"(%0) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 1 : i32}, {id = 10 : i32, resource = "link", time_step = 2 : i32}, {id = 20 : i32, resource = "register", time_step = 3 : i32}, {id = 20 : i32, resource = "register", time_step = 4 : i32}, {id = 20 : i32, resource = "register", time_step = 5 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %44 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %45 = neura.grant_predicate %43, %44 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// MAPPING-NEXT: neura.ctrl_mov %45 -> %5 {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 6 : i32}, {id = 4 : i32, resource = "register", time_step = 7 : i32}]} : !neura.data !neura.data // MAPPING-NEXT: %46 = "neura.data_mov"(%22) {mapping_locs = [{id = 27 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data -// MAPPING-NEXT: %47 = "neura.data_mov"(%45) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 4 : i32}, {id = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 12 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// MAPPING-NEXT: %47 = "neura.data_mov"(%30) {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 4 : i32}, {id = 1 : i32, resource = "link", time_step = 5 : i32}, {id = 12 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data // MAPPING-NEXT: %48 = neura.grant_predicate %46, %47 {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: %49 = "neura.data_mov"(%48) {mapping_locs = []} : (!neura.data) -> !neura.data // MAPPING-NEXT: "neura.return"(%49) {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 2 : i32}]} : (!neura.data) -> () diff --git a/test/neura/ctrl/branch_with_and_without_arg.mlir b/test/neura/ctrl/branch_with_and_without_arg.mlir index 88439f1a..4da15ba8 100644 --- a/test/neura/ctrl/branch_with_and_without_arg.mlir +++ b/test/neura/ctrl/branch_with_and_without_arg.mlir @@ -51,7 +51,7 @@ func.func @test(%in: i64) -> f32 { // CHECK-NEXT: "neura.return"(%12) : (!neura.data) -> () // CHECK-NEXT: } -// CTRL2DATA: func.func @test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { +// CTRL2DATA: func.func @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 @@ -62,13 +62,13 @@ func.func @test(%in: i64) -> f32 { // CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data // CTRL2DATA-NEXT: %8 = "neura.icmp"(%0, %1) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = neura.grant_predicate %7, %9 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %11 = neura.grant_predicate %5, %9 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.not"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = neura.grant_predicate %3, %12 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %14 = neura.grant_predicate %5, %12 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.not"(%9) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %11 = neura.grant_predicate %7, %9 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.grant_predicate %5, %9 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %13 = neura.grant_predicate %3, %10 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.grant_predicate %5, %10 : !neura.data, !neura.data -> !neura.data // CTRL2DATA-NEXT: %15 = "neura.fadd"(%13, %14) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.fmul"(%10, %11) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.fmul"(%11, %12) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %17 = "neura.phi"(%15, %16) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: "neura.return"(%17) : (!neura.data) -> () // CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/neura/ctrl/branch_without_arg.mlir b/test/neura/ctrl/branch_without_arg.mlir index 7cec73c1..f5cd7084 100644 --- a/test/neura/ctrl/branch_without_arg.mlir +++ b/test/neura/ctrl/branch_without_arg.mlir @@ -53,7 +53,7 @@ func.func @test(%in: i64) -> f32 { // CHECK-NEXT: "neura.return"(%13) : (!neura.data) -> () // CHECK-NEXT: } -// CTRL2DATA: func.func @test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { +// CTRL2DATA: func.func @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 @@ -66,13 +66,13 @@ func.func @test(%in: i64) -> f32 { // CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!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: %12 = "neura.not"(%11) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %13 = neura.grant_predicate %7, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.grant_predicate %9, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %3, %12 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %5, %12 : !neura.data, !neura.data -> !neura.data // CTRL2DATA-NEXT: %17 = "neura.fadd"(%15, %16) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.fmul"(%12, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = "neura.fmul"(%13, %14) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %19 = "neura.phi"(%17, %18) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: "neura.return"(%19) : (!neura.data) -> () // CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/neura/ctrl/for_with_if.mlir b/test/neura/ctrl/for_with_if.mlir new file mode 100644 index 00000000..cd607126 --- /dev/null +++ b/test/neura/ctrl/for_with_if.mlir @@ -0,0 +1,271 @@ +// Source code: +// int for_with_if(int data[128]) { +// int output = 0; +// int threshold = 1000; +// for (int i = 0; i < 128; ++i) { +// if (output >= threshold) { +// // Simulate backpressure by halting processing +// output -= 5; +// } +// output += data[i] * 2 + 1; +// } +// return output; +// } + +// 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 \ +// 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: --fold-constant \ +// RUN: --insert-data-mov \ +// RUN: --map-to-accelerator="mapping-strategy=heuristic backtrack-config=customized" | FileCheck %s -check-prefix=FUSE-MAPPING + +module attributes {} { + func.func @_Z11for_with_ifPi(%arg0: memref) -> i32 attributes {llvm.linkage = #llvm.linkage} { + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c-5_i32 = arith.constant -5 : i32 + %c1_i32 = arith.constant 1 : i32 + %c2_i32 = arith.constant 2 : i32 + %c1000_i32 = arith.constant 1000 : i32 + %c0_i32 = arith.constant 0 : i32 + %0 = scf.for %arg1 = %c0 to %c128 step %c1 iter_args(%arg2 = %c0_i32) -> (i32) { + %1 = arith.cmpi sge, %arg2, %c1000_i32 : i32 + %2 = scf.if %1 -> (i32) { + %7 = arith.addi %arg2, %c-5_i32 : i32 + scf.yield %7 : i32 + } else { + scf.yield %arg2 : i32 + } + %3 = memref.load %arg0[%arg1] : memref + %4 = arith.muli %3, %c2_i32 : i32 + %5 = arith.addi %4, %c1_i32 : i32 + %6 = arith.addi %2, %5 : i32 + scf.yield %6 : i32 + } + return %0 : i32 + } +} + +// CHECK: func.func @_Z11for_with_ifPi(%arg0: memref) -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage} { +// CHECK-NEXT: %0 = "neura.constant"() <{predicate = true, value = 0 : i32}> : () -> i32 +// CHECK-NEXT: %1 = "neura.constant"() <{predicate = true, value = 1000 : i32}> : () -> i32 +// CHECK-NEXT: %2 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> i32 +// CHECK-NEXT: %3 = "neura.constant"() <{predicate = true, value = 1 : i32}> : () -> i32 +// CHECK-NEXT: %4 = "neura.constant"() <{predicate = true, value = -5 : i32}> : () -> i32 +// CHECK-NEXT: %5 = "neura.constant"() <{predicate = true, value = 1 : index}> : () -> index +// CHECK-NEXT: %6 = "neura.constant"() <{predicate = true, value = 128 : index}> : () -> index +// CHECK-NEXT: %7 = "neura.constant"() <{predicate = true, value = 0 : index}> : () -> index +// CHECK-NEXT: %8 = "neura.cast"(%7) <{cast_type = "index_to_int"}> : (index) -> i64 +// CHECK-NEXT: neura.br %8, %0 : i64, i32 to ^bb1 +// CHECK-NEXT: ^bb1(%9: i64, %10: i32): // 2 preds: ^bb0, ^bb6 +// CHECK-NEXT: %11 = "neura.cast"(%9) <{cast_type = "int_to_index"}> : (i64) -> index +// CHECK-NEXT: %12 = "neura.icmp"(%11, %6) <{cmpType = "slt"}> : (index, index) -> i1 +// CHECK-NEXT: neura.cond_br %12 : i1 then to ^bb2 else to ^bb7 +// CHECK-NEXT: ^bb2: // pred: ^bb1 +// CHECK-NEXT: %13 = "neura.icmp"(%10, %1) <{cmpType = "sge"}> : (i32, i32) -> i1 +// CHECK-NEXT: neura.cond_br %13 : i1 then to ^bb3 else to ^bb4 +// CHECK-NEXT: ^bb3: // pred: ^bb2 +// CHECK-NEXT: %14 = "neura.add"(%10, %4) : (i32, i32) -> i32 +// CHECK-NEXT: neura.br %14 : i32 to ^bb5 +// CHECK-NEXT: ^bb4: // pred: ^bb2 +// CHECK-NEXT: neura.br %10 : i32 to ^bb5 +// CHECK-NEXT: ^bb5(%15: i32): // 2 preds: ^bb3, ^bb4 +// CHECK-NEXT: neura.br to ^bb6 +// CHECK-NEXT: ^bb6: // pred: ^bb5 +// CHECK-NEXT: %16 = neura.load_indexed %arg0[%11 : index] memref : i32 +// CHECK-NEXT: %17 = "neura.mul"(%16, %2) : (i32, i32) -> i32 +// CHECK-NEXT: %18 = "neura.add"(%17, %3) : (i32, i32) -> i32 +// CHECK-NEXT: %19 = "neura.add"(%15, %18) : (i32, i32) -> i32 +// CHECK-NEXT: %20 = "neura.add"(%11, %5) : (index, index) -> index +// CHECK-NEXT: %21 = "neura.cast"(%20) <{cast_type = "index_to_int"}> : (index) -> i64 +// CHECK-NEXT: neura.br %21, %19 : i64, i32 to ^bb1 +// CHECK-NEXT: ^bb7: // pred: ^bb1 +// CHECK-NEXT: "neura.return"(%10) : (i32) -> () +// CHECK-NEXT: } + +// CTRL2DATA: func.func @_Z11for_with_ifPi(%arg0: memref) -> i32 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 = 0 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1000 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_once"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 2 : i32}> : () -> !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 = -5 : i32}> : () -> !neura.data +// CTRL2DATA-NEXT: %11 = "neura.grant_once"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.grant_once"(%12) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.constant"() <{predicate = true, value = 128 : i64}> : () -> !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, %15) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %21 = "neura.phi"(%20, %3) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %23 = "neura.phi"(%22, %17) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %24 = "neura.icmp"(%23, %19) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %25 = "neura.not"(%24) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %21, %24 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %5, %24 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %21, %25 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.icmp"(%26, %27) <{cmpType = "sge"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %30 = "neura.not"(%29) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %31 = "neura.and"(%24, %30) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %32 = "neura.and"(%24, %29) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %33 = neura.grant_predicate %21, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %34 = neura.grant_predicate %11, %29 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %35 = neura.grant_predicate %21, %30 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %36 = "neura.add"(%33, %34) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %37 = "neura.or"(%32, %31) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %38 = "neura.phi"(%36, %35) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %39 = neura.grant_predicate %1, %37 : !neura.data, i1>, !neura.data -> !neura.data, i1> +// CTRL2DATA-NEXT: %40 = neura.grant_predicate %7, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %41 = neura.grant_predicate %9, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %42 = neura.grant_predicate %13, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %43 = neura.grant_predicate %15, %37 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %44 = neura.load_indexed %39[%23 : !neura.data] !neura.data, i1> : !neura.data +// CTRL2DATA-NEXT: %45 = "neura.mul"(%44, %40) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %46 = "neura.add"(%45, %41) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %47 = "neura.add"(%38, %46) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %48 = "neura.add"(%23, %42) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %48 -> %22 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %47 -> %20 : !neura.data !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %43 -> %18 : !neura.data !neura.data +// CTRL2DATA-NEXT: "neura.return"(%28) : (!neura.data) -> () +// CTRL2DATA-NEXT: } + +// FUSE-MAPPING: func.func @_Z11for_with_ifPi(%arg0: memref) -> i32 attributes {accelerator = "neura", llvm.linkage = #llvm.linkage, mapping_info = {compiled_ii = 13 : i32, mapping_mode = "spatial-temporal", mapping_strategy = "heuristic", rec_mii = 11 : i32, res_mii = 3 : i32, x_tiles = 4 : i32, y_tiles = 4 : i32}} { +// FUSE-MAPPING-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 7 : i32, x = 2 : i32, y = 1 : i32}]} : () -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %1 = "neura.grant_once"() <{constant_value = 0 : i32}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %2 = "neura.grant_once"() <{constant_value = 1000 : i32}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %3 = "neura.grant_once"() <{constant_value = 2 : i32}> {mapping_locs = [{id = 8 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 2 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %4 = "neura.grant_once"() <{constant_value = 1 : i32}> {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 9 : i32, x = 2 : i32, y = 1 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %5 = "neura.grant_once"() <{constant_value = -5 : i32}> {mapping_locs = [{id = 12 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 3 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %6 = "neura.grant_once"() <{constant_value = 1 : i64}> {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %7 = "neura.grant_once"() <{constant_value = 128 : i64}> {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 0 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %8 = "neura.grant_once"() <{constant_value = 0 : i64}> {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 0 : i32, x = 0 : i32, y = 1 : i32}]} : () -> !neura.data +// FUSE-MAPPING-NEXT: %9 = neura.reserve : !neura.data +// FUSE-MAPPING-NEXT: %10 = "neura.data_mov"(%7) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %11 = "neura.phi"(%9, %10) {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 1 : i32, x = 0 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %12 = neura.reserve : !neura.data +// FUSE-MAPPING-NEXT: %13 = "neura.data_mov"(%1) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %14 = "neura.phi"(%12, %13) {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 2 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %15 = neura.reserve : !neura.data +// FUSE-MAPPING-NEXT: %16 = "neura.data_mov"(%8) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 0 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %17 = "neura.phi"(%15, %16) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 1 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %18 = "neura.data_mov"(%17) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %19 = "neura.data_mov"(%11) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %20 = "neura.icmp"(%18, %19) <{cmpType = "slt"}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 2 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %21 = "neura.data_mov"(%20) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 2 : i32}, {id = 28 : i32, resource = "link", time_step = 3 : i32}, {id = 40 : i32, resource = "register", time_step = 4 : i32}, {id = 40 : i32, resource = "register", time_step = 5 : i32}, {id = 40 : i32, resource = "register", time_step = 6 : i32}, {id = 40 : i32, resource = "register", time_step = 7 : i32}, {id = 40 : i32, resource = "register", time_step = 8 : i32}, {id = 40 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %22 = "neura.not"(%21) {mapping_locs = [{id = 10 : i32, resource = "tile", time_step = 10 : i32, x = 2 : i32, y = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %23 = "neura.data_mov"(%14) {mapping_locs = [{id = 1 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %24 = "neura.data_mov"(%20) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %25 = neura.grant_predicate %23, %24 {mapping_locs = [{id = 4 : i32, resource = "tile", time_step = 3 : i32, x = 0 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %26 = "neura.data_mov"(%2) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 2 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %27 = "neura.data_mov"(%20) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %28 = neura.grant_predicate %26, %27 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 3 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %29 = "neura.data_mov"(%14) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %30 = "neura.data_mov"(%22) {mapping_locs = [{id = 31 : i32, resource = "link", time_step = 10 : i32}, {id = 27 : i32, resource = "link", time_step = 11 : i32}, {id = 25 : i32, resource = "link", time_step = 12 : i32}, {id = 11 : i32, resource = "link", time_step = 13 : i32}, {id = 0 : i32, resource = "register", time_step = 14 : i32}, {id = 0 : i32, resource = "register", time_step = 15 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %31 = neura.grant_predicate %29, %30 {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 16 : i32, x = 0 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %32 = "neura.data_mov"(%25) {mapping_locs = [{id = 10 : i32, resource = "link", time_step = 3 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %33 = "neura.data_mov"(%28) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %34 = "neura.icmp"(%32, %33) <{cmpType = "sge"}> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 4 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %35 = "neura.data_mov"(%34) {mapping_locs = [{id = 14 : i32, resource = "link", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %36 = "neura.not"(%35) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 5 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %37 = "neura.data_mov"(%20) {mapping_locs = [{id = 14 : i32, resource = "link", 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}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %38 = "neura.data_mov"(%36) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %39 = "neura.and"(%37, %38) {mapping_locs = [{id = 6 : i32, resource = "tile", time_step = 6 : i32, x = 2 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %40 = "neura.data_mov"(%20) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %41 = "neura.data_mov"(%34) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %42 = "neura.and"(%40, %41) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 6 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %43 = "neura.data_mov"(%14) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 2 : i32}, {id = 4 : i32, resource = "link", time_step = 3 : i32}, {id = 20 : i32, resource = "register", time_step = 4 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %44 = "neura.data_mov"(%34) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %45 = neura.grant_predicate %43, %44 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 5 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %46 = "neura.data_mov"(%5) {mapping_locs = [{id = 38 : i32, resource = "link", time_step = 8 : i32}, {id = 42 : i32, resource = "link", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %47 = "neura.data_mov"(%34) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 4 : i32}, {id = 36 : i32, resource = "register", time_step = 5 : i32}, {id = 36 : i32, resource = "register", time_step = 6 : i32}, {id = 36 : i32, resource = "register", time_step = 7 : i32}, {id = 36 : i32, resource = "register", time_step = 8 : i32}, {id = 36 : i32, resource = "register", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %48 = neura.grant_predicate %46, %47 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %49 = "neura.data_mov"(%14) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %50 = "neura.data_mov"(%36) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 5 : i32}, {id = 13 : i32, resource = "link", time_step = 6 : i32}, {id = 11 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %51 = neura.grant_predicate %49, %50 {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 8 : i32, x = 0 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %52 = "neura.data_mov"(%45) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %53 = "neura.data_mov"(%48) {mapping_locs = [{id = 29 : i32, resource = "link", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %54 = "neura.add"(%52, %53) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 11 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %55 = "neura.data_mov"(%42) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %56 = "neura.data_mov"(%39) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 6 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %57 = "neura.or"(%55, %56) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 7 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %58 = "neura.data_mov"(%54) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %59 = "neura.data_mov"(%51) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 8 : i32}, {id = 4 : i32, resource = "link", time_step = 9 : i32}, {id = 20 : i32, resource = "register", time_step = 10 : i32}, {id = 20 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %60 = "neura.phi"(%58, %59) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 12 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %61 = "neura.data_mov"(%0) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 7 : i32}]} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %62 = "neura.data_mov"(%57) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %63 = neura.grant_predicate %61, %62 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 8 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, i1>, !neura.data -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %64 = "neura.data_mov"(%3) {mapping_locs = [{id = 24 : i32, resource = "link", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %65 = "neura.data_mov"(%57) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 7 : i32}, {id = 37 : i32, resource = "register", time_step = 8 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %66 = neura.grant_predicate %64, %65 {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 2 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %67 = "neura.data_mov"(%4) {mapping_locs = [{id = 17 : i32, resource = "link", time_step = 9 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %68 = "neura.data_mov"(%57) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %69 = neura.grant_predicate %67, %68 {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 10 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %70 = "neura.data_mov"(%6) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %71 = "neura.data_mov"(%57) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 7 : i32}, {id = 4 : i32, resource = "register", time_step = 8 : i32}, {id = 4 : i32, resource = "register", time_step = 9 : i32}, {id = 4 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %72 = neura.grant_predicate %70, %71 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 11 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %73 = "neura.data_mov"(%7) {mapping_locs = [{id = 0 : i32, resource = "link", time_step = 0 : i32}, {id = 5 : i32, resource = "register", time_step = 1 : i32}, {id = 5 : i32, resource = "register", time_step = 2 : i32}, {id = 5 : i32, resource = "register", time_step = 3 : i32}, {id = 5 : i32, resource = "register", time_step = 4 : i32}, {id = 5 : i32, resource = "register", time_step = 5 : i32}, {id = 5 : i32, resource = "register", time_step = 6 : i32}, {id = 5 : i32, resource = "register", time_step = 7 : i32}, {id = 5 : i32, resource = "register", time_step = 8 : i32}, {id = 5 : i32, resource = "register", time_step = 9 : i32}, {id = 5 : i32, resource = "register", time_step = 10 : i32}, {id = 5 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %74 = "neura.data_mov"(%57) {mapping_locs = [{id = 13 : i32, resource = "link", time_step = 7 : i32}, {id = 11 : i32, resource = "link", time_step = 8 : i32}, {id = 0 : i32, resource = "link", time_step = 9 : i32}, {id = 6 : i32, resource = "register", time_step = 10 : i32}, {id = 6 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %75 = neura.grant_predicate %73, %74 {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 12 : i32, x = 1 : i32, y = 0 : i32}]} : !neura.data, !neura.data -> !neura.data +// FUSE-MAPPING-NEXT: %76 = "neura.data_mov"(%63) {mapping_locs = []} : (!neura.data, i1>) -> !neura.data, i1> +// FUSE-MAPPING-NEXT: %77 = "neura.data_mov"(%17) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %78 = neura.load_indexed %76[%77 : !neura.data] !neura.data, i1> {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 9 : i32, x = 1 : i32, y = 1 : i32}]} : !neura.data +// FUSE-MAPPING-NEXT: %79 = "neura.data_mov"(%78) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 9 : i32}, {id = 36 : i32, resource = "register", time_step = 10 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %80 = "neura.data_mov"(%66) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %81 = "neura.mul"(%79, %80) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 11 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %82 = "neura.data_mov"(%81) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %83 = "neura.data_mov"(%69) {mapping_locs = [{id = 16 : i32, resource = "link", time_step = 10 : i32}, {id = 36 : i32, resource = "register", time_step = 11 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %84 = "neura.add"(%82, %83) {mapping_locs = [{id = 9 : i32, resource = "tile", time_step = 12 : i32, x = 1 : i32, y = 2 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %85 = "neura.data_mov"(%60) {mapping_locs = [{id = 15 : i32, resource = "link", time_step = 12 : i32}, {id = 4 : i32, resource = "register", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %86 = "neura.data_mov"(%84) {mapping_locs = [{id = 29 : i32, resource = "link", time_step = 12 : i32}, {id = 15 : i32, resource = "link", time_step = 13 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %87 = "neura.add"(%85, %86) {mapping_locs = [{id = 1 : i32, resource = "tile", time_step = 14 : i32, x = 1 : i32, y = 0 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %88 = "neura.data_mov"(%17) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %89 = "neura.data_mov"(%72) {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 11 : i32}, {id = 20 : i32, resource = "register", time_step = 12 : i32}]} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: %90 = "neura.add"(%88, %89) {mapping_locs = [{id = 5 : i32, resource = "tile", time_step = 13 : i32, x = 1 : i32, y = 1 : i32}]} : (!neura.data, !neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: neura.ctrl_mov %90 -> %15 {mapping_locs = []} : !neura.data !neura.data +// FUSE-MAPPING-NEXT: neura.ctrl_mov %87 -> %12 {mapping_locs = [{id = 2 : i32, resource = "link", time_step = 14 : i32}]} : !neura.data !neura.data +// FUSE-MAPPING-NEXT: neura.ctrl_mov %75 -> %9 {mapping_locs = [{id = 4 : i32, resource = "link", time_step = 12 : i32}, {id = 13 : i32, resource = "link", time_step = 13 : i32}]} : !neura.data !neura.data +// FUSE-MAPPING-NEXT: %91 = "neura.data_mov"(%31) {mapping_locs = []} : (!neura.data) -> !neura.data +// FUSE-MAPPING-NEXT: "neura.return"(%91) {mapping_locs = [{id = 0 : i32, resource = "tile", time_step = 17 : i32, x = 0 : i32, y = 0 : i32}]} : (!neura.data) -> () +// FUSE-MAPPING-NEXT: } \ No newline at end of file diff --git a/test/neura/ctrl/nested_branch.mlir b/test/neura/ctrl/nested_branch.mlir index 5977d418..7e897c10 100644 --- a/test/neura/ctrl/nested_branch.mlir +++ b/test/neura/ctrl/nested_branch.mlir @@ -60,7 +60,7 @@ 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 @@ -73,25 +73,25 @@ func.func @complex_test(%in: i64) -> f32 { // CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!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: %12 = "neura.not"(%11) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %13 = neura.grant_predicate %7, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.grant_predicate %9, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %3, %12 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = neura.grant_predicate %5, %12 : !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, %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: %22 = "neura.not"(%21) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %23 = neura.grant_predicate %20, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.grant_predicate %3, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %25 = neura.grant_predicate %5, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %26 = neura.grant_predicate %20, %22 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %27 = "neura.fadd"(%23, %24) : (!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: neura.ctrl_mov %25 -> %17 : !neura.data !neura.data +// CTRL2DATA-NEXT: %28 = "neura.fmul"(%13, %14) : (!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 a4bfd59b..f41f8ba3 100644 --- a/test/neura/for_loop/test.mlir +++ b/test/neura/for_loop/test.mlir @@ -19,7 +19,7 @@ // RUN: --transform-ctrl-to-data-flow \ // RUN: --fold-constant \ // RUN: --fuse-pattern \ -// RUN: | FileCheck %s --check-prefix=CHECK-FUSED +// RUN: | FileCheck %s --check-prefix=FUSE // RUN: mlir-neura-opt %t-kernel.mlir\ // RUN: --assign-accelerator \ @@ -30,7 +30,7 @@ // RUN: --fold-constant \ // RUN: --fuse-pattern \ // RUN: --insert-data-mov \ -// RUN: | FileCheck %s --check-prefix=CHECK-MOV +// RUN: | FileCheck %s --check-prefix=MOV // CHECK: 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-NEXT: %0 = "neura.constant"() <{predicate = true, value = "%arg0"}> : () -> !neura.data @@ -57,141 +57,141 @@ // CHECK-NEXT: } // Verifies the neura ops are generated. And fusion happens. -// CHECK-FUSED: llvm.func local_unnamed_addr @_Z6kernelPfS_S_(%arg0: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}, %arg1: !llvm.ptr {llvm.nocapture, llvm.noundef}, %arg2: !llvm.ptr {llvm.nocapture, llvm.noundef, llvm.readonly}) attributes {accelerator = "neura", memory_effects = #llvm.memory_effects, no_unwind, passthrough = ["mustprogress", "nofree", "norecurse", "nosync", ["uwtable", "2"], ["min-legal-vector-width", "0"], ["no-trapping-math", "true"], ["stack-protector-buffer-size", "8"], ["target-cpu", "x86-64"]], target_cpu = "x86-64", target_features = #llvm.target_features<["+cmov", "+cx8", "+fxsr", "+mmx", "+sse", "+sse2", "+x87"]>, tune_cpu = "generic"} { -// CHECK-FUSED-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %3 = "neura.grant_once"() <{constant_value = "%arg2"}> : () -> !neura.data -// CHECK-FUSED-NEXT: %4 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %5 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %6 = "neura.grant_once"() <{constant_value = 32 : i64}> : () -> !neura.data -// CHECK-FUSED-NEXT: %7 = "neura.load"(%2) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %9 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %10 = "neura.phi"(%9, %6) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %11 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %12 = "neura.phi"(%11, %5) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %13 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %14 = "neura.phi"(%13, %1) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %15 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %16 = "neura.phi"(%15, %3) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %17 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %18 = "neura.phi"(%17, %0) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %19 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %20 = "neura.phi"(%19, %8) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %21 = neura.reserve : !neura.data -// CHECK-FUSED-NEXT: %22 = "neura.phi"(%21, %4) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %23 = "neura.gep"(%18, %22) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %24 = "neura.load"(%23) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %25 = "neura.gep"(%16, %22) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %26 = "neura.load"(%25) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %27 = "neura.fmul_fadd"(%24, %26, %20) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: "neura.store"(%27, %14) : (!neura.data, !neura.data) -> () -// CHECK-FUSED-NEXT: %28 = "neura.add"(%22, %12) : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %29 = "neura.icmp"(%28, %10) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %30 = "neura.not"(%29) : (!neura.data) -> !neura.data -// CHECK-FUSED-NEXT: %31 = neura.grant_predicate %28, %30 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %31 -> %21 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %32 = neura.grant_predicate %27, %30 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %32 -> %19 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %33 = neura.grant_predicate %0, %30 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %33 -> %17 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %34 = neura.grant_predicate %3, %30 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %34 -> %15 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %35 = neura.grant_predicate %1, %30 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %35 -> %13 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %36 = neura.grant_predicate %5, %30 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %36 -> %11 : !neura.data !neura.data -// CHECK-FUSED-NEXT: %37 = neura.grant_predicate %6, %30 : !neura.data, !neura.data -> !neura.data -// CHECK-FUSED-NEXT: neura.ctrl_mov %37 -> %9 : !neura.data !neura.data -// CHECK-FUSED-NEXT: "neura.return"() : () -> () -// CHECK-FUSED-NEXT: } +// FUSE: 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"} { +// FUSE-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data +// FUSE-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data +// FUSE-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data +// FUSE-NEXT: %3 = "neura.grant_once"() <{constant_value = "%arg2"}> : () -> !neura.data +// FUSE-NEXT: %4 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// FUSE-NEXT: %5 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data +// FUSE-NEXT: %6 = "neura.grant_once"() <{constant_value = 32 : i64}> : () -> !neura.data +// FUSE-NEXT: %7 = "neura.load"(%2) : (!neura.data) -> !neura.data +// FUSE-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data +// FUSE-NEXT: %9 = neura.reserve : !neura.data +// FUSE-NEXT: %10 = "neura.phi"(%9, %6) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %11 = neura.reserve : !neura.data +// FUSE-NEXT: %12 = "neura.phi"(%11, %5) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %13 = neura.reserve : !neura.data +// FUSE-NEXT: %14 = "neura.phi"(%13, %1) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %15 = neura.reserve : !neura.data +// FUSE-NEXT: %16 = "neura.phi"(%15, %3) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %17 = neura.reserve : !neura.data +// FUSE-NEXT: %18 = "neura.phi"(%17, %0) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %19 = neura.reserve : !neura.data +// FUSE-NEXT: %20 = "neura.phi"(%19, %8) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %21 = neura.reserve : !neura.data +// FUSE-NEXT: %22 = "neura.phi"(%21, %4) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %23 = "neura.gep"(%18, %22) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %24 = "neura.load"(%23) : (!neura.data) -> !neura.data +// FUSE-NEXT: %25 = "neura.gep"(%16, %22) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %26 = "neura.load"(%25) : (!neura.data) -> !neura.data +// FUSE-NEXT: %27 = "neura.fmul_fadd"(%24, %26, %20) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: "neura.store"(%27, %14) : (!neura.data, !neura.data) -> () +// FUSE-NEXT: %28 = "neura.add"(%22, %12) : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %29 = "neura.icmp"(%28, %10) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// FUSE-NEXT: %30 = "neura.not"(%29) : (!neura.data) -> !neura.data +// FUSE-NEXT: %31 = neura.grant_predicate %28, %30 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %31 -> %21 : !neura.data !neura.data +// FUSE-NEXT: %32 = neura.grant_predicate %27, %30 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %32 -> %19 : !neura.data !neura.data +// FUSE-NEXT: %33 = neura.grant_predicate %0, %30 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %33 -> %17 : !neura.data !neura.data +// FUSE-NEXT: %34 = neura.grant_predicate %3, %30 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %34 -> %15 : !neura.data !neura.data +// FUSE-NEXT: %35 = neura.grant_predicate %1, %30 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %35 -> %13 : !neura.data !neura.data +// FUSE-NEXT: %36 = neura.grant_predicate %5, %30 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %36 -> %11 : !neura.data !neura.data +// FUSE-NEXT: %37 = neura.grant_predicate %6, %30 : !neura.data, !neura.data -> !neura.data +// FUSE-NEXT: neura.ctrl_mov %37 -> %9 : !neura.data !neura.data +// FUSE-NEXT: "neura.return"() : () -> () +// FUSE-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.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data -// CHECK-MOV-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data -// CHECK-MOV-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data -// CHECK-MOV-NEXT: %3 = "neura.grant_once"() <{constant_value = "%arg2"}> : () -> !neura.data -// CHECK-MOV-NEXT: %4 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %5 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %6 = "neura.grant_once"() <{constant_value = 32 : i64}> : () -> !neura.data -// CHECK-MOV-NEXT: %7 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %8 = "neura.load"(%7) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %9 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %11 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %12 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %13 = "neura.phi"(%11, %12) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %14 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %15 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %16 = "neura.phi"(%14, %15) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %17 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %18 = "neura.data_mov"(%1) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %19 = "neura.phi"(%17, %18) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %20 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %21 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %22 = "neura.phi"(%20, %21) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %23 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %24 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %25 = "neura.phi"(%23, %24) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %26 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %27 = "neura.data_mov"(%10) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %28 = "neura.phi"(%26, %27) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %29 = neura.reserve : !neura.data -// CHECK-MOV-NEXT: %30 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %31 = "neura.phi"(%29, %30) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %32 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %33 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %34 = "neura.gep"(%32, %33) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %35 = "neura.data_mov"(%34) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %36 = "neura.load"(%35) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %37 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %38 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %39 = "neura.gep"(%37, %38) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %40 = "neura.data_mov"(%39) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %41 = "neura.load"(%40) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %42 = "neura.data_mov"(%36) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %43 = "neura.data_mov"(%41) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %44 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %45 = "neura.fmul_fadd"(%42, %43, %44) : (!neura.data, !neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %46 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %47 = "neura.data_mov"(%19) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: "neura.store"(%46, %47) : (!neura.data, !neura.data) -> () -// CHECK-MOV-NEXT: %48 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %49 = "neura.data_mov"(%16) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %50 = "neura.add"(%48, %49) : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %51 = "neura.data_mov"(%50) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %52 = "neura.data_mov"(%13) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %53 = "neura.icmp"(%51, %52) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data -// CHECK-MOV-NEXT: %54 = "neura.data_mov"(%53) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %55 = "neura.not"(%54) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %56 = "neura.data_mov"(%50) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %57 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %58 = neura.grant_predicate %56, %57 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %58 -> %29 : !neura.data !neura.data -// CHECK-MOV-NEXT: %59 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %60 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %61 = neura.grant_predicate %59, %60 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %61 -> %26 : !neura.data !neura.data -// CHECK-MOV-NEXT: %62 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %63 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %64 = neura.grant_predicate %62, %63 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %64 -> %23 : !neura.data !neura.data -// CHECK-MOV-NEXT: %65 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %66 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %67 = neura.grant_predicate %65, %66 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %67 -> %20 : !neura.data !neura.data -// CHECK-MOV-NEXT: %68 = "neura.data_mov"(%1) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %69 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %70 = neura.grant_predicate %68, %69 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %70 -> %17 : !neura.data !neura.data -// CHECK-MOV-NEXT: %71 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %72 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %73 = neura.grant_predicate %71, %72 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %73 -> %14 : !neura.data !neura.data -// CHECK-MOV-NEXT: %74 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %75 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data -// CHECK-MOV-NEXT: %76 = neura.grant_predicate %74, %75 : !neura.data, !neura.data -> !neura.data -// CHECK-MOV-NEXT: neura.ctrl_mov %76 -> %11 : !neura.data !neura.data -// CHECK-MOV-NEXT: "neura.return"() : () -> () -// CHECK-MOV-NEXT: } \ No newline at end of file +// 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"} { +// MOV-NEXT: %0 = "neura.grant_once"() <{constant_value = "%arg0"}> : () -> !neura.data +// MOV-NEXT: %1 = "neura.grant_once"() <{constant_value = "%arg1"}> : () -> !neura.data +// MOV-NEXT: %2 = "neura.constant"() <{predicate = true, value = "%arg1"}> : () -> !neura.data +// MOV-NEXT: %3 = "neura.grant_once"() <{constant_value = "%arg2"}> : () -> !neura.data +// MOV-NEXT: %4 = "neura.grant_once"() <{constant_value = 0 : i64}> : () -> !neura.data +// MOV-NEXT: %5 = "neura.grant_once"() <{constant_value = 1 : i64}> : () -> !neura.data +// MOV-NEXT: %6 = "neura.grant_once"() <{constant_value = 32 : i64}> : () -> !neura.data +// MOV-NEXT: %7 = "neura.data_mov"(%2) : (!neura.data) -> !neura.data +// MOV-NEXT: %8 = "neura.load"(%7) : (!neura.data) -> !neura.data +// MOV-NEXT: %9 = "neura.data_mov"(%8) : (!neura.data) -> !neura.data +// MOV-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data +// MOV-NEXT: %11 = neura.reserve : !neura.data +// MOV-NEXT: %12 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data +// MOV-NEXT: %13 = "neura.phi"(%11, %12) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %14 = neura.reserve : !neura.data +// MOV-NEXT: %15 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data +// MOV-NEXT: %16 = "neura.phi"(%14, %15) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %17 = neura.reserve : !neura.data +// MOV-NEXT: %18 = "neura.data_mov"(%1) : (!neura.data) -> !neura.data +// MOV-NEXT: %19 = "neura.phi"(%17, %18) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %20 = neura.reserve : !neura.data +// MOV-NEXT: %21 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// MOV-NEXT: %22 = "neura.phi"(%20, %21) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %23 = neura.reserve : !neura.data +// MOV-NEXT: %24 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data +// MOV-NEXT: %25 = "neura.phi"(%23, %24) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %26 = neura.reserve : !neura.data +// MOV-NEXT: %27 = "neura.data_mov"(%10) : (!neura.data) -> !neura.data +// MOV-NEXT: %28 = "neura.phi"(%26, %27) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %29 = neura.reserve : !neura.data +// MOV-NEXT: %30 = "neura.data_mov"(%4) : (!neura.data) -> !neura.data +// MOV-NEXT: %31 = "neura.phi"(%29, %30) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %32 = "neura.data_mov"(%25) : (!neura.data) -> !neura.data +// MOV-NEXT: %33 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data +// MOV-NEXT: %34 = "neura.gep"(%32, %33) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %35 = "neura.data_mov"(%34) : (!neura.data) -> !neura.data +// MOV-NEXT: %36 = "neura.load"(%35) : (!neura.data) -> !neura.data +// MOV-NEXT: %37 = "neura.data_mov"(%22) : (!neura.data) -> !neura.data +// MOV-NEXT: %38 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data +// MOV-NEXT: %39 = "neura.gep"(%37, %38) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %40 = "neura.data_mov"(%39) : (!neura.data) -> !neura.data +// MOV-NEXT: %41 = "neura.load"(%40) : (!neura.data) -> !neura.data +// MOV-NEXT: %42 = "neura.data_mov"(%36) : (!neura.data) -> !neura.data +// MOV-NEXT: %43 = "neura.data_mov"(%41) : (!neura.data) -> !neura.data +// MOV-NEXT: %44 = "neura.data_mov"(%28) : (!neura.data) -> !neura.data +// MOV-NEXT: %45 = "neura.fmul_fadd"(%42, %43, %44) : (!neura.data, !neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %46 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// MOV-NEXT: %47 = "neura.data_mov"(%19) : (!neura.data) -> !neura.data +// MOV-NEXT: "neura.store"(%46, %47) : (!neura.data, !neura.data) -> () +// MOV-NEXT: %48 = "neura.data_mov"(%31) : (!neura.data) -> !neura.data +// MOV-NEXT: %49 = "neura.data_mov"(%16) : (!neura.data) -> !neura.data +// MOV-NEXT: %50 = "neura.add"(%48, %49) : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %51 = "neura.data_mov"(%50) : (!neura.data) -> !neura.data +// MOV-NEXT: %52 = "neura.data_mov"(%13) : (!neura.data) -> !neura.data +// MOV-NEXT: %53 = "neura.icmp"(%51, %52) <{cmpType = "eq"}> : (!neura.data, !neura.data) -> !neura.data +// MOV-NEXT: %54 = "neura.data_mov"(%53) : (!neura.data) -> !neura.data +// MOV-NEXT: %55 = "neura.not"(%54) : (!neura.data) -> !neura.data +// MOV-NEXT: %56 = "neura.data_mov"(%50) : (!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: neura.ctrl_mov %58 -> %29 : !neura.data !neura.data +// MOV-NEXT: %59 = "neura.data_mov"(%45) : (!neura.data) -> !neura.data +// MOV-NEXT: %60 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// MOV-NEXT: %61 = neura.grant_predicate %59, %60 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %61 -> %26 : !neura.data !neura.data +// MOV-NEXT: %62 = "neura.data_mov"(%0) : (!neura.data) -> !neura.data +// MOV-NEXT: %63 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// MOV-NEXT: %64 = neura.grant_predicate %62, %63 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %64 -> %23 : !neura.data !neura.data +// MOV-NEXT: %65 = "neura.data_mov"(%3) : (!neura.data) -> !neura.data +// MOV-NEXT: %66 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// MOV-NEXT: %67 = neura.grant_predicate %65, %66 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %67 -> %20 : !neura.data !neura.data +// MOV-NEXT: %68 = "neura.data_mov"(%1) : (!neura.data) -> !neura.data +// MOV-NEXT: %69 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// MOV-NEXT: %70 = neura.grant_predicate %68, %69 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %70 -> %17 : !neura.data !neura.data +// MOV-NEXT: %71 = "neura.data_mov"(%5) : (!neura.data) -> !neura.data +// MOV-NEXT: %72 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// MOV-NEXT: %73 = neura.grant_predicate %71, %72 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %73 -> %14 : !neura.data !neura.data +// MOV-NEXT: %74 = "neura.data_mov"(%6) : (!neura.data) -> !neura.data +// MOV-NEXT: %75 = "neura.data_mov"(%55) : (!neura.data) -> !neura.data +// MOV-NEXT: %76 = neura.grant_predicate %74, %75 : !neura.data, !neura.data -> !neura.data +// MOV-NEXT: neura.ctrl_mov %76 -> %11 : !neura.data !neura.data +// MOV-NEXT: "neura.return"() : () -> () +// MOV-NEXT: } \ No newline at end of file