@@ -69,4 +69,62 @@ func.func @while_loop2(%arg0: f32) -> i64 {
69
69
return %res : i64
70
70
}
71
71
72
+ // -----
73
+
74
+ // CHECK-LABEL: @while_loop_before_typeconv
75
+ func.func @while_loop_before_typeconv (%arg0: index ) -> i64 {
76
+ // CHECK-SAME: (%[[ARG:.*]]: i32)
77
+ // CHECK: %[[VAR:.*]] = spirv.Variable : !spirv.ptr<i64, Function>
78
+ // CHECK: spirv.mlir.loop {
79
+ // CHECK: spirv.Branch ^[[HEADER:.*]](%[[ARG]] : i32)
80
+ // CHECK: ^[[HEADER]](%[[INDVAR1:.*]]: i32):
81
+ // CHECK: spirv.BranchConditional %{{.*}}, ^[[BODY:.*]](%{{.*}} : i64), ^[[MERGE:.*]]
82
+ // CHECK: ^[[BODY]](%[[INDVAR2:.*]]: i64):
83
+ // CHECK: spirv.Branch ^[[HEADER]](%{{.*}} : i32)
84
+ // CHECK: ^[[MERGE]]:
85
+ // CHECK: spirv.mlir.merge
86
+ // CHECK: }
87
+ %res = scf.while (%arg1 = %arg0 ) : (index ) -> i64 {
88
+ %shared = " foo.shared_compute" (%arg1 ) : (index ) -> i64
89
+ %condition = " foo.evaluate_condition" (%arg1 , %shared ) : (index , i64 ) -> i1
90
+ scf.condition (%condition ) %shared : i64
91
+ } do {
92
+ ^bb0 (%arg2: i64 ):
93
+ %res = " foo.payload" (%arg2 ) : (i64 ) -> index
94
+ scf.yield %res : index
95
+ }
96
+ // CHECK: %[[OUT:.*]] = spirv.Load "Function" %[[VAR]] : i64
97
+ // CHECK: spirv.ReturnValue %[[OUT]] : i64
98
+ return %res : i64
99
+ }
100
+
101
+ // -----
102
+
103
+ // CHECK-LABEL: @while_loop_after_typeconv
104
+ func.func @while_loop_after_typeconv (%arg0: f32 ) -> index {
105
+ // CHECK-SAME: (%[[ARG:.*]]: f32)
106
+ // CHECK: %[[VAR:.*]] = spirv.Variable : !spirv.ptr<i32, Function>
107
+ // CHECK: spirv.mlir.loop {
108
+ // CHECK: spirv.Branch ^[[HEADER:.*]](%[[ARG]] : f32)
109
+ // CHECK: ^[[HEADER]](%[[INDVAR1:.*]]: f32):
110
+ // CHECK: spirv.BranchConditional %{{.*}}, ^[[BODY:.*]](%{{.*}} : i32), ^[[MERGE:.*]]
111
+ // CHECK: ^[[BODY]](%[[INDVAR2:.*]]: i32):
112
+ // CHECK: spirv.Branch ^[[HEADER]](%{{.*}} : f32)
113
+ // CHECK: ^[[MERGE]]:
114
+ // CHECK: spirv.mlir.merge
115
+ // CHECK: }
116
+ %res = scf.while (%arg1 = %arg0 ) : (f32 ) -> index {
117
+ %shared = " foo.shared_compute" (%arg1 ) : (f32 ) -> index
118
+ %condition = " foo.evaluate_condition" (%arg1 , %shared ) : (f32 , index ) -> i1
119
+ scf.condition (%condition ) %shared : index
120
+ } do {
121
+ ^bb0 (%arg2: index ):
122
+ %res = " foo.payload" (%arg2 ) : (index ) -> f32
123
+ scf.yield %res : f32
124
+ }
125
+ // CHECK: %[[OUT:.*]] = spirv.Load "Function" %[[VAR]] : i32
126
+ // CHECK: spirv.ReturnValue %[[OUT]] : i32
127
+ return %res : index
128
+ }
129
+
72
130
} // end module
0 commit comments