@@ -55,3 +55,121 @@ module {
5555 return
5656 }
5757}
58+
59+ // -----
60+
61+ // Test simplify `scf.index_switch` with nested `affine.parallel`s
62+
63+ // CHECK-LABEL: func.func @main(
64+ // CHECK-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: memref<4x6xf32>,
65+ // CHECK-SAME: %[[VAL_1:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: memref<4x6xf32>,
66+ // CHECK-SAME: %[[VAL_2:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: memref<4x6xf32>,
67+ // CHECK-SAME: %[[VAL_3:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: memref<4x6xf32>,
68+ // CHECK-SAME: %[[VAL_4:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: memref<4x6xf32>,
69+ // CHECK-SAME: %[[VAL_5:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: memref<4x6xf32>) {
70+ // CHECK: %[[VAL_6:.*]] = arith.constant 0.000000e+00 : f32
71+ // CHECK: affine.for %[[VAL_7:.*]] = 0 to 8 step 2 {
72+ // CHECK: affine.parallel (%[[VAL_8:.*]]) = (0) to (2) {
73+ // CHECK: affine.for %[[VAL_9:.*]] = 0 to 18 step 3 {
74+ // CHECK: affine.parallel (%[[VAL_10:.*]]) = (0) to (3) {
75+ // CHECK: scf.index_switch %[[VAL_8]]
76+ // CHECK: case 0 {
77+ // CHECK: scf.index_switch %[[VAL_10]]
78+ // CHECK: case 0 {
79+ // CHECK: affine.store %[[VAL_6]], %[[VAL_0]][(%[[VAL_7]] + %[[VAL_8]]) floordiv 2, (%[[VAL_9]] + %[[VAL_10]]) floordiv 3] : memref<4x6xf32>
80+ // CHECK: scf.yield
81+ // CHECK: }
82+ // CHECK: case 1 {
83+ // CHECK: affine.store %[[VAL_6]], %[[VAL_1]][(%[[VAL_7]] + %[[VAL_8]]) floordiv 2, (%[[VAL_9]] + %[[VAL_10]]) floordiv 3] : memref<4x6xf32>
84+ // CHECK: scf.yield
85+ // CHECK: }
86+ // CHECK: case 2 {
87+ // CHECK: affine.store %[[VAL_6]], %[[VAL_2]][(%[[VAL_7]] + %[[VAL_8]]) floordiv 2, (%[[VAL_9]] + %[[VAL_10]]) floordiv 3] : memref<4x6xf32>
88+ // CHECK: scf.yield
89+ // CHECK: }
90+ // CHECK: default {
91+ // CHECK: }
92+ // CHECK: scf.yield
93+ // CHECK: }
94+ // CHECK: case 1 {
95+ // CHECK: scf.index_switch %[[VAL_10]]
96+ // CHECK: case 0 {
97+ // CHECK: affine.store %[[VAL_6]], %[[VAL_3]][(%[[VAL_7]] + %[[VAL_8]]) floordiv 2, (%[[VAL_9]] + %[[VAL_10]]) floordiv 3] : memref<4x6xf32>
98+ // CHECK: scf.yield
99+ // CHECK: }
100+ // CHECK: case 1 {
101+ // CHECK: affine.store %[[VAL_6]], %[[VAL_4]][(%[[VAL_7]] + %[[VAL_8]]) floordiv 2, (%[[VAL_9]] + %[[VAL_10]]) floordiv 3] : memref<4x6xf32>
102+ // CHECK: scf.yield
103+ // CHECK: }
104+ // CHECK: case 2 {
105+ // CHECK: affine.store %[[VAL_6]], %[[VAL_5]][(%[[VAL_7]] + %[[VAL_8]]) floordiv 2, (%[[VAL_9]] + %[[VAL_10]]) floordiv 3] : memref<4x6xf32>
106+ // CHECK: scf.yield
107+ // CHECK: }
108+ // CHECK: default {
109+ // CHECK: }
110+ // CHECK: scf.yield
111+ // CHECK: }
112+ // CHECK: default {
113+ // CHECK: }
114+ // CHECK: }
115+ // CHECK: } {unparallelized}
116+ // CHECK: }
117+ // CHECK: } {unparallelized}
118+ // CHECK: return
119+ // CHECK: }
120+
121+ #map = affine_map <(d0 ) -> (d0 mod 2 )>
122+ #map1 = affine_map <(d0 ) -> (d0 mod 3 )>
123+ module {
124+ func.func @main (%arg0: memref <4 x6 xf32 >, %arg1: memref <4 x6 xf32 >, %arg2: memref <4 x6 xf32 >, %arg3: memref <4 x6 xf32 >, %arg4: memref <4 x6 xf32 >, %arg5: memref <4 x6 xf32 >) {
125+ %cst = arith.constant 0.000000e+00 : f32
126+ affine.parallel (%arg6 ) = (0 ) to (8 ) {
127+ affine.parallel (%arg7 ) = (0 ) to (18 ) {
128+ %0 = affine.apply #map (%arg6 )
129+ scf.index_switch %0
130+ case 0 {
131+ %1 = affine.apply #map1 (%arg7 )
132+ scf.index_switch %1
133+ case 0 {
134+ affine.store %cst , %arg0 [%arg6 floordiv 2 , %arg7 floordiv 3 ] : memref <4 x6 xf32 >
135+ scf.yield
136+ }
137+ case 1 {
138+ affine.store %cst , %arg1 [%arg6 floordiv 2 , %arg7 floordiv 3 ] : memref <4 x6 xf32 >
139+ scf.yield
140+ }
141+ case 2 {
142+ affine.store %cst , %arg2 [%arg6 floordiv 2 , %arg7 floordiv 3 ] : memref <4 x6 xf32 >
143+ scf.yield
144+ }
145+ default {
146+ }
147+ scf.yield
148+ }
149+ case 1 {
150+ %1 = affine.apply #map1 (%arg7 )
151+ scf.index_switch %1
152+ case 0 {
153+ affine.store %cst , %arg3 [%arg6 floordiv 2 , %arg7 floordiv 3 ] : memref <4 x6 xf32 >
154+ scf.yield
155+ }
156+ case 1 {
157+ affine.store %cst , %arg4 [%arg6 floordiv 2 , %arg7 floordiv 3 ] : memref <4 x6 xf32 >
158+ scf.yield
159+ }
160+ case 2 {
161+ affine.store %cst , %arg5 [%arg6 floordiv 2 , %arg7 floordiv 3 ] : memref <4 x6 xf32 >
162+ scf.yield
163+ }
164+ default {
165+ }
166+ scf.yield
167+ }
168+ default {
169+ }
170+ } {unparallelize.factor =3 }
171+ } {unparallelize.factor =2 }
172+ return
173+ }
174+ }
175+
0 commit comments