| # RUN: tf-mlir-translate -graphdef-to-mlir -mlir-print-debuginfo %s -o - | FileCheck %s |
| |
| # Verify that importing a Graph with a backedge leads to two NextIteration nodes |
| # to break the cycle. |
| |
| # CHECK-LABEL: func @main() |
| # CHECK: %[[NEXTITERATION:[0-9]+]]:3 = tf_executor.NextIteration.Source |
| # CHECK: tf_executor.Merge {{.*}} %[[NEXTITERATION]]#0 |
| |
| # CHECK: tf_executor.NextIteration.Sink [%[[NEXTITERATION]]#1] |
| |
| node { |
| name: "Const" |
| op: "Const" |
| attr { |
| key: "dtype" |
| value { |
| type: DT_INT32 |
| } |
| } |
| attr { |
| key: "value" |
| value { |
| tensor { |
| dtype: DT_INT32 |
| tensor_shape { |
| } |
| int_val: 0 |
| } |
| } |
| } |
| } |
| node { |
| name: "while/Enter" |
| op: "Enter" |
| input: "Const" |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| attr { |
| key: "frame_name" |
| value { |
| s: "while/while_context" |
| } |
| } |
| attr { |
| key: "is_constant" |
| value { |
| b: false |
| } |
| } |
| attr { |
| key: "parallel_iterations" |
| value { |
| i: 10 |
| } |
| } |
| } |
| node { |
| name: "while/Merge" |
| op: "Merge" |
| input: "while/Enter" |
| input: "while/NextIteration" |
| attr { |
| key: "N" |
| value { |
| i: 2 |
| } |
| } |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| } |
| node { |
| name: "while/Less/y" |
| op: "Const" |
| input: "^while/Merge" |
| attr { |
| key: "dtype" |
| value { |
| type: DT_INT32 |
| } |
| } |
| attr { |
| key: "value" |
| value { |
| tensor { |
| dtype: DT_INT32 |
| tensor_shape { |
| } |
| int_val: 10 |
| } |
| } |
| } |
| } |
| node { |
| name: "while/Less" |
| op: "Less" |
| input: "while/Merge" |
| input: "while/Less/y" |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| } |
| node { |
| name: "while/LoopCond" |
| op: "LoopCond" |
| input: "while/Less" |
| } |
| node { |
| name: "while/Switch" |
| op: "Switch" |
| input: "while/Merge" |
| input: "while/LoopCond" |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| attr { |
| key: "_class" |
| value { |
| list { |
| s: "loc:@while/Merge" |
| } |
| } |
| } |
| } |
| node { |
| name: "while/Identity" |
| op: "Identity" |
| input: "while/Switch:1" |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| } |
| node { |
| name: "while/Add/y" |
| op: "Const" |
| input: "^while/Identity" |
| attr { |
| key: "dtype" |
| value { |
| type: DT_INT32 |
| } |
| } |
| attr { |
| key: "value" |
| value { |
| tensor { |
| dtype: DT_INT32 |
| tensor_shape { |
| } |
| int_val: 1 |
| } |
| } |
| } |
| } |
| node { |
| name: "while/Add" |
| op: "Add" |
| input: "while/Identity" |
| input: "while/Add/y" |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| } |
| node { |
| name: "while/NextIteration" |
| op: "NextIteration" |
| input: "while/Add" |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| experimental_debug_info { |
| original_node_names: "while" |
| } |
| } |
| node { |
| name: "while/Exit" |
| op: "Exit" |
| input: "while/Switch" |
| attr { |
| key: "T" |
| value { |
| type: DT_INT32 |
| } |
| } |
| } |
| library { |
| } |
| versions { |
| producer: 27 |
| } |
| |