diff --git a/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp b/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp index 465c44a2..69ff0832 100644 --- a/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp +++ b/lib/NeuraDialect/Transforms/TransformCtrlToDataFlowPass.cpp @@ -14,6 +14,7 @@ #include "mlir/Pass/Pass.h" #include "mlir/Support/LLVM.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/MapVector.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Error.h" #include "llvm/Support/raw_ostream.h" @@ -25,9 +26,6 @@ using namespace mlir; #define GEN_PASS_DEF_TransformCtrlToDataFlow #include "NeuraDialect/NeuraPasses.h.inc" -// TODO: Needs to enbale a deterministic ctrol to data flow transformation -// https://github.com/coredac/dataflow/issues/64 - // Inserts `grant_once` for every predicated value defined in the entry block // that is used outside of the block (i.e., a live-out). void GrantPredicateInEntryBlock(Block *entry_block, OpBuilder &builder) { @@ -115,15 +113,16 @@ struct ControlFlowInfo { SmallVector passed_values; // Values passed to the target block. bool is_back_edge; }; - std::vector> all_edges; // All edges in the function. - DenseMap> + SmallVector> all_edges; // All edges in the function. + llvm::MapVector> incoming_edges; // Incoming edges for each block. - DenseMap> + llvm::MapVector> outgoing_edges; // Outgoing edges for each block. - DenseMap> back_edges; - DenseMap> forward_edges; - DenseSet blocks_with_back_edges; // Blocks with backward edges. + llvm::MapVector> back_edges; + llvm::MapVector> forward_edges; + llvm::SmallVector + blocks_with_back_edges; // Blocks with backward edges. Edge *createEdge() { all_edges.push_back(std::make_unique()); @@ -235,13 +234,13 @@ void buildControlFlowInfo(func::FuncOp &func, ControlFlowInfo &ctrl_info, // Handles back edges. if (true_edge->is_back_edge) { ctrl_info.back_edges[&block].push_back(true_edge); - ctrl_info.blocks_with_back_edges.insert(&block); + ctrl_info.blocks_with_back_edges.push_back(&block); } else { ctrl_info.forward_edges[&block].push_back(true_edge); } if (false_edge->is_back_edge) { ctrl_info.back_edges[&block].push_back(false_edge); - ctrl_info.blocks_with_back_edges.insert(&block); + ctrl_info.blocks_with_back_edges.push_back(&block); } else { ctrl_info.forward_edges[&block].push_back(false_edge); } @@ -267,7 +266,7 @@ void buildControlFlowInfo(func::FuncOp &func, ControlFlowInfo &ctrl_info, // Handles back edges. if (edge->is_back_edge) { ctrl_info.back_edges[&block].push_back(edge); - ctrl_info.blocks_with_back_edges.insert(&block); + ctrl_info.blocks_with_back_edges.push_back(&block); } else { ctrl_info.forward_edges[&block].push_back(edge); } @@ -282,7 +281,7 @@ void buildControlFlowInfo(func::FuncOp &func, ControlFlowInfo &ctrl_info, } Value getPrecessedCondition(Value condition, bool is_not_condition, - DenseMap &condition_cache, + llvm::MapVector &condition_cache, OpBuilder &builder) { if (!is_not_condition) { return condition; @@ -302,8 +301,8 @@ Value getPrecessedCondition(Value condition, bool is_not_condition, } void createReserveAndPhiOps(func::FuncOp &func, ControlFlowInfo &ctrl_info, - DenseMap &arg_to_reserve, - DenseMap &arg_to_phi_result, + llvm::MapVector &arg_to_reserve, + llvm::MapVector &arg_to_phi_result, OpBuilder &builder) { DominanceInfo dom_info(func); @@ -318,16 +317,17 @@ void createReserveAndPhiOps(func::FuncOp &func, ControlFlowInfo &ctrl_info, // Type 6: Forward br edges without values. // For Backward edges without values, they can be transformed into type 1 or 2 - DenseMap> + // Uses llvm::MapVector instead of DenseMap to maintain insertion order. + llvm::MapVector> backward_value_edges; - DenseMap> + llvm::MapVector> forward_value_edges; - DenseMap> + llvm::MapVector> block_conditional_edges; - DenseMap condition_cache; + llvm::MapVector condition_cache; - DenseMap> arg_to_phi_operands; + llvm::MapVector> arg_to_phi_operands; for (auto &edge : ctrl_info.all_edges) { Block *target = edge->target; @@ -431,8 +431,6 @@ void createReserveAndPhiOps(func::FuncOp &func, ControlFlowInfo &ctrl_info, // ================================================ // Step 4: Creates phi operations for each block argument. // ================================================ - DenseSet args_needing_phi; - for (auto &arg_to_phi_pair : arg_to_phi_operands) { BlockArgument arg = arg_to_phi_pair.first; auto &phi_operands = arg_to_phi_pair.second; @@ -501,7 +499,8 @@ void createReserveAndPhiOps(func::FuncOp &func, ControlFlowInfo &ctrl_info, if (target->getArguments().empty()) { // Grants predicate for all the live-in values in the target block. - DenseSet live_in_values; + // 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() && @@ -562,8 +561,8 @@ void transformControlFlowToDataFlow(func::FuncOp &func, assertLiveOutValuesDominatedByBlockArgs(func); // Creates reserve and phi operations for each block argument. - DenseMap arg_to_reserve; - DenseMap arg_to_phi_result; + llvm::MapVector arg_to_reserve; + llvm::MapVector arg_to_phi_result; createReserveAndPhiOps(func, ctrl_info, arg_to_reserve, arg_to_phi_result, builder); diff --git a/test/affine2neura/bert/bert_node1/bert_node1.mlir b/test/affine2neura/bert/bert_node1/bert_node1.mlir index ebaca758..f9cf5a7e 100644 --- a/test/affine2neura/bert/bert_node1/bert_node1.mlir +++ b/test/affine2neura/bert/bert_node1/bert_node1.mlir @@ -66,19 +66,19 @@ module attributes {} { // CTRL2DATA-NEXT: %17 = "neura.cast"(%16) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data // CTRL2DATA-NEXT: %18 = "neura.icmp"(%17, %3) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %19 = "neura.not"(%18) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[VAL1:.*]] = neura.grant_predicate %5, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL2:.*]] = neura.grant_predicate %17, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %22 = neura.load_indexed %arg0[%[[VAL1:.*]], %[[VAL1:.*]], %[[VAL1:.*]], %[[VAL1:.*]], %[[VAL1:.*]], %[[VAL2:.*]] : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %5, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %21 = neura.grant_predicate %17, %18 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.load_indexed %arg0[%20, %20, %20, %20, %20, %21 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data // CTRL2DATA-NEXT: %23 = neura.grant_predicate %10, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %22 to %arg1[%[[VAL1:.*]], %[[VAL1:.*]], %23, %[[VAL1:.*]], %[[VAL1:.*]], %[[VAL2:.*]] : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %22 to %arg1[%20, %20, %23, %20, %20, %21 : !neura.data, !neura.data, !neura.data, !neura.data, !neura.data, !neura.data] memref : !neura.data // CTRL2DATA-NEXT: %24 = neura.grant_predicate %1, %18 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %25 = "neura.add"(%[[VAL2:.*]], %24) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %25 = "neura.add"(%21, %24) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %26 = "neura.cast"(%25) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data // CTRL2DATA-NEXT: neura.ctrl_mov %26 -> %15 : !neura.data !neura.data -// CTRL2DATA-DAG: %[[VAL3:.*]] = neura.grant_predicate %10, %19 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL4:.*]] = neura.grant_predicate %1, %19 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %29 = "neura.add"(%[[VAL3:.*]], %[[VAL4:.*]]) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %27 = neura.grant_predicate %10, %19 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %28 = neura.grant_predicate %1, %19 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %29 = "neura.add"(%27, %28) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %30 = "neura.cast"(%29) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data // CTRL2DATA-NEXT: neura.ctrl_mov %30 -> %8 : !neura.data !neura.data // CTRL2DATA-NEXT: "neura.return"() : () -> () -// CTRL2DATA-NEXT: } \ No newline at end of file +// CTRL2DATA-NEXT: } \ No newline at end of file diff --git a/test/affine2neura/bert/bert_node28/bert_node28.mlir b/test/affine2neura/bert/bert_node28/bert_node28.mlir index d73589b7..6f6daf41 100644 --- a/test/affine2neura/bert/bert_node28/bert_node28.mlir +++ b/test/affine2neura/bert/bert_node28/bert_node28.mlir @@ -66,58 +66,58 @@ module attributes {} { // 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"() <{value = 768 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.constant"() <{value = 1 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.constant"() <{value = 128 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.constant"() <{value = 0 : index}> : () -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.cast"(%6) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %9) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %12 = "neura.cast"(%11) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %13 = "neura.icmp"(%12, %5) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.not"(%13) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = neura.grant_predicate %7, %13 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.cast"(%15) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %18 = "neura.phi"(%17, %16) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %19 = "neura.cast"(%18) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %20 = "neura.icmp"(%19, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %21 = "neura.not"(%20) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %22 = neura.grant_predicate %7, %20 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %23 = "neura.cast"(%22) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %24 = neura.reserve : !neura.data -// CTRL2DATA-NEXT: %25 = "neura.phi"(%24, %23) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %26 = "neura.cast"(%25) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %27 = "neura.icmp"(%26, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %28 = "neura.not"(%27) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[VAL1:.*]] = neura.grant_predicate %26, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL2:.*]] = neura.grant_predicate %12, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL3:.*]] = neura.grant_predicate %7, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %32 = neura.load_indexed %arg0[%[[VAL3:.*]], %[[VAL2:.*]], %[[VAL1:.*]] : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %33 = neura.grant_predicate %19, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %34 = neura.load_indexed %arg1[%[[VAL3:.*]], %[[VAL1:.*]], %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %35 = neura.load_indexed %arg2[%[[VAL3:.*]], %[[VAL2:.*]], %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %36 = "neura.fmul"(%32, %34) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %37 = "neura.fadd"(%35, %36) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.store_indexed %37 to %arg2[%[[VAL3:.*]], %[[VAL2:.*]], %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data -// CTRL2DATA-NEXT: %38 = neura.grant_predicate %3, %27 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %39 = "neura.add"(%[[VAL1:.*]], %38) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %40 = "neura.cast"(%39) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %40 -> %24 : !neura.data !neura.data -// CTRL2DATA-DAG: %[[VAL4:.*]] = neura.grant_predicate %19, %28 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL5:.*]] = neura.grant_predicate %3, %28 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %43 = "neura.add"(%[[VAL4:.*]], %[[VAL5:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %44 = "neura.cast"(%43) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %44 -> %17 : !neura.data !neura.data -// CTRL2DATA-DAG: %[[VAL6:.*]] = neura.grant_predicate %3, %21 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL7:.*]] = neura.grant_predicate %12, %21 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %47 = "neura.add"(%[[VAL7:.*]], %[[VAL6:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %48 = "neura.cast"(%47) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: neura.ctrl_mov %48 -> %10 : !neura.data !neura.data -// CTRL2DATA-NEXT: "neura.return"() : () -> () -// CTRL2DATA-NEXT: } \ No newline at end of file +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{value = 768 : index}> : () -> !neura.data +// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{value = 1 : index}> : () -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.grant_always"(%2) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{value = 128 : index}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{value = 0 : index}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.cast"(%6) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %9) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = "neura.cast"(%11) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.icmp"(%12, %5) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.not"(%13) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %7, %13 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.cast"(%15) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %17 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %18 = "neura.phi"(%17, %16) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %19 = "neura.cast"(%18) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = "neura.icmp"(%19, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %21 = "neura.not"(%20) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %22 = neura.grant_predicate %7, %20 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %23 = "neura.cast"(%22) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %24 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %25 = "neura.phi"(%24, %23) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %26 = "neura.cast"(%25) <{cast_type = "int_to_index"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %27 = "neura.icmp"(%26, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %28 = "neura.not"(%27) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %29 = neura.grant_predicate %7, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %30 = neura.grant_predicate %12, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %31 = neura.grant_predicate %26, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %32 = neura.load_indexed %arg0[%29, %30, %31 : !neura.data, !neura.data, !neura.data] memref : !neura.data +// CTRL2DATA-NEXT: %33 = neura.grant_predicate %19, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %34 = neura.load_indexed %arg1[%29, %31, %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data +// CTRL2DATA-NEXT: %35 = neura.load_indexed %arg2[%29, %30, %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data +// CTRL2DATA-NEXT: %36 = "neura.fmul"(%32, %34) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %37 = "neura.fadd"(%35, %36) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.store_indexed %37 to %arg2[%29, %30, %33 : !neura.data, !neura.data, !neura.data] memref : !neura.data +// CTRL2DATA-NEXT: %38 = neura.grant_predicate %3, %27 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %39 = "neura.add"(%31, %38) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %40 = "neura.cast"(%39) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %40 -> %24 : !neura.data !neura.data +// CTRL2DATA-NEXT: %41 = neura.grant_predicate %19, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %42 = neura.grant_predicate %3, %28 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %43 = "neura.add"(%41, %42) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %44 = "neura.cast"(%43) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %44 -> %17 : !neura.data !neura.data +// CTRL2DATA-NEXT: %45 = neura.grant_predicate %12, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %46 = neura.grant_predicate %3, %21 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %47 = "neura.add"(%45, %46) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %48 = "neura.cast"(%47) <{cast_type = "index_to_int"}> : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %48 -> %10 : !neura.data !neura.data +// CTRL2DATA-NEXT: "neura.return"() : () -> () +// CTRL2DATA-NEXT: } diff --git a/test/neura/ctrl/branch.mlir b/test/neura/ctrl/branch.mlir index cff2666d..fe0bc979 100644 --- a/test/neura/ctrl/branch.mlir +++ b/test/neura/ctrl/branch.mlir @@ -51,25 +51,25 @@ 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-NEXT: %0 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.constant"() <{predicate = true, value = 1.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.grant_once"(%1) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.grant_once"(%3) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.grant_once"(%5) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.constant"() <{predicate = true, value = 4.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %9 = "neura.icmp"(%arg0, %0) <{cmpType = "eq"}> : (i64, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[TRUE_VAL1:.*]] = neura.grant_predicate %6, %10 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[TRUE_VAL2:.*]] = neura.grant_predicate %8, %10 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[NOT:.*]] = "neura.not"(%10) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[FALSE_VAL1:.*]] = neura.grant_predicate %2, %[[NOT:.*]] : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[FALSE_VAL2:.*]] = neura.grant_predicate %4, %[[NOT:.*]] : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.fadd"(%[[FALSE_VAL1:.*]], %[[FALSE_VAL2:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = "neura.fmul"(%[[TRUE_VAL1:.*]], %[[TRUE_VAL2:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.phi"(%16, %17) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: "neura.return"(%18) : (!neura.data) -> () -// CTRL2DATA-NEXT: } \ No newline at end of file +// CTRL2DATA: func.func @test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %1 = "neura.constant"() <{predicate = true, value = 1.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %2 = "neura.grant_once"(%1) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.grant_once"(%3) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.grant_once"(%5) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.constant"() <{predicate = true, value = 4.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.icmp"(%arg0, %0) <{cmpType = "eq"}> : (i64, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %11 = neura.grant_predicate %6, %10 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.grant_predicate %8, %10 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.not"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.grant_predicate %2, %13 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %4, %13 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.fadd"(%14, %15) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %17 = "neura.fmul"(%11, %12) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = "neura.phi"(%16, %17) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: "neura.return"(%18) : (!neura.data) -> () +// CTRL2DATA-NEXT: } diff --git a/test/neura/ctrl/branch_for.mlir b/test/neura/ctrl/branch_for.mlir index ce20d515..60937c3e 100644 --- a/test/neura/ctrl/branch_for.mlir +++ b/test/neura/ctrl/branch_for.mlir @@ -76,31 +76,31 @@ func.func @loop_test() -> f32 { // CHECK-NEXT: } // CTRL2DATA: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { -// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %[[INT1:.*]] = "neura.grant_once"(%2) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %[[FLOAT1:.*]] = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[RESERVEINT:.*]] = neura.reserve : !neura.data -// CTRL2DATA-DAG: %[[PHIINT:.*]] = "neura.phi"(%[[RESERVEINT:.*]], %[[INT1:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[RESERVEFLOAT:.*]] = neura.reserve : !neura.data -// CTRL2DATA-DAG: %[[PHIFLOAT:.*]] = "neura.phi"(%[[RESERVEFLOAT:.*]], %[[FLOAT1:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %[[FLOAT2:.*]] = "neura.fadd"(%[[PHIFLOAT:.*]], %7) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %[[INT2:.*]] = "neura.add"(%[[PHIINT:.*]], %5) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.icmp"(%15, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[GRANTFLOAT:.*]] = neura.grant_predicate %[[FLOAT2:.*]], %16 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: neura.ctrl_mov %[[GRANTFLOAT:.*]] -> %[[RESERVEFLOAT:.*]] : !neura.data !neura.data -// CTRL2DATA-DAG: %[[GRANTINT:.*]] = neura.grant_predicate %[[INT2:.*]], %16 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: neura.ctrl_mov %[[GRANTINT:.*]] -> %[[RESERVEINT:.*]] : !neura.data !neura.data -// CTRL2DATA-NEXT: %19 = "neura.not"(%16) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %20 = neura.grant_predicate %14, %19 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: "neura.return"(%20) : (!neura.data) -> () -// CTRL2DATA-NEXT: } +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %1 = "neura.grant_always"(%0) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %2 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.grant_once"(%2) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.constant"() <{predicate = true, value = 1 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.grant_always"(%4) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.grant_always"(%6) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.constant"() <{predicate = true, value = 0.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %11 = "neura.phi"(%10, %9) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.reserve : !neura.data +// CTRL2DATA-NEXT: %13 = "neura.phi"(%12, %3) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.fadd"(%11, %7) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %15 = "neura.add"(%13, %5) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.icmp"(%15, %1) <{cmpType = "slt"}> : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %17 = neura.grant_predicate %15, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %17 -> %12 : !neura.data !neura.data +// CTRL2DATA-NEXT: %18 = neura.grant_predicate %14, %16 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: neura.ctrl_mov %18 -> %10 : !neura.data !neura.data +// CTRL2DATA-NEXT: %19 = "neura.not"(%16) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %20 = neura.grant_predicate %14, %19 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: "neura.return"(%20) : (!neura.data) -> () +// CTRL2DATA-NEXT: } // MOV: func.func @loop_test() -> f32 attributes {accelerator = "neura"} { // MOV-NEXT: %0 = "neura.constant"() <{predicate = true, value = 10 : i64}> : () -> !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 a3293386..f3be5d0c 100644 --- a/test/neura/ctrl/branch_with_and_without_arg.mlir +++ b/test/neura/ctrl/branch_with_and_without_arg.mlir @@ -59,12 +59,12 @@ func.func @test(%in: i64) -> f32 { // CTRL2DATA-NEXT: %7 = "neura.grant_once"(%6) : (!neura.data) -> !neura.data // CTRL2DATA-NEXT: %8 = "neura.icmp"(%arg0, %0) <{cmpType = "eq"}> : (i64, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %9 = "neura.grant_once"(%8) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[VAL1:.*]] = neura.grant_predicate %7, %9 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[NOT:.*]] = "neura.not"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[VAL2:.*]] = neura.grant_predicate %2, %[[NOT:.*]] : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL3:.*]] = neura.grant_predicate %5, %[[NOT:.*]] : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %14 = "neura.fadd"(%[[VAL2:.*]], %[[VAL3:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %15 = "neura.fmul"(%[[VAL1:.*]], %4) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = neura.grant_predicate %7, %9 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %11 = "neura.not"(%9) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.grant_predicate %2, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %13 = neura.grant_predicate %5, %11 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %14 = "neura.fadd"(%12, %13) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %15 = "neura.fmul"(%10, %4) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: %16 = "neura.phi"(%14, %15) : (!neura.data, !neura.data) -> !neura.data // CTRL2DATA-NEXT: "neura.return"(%16) : (!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 08f458c1..680cf88a 100644 --- a/test/neura/ctrl/branch_without_arg.mlir +++ b/test/neura/ctrl/branch_without_arg.mlir @@ -51,24 +51,24 @@ func.func @test(%in: i64) -> f32 { // CHECK-NEXT: } // CTRL2DATA: func.func @test(%arg0: i64) -> f32 attributes {accelerator = "neura"} { -// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data -// CTRL2DATA-NEXT: %1 = "neura.constant"() <{predicate = true, value = 1.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %2 = "neura.grant_always"(%1) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %4 = "neura.grant_always"(%3) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %5 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %6 = "neura.grant_once"(%5) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %7 = "neura.constant"() <{predicate = true, value = 4.000000e+00 : f32}> : () -> !neura.data -// CTRL2DATA-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data -// CTRL2DATA-NEXT: %9 = "neura.icmp"(%arg0, %0) <{cmpType = "eq"}> : (i64, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[VAL1:.*]] = neura.grant_predicate %6, %10 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL2:.*]] = neura.grant_predicate %8, %10 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %13 = "neura.not"(%10) : (!neura.data) -> !neura.data -// CTRL2DATA-DAG: %[[VAL3:.*]] = neura.grant_predicate %2, %13 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-DAG: %[[VAL4:.*]] = neura.grant_predicate %4, %13 : !neura.data, !neura.data -> !neura.data -// CTRL2DATA-NEXT: %16 = "neura.fadd"(%[[VAL3:.*]], %[[VAL4:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %17 = "neura.fmul"(%[[VAL1:.*]], %[[VAL2:.*]]) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: %18 = "neura.phi"(%16, %17) : (!neura.data, !neura.data) -> !neura.data -// CTRL2DATA-NEXT: "neura.return"(%18) : (!neura.data) -> () -// CTRL2DATA-NEXT: } \ No newline at end of file +// CTRL2DATA-NEXT: %0 = "neura.constant"() <{predicate = true, value = 0 : i64}> : () -> !neura.data +// CTRL2DATA-NEXT: %1 = "neura.constant"() <{predicate = true, value = 1.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %2 = "neura.grant_always"(%1) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %3 = "neura.constant"() <{predicate = true, value = 2.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %4 = "neura.grant_always"(%3) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %5 = "neura.constant"() <{predicate = true, value = 3.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %6 = "neura.grant_once"(%5) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %7 = "neura.constant"() <{predicate = true, value = 4.000000e+00 : f32}> : () -> !neura.data +// CTRL2DATA-NEXT: %8 = "neura.grant_once"(%7) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %9 = "neura.icmp"(%arg0, %0) <{cmpType = "eq"}> : (i64, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %10 = "neura.grant_once"(%9) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %11 = neura.grant_predicate %6, %10 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %12 = neura.grant_predicate %8, %10 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %13 = "neura.not"(%10) : (!neura.data) -> !neura.data +// CTRL2DATA-NEXT: %14 = neura.grant_predicate %2, %13 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %15 = neura.grant_predicate %4, %13 : !neura.data, !neura.data -> !neura.data +// CTRL2DATA-NEXT: %16 = "neura.fadd"(%14, %15) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %17 = "neura.fmul"(%11, %12) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: %18 = "neura.phi"(%16, %17) : (!neura.data, !neura.data) -> !neura.data +// CTRL2DATA-NEXT: "neura.return"(%18) : (!neura.data) -> () +// CTRL2DATA-NEXT: } \ No newline at end of file