318 lines · plain
1// RUN: mlir-opt -allow-unregistered-dialect %s -split-input-file -affine-super-vectorizer-test="forward-slicing=true" 2>&1 | FileCheck %s --check-prefix=FWD2// RUN: mlir-opt -allow-unregistered-dialect %s -split-input-file -affine-super-vectorizer-test="backward-slicing=true" 2>&1 | FileCheck %s --check-prefix=BWD3// RUN: mlir-opt -allow-unregistered-dialect %s -split-input-file -affine-super-vectorizer-test="slicing=true" 2>&1 | FileCheck %s --check-prefix=FWDBWD4 5/// 1 2 3 46/// |_______| |______|7/// | | |8/// | 5 69/// |___|_____________|10/// | |11/// 7 812/// |_______________|13/// |14/// 915// FWD-LABEL: slicing_test16// BWD-LABEL: slicing_test17// FWDBWD-LABEL: slicing_test18func.func @slicing_test() {19 // Fake 0 to align on 1 and match ASCII art.20 %0 = memref.alloc() : memref<1xi32>21 22 // FWD: matched: %[[v1:.*]] {{.*}} forward static slice:23 // FWD-NEXT: %[[v5:.*]] {{.*}} -> i524 // FWD-DAG: %[[v8:.*]] {{.*}} -> i825 // FWD-DAG: %[[v7:.*]] {{.*}} -> i726 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i927 //28 // BWD: matched: %[[v1:.*]] {{.*}} backward static slice:29 //30 // FWDBWD: matched: %[[v1:.*]] {{.*}} static slice:31 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i132 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i233 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i334 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i435 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i536 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i637 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i738 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i839 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i940 41 %1 = "slicing-test-op" () : () -> i142 43 // FWD-NEXT: matched: %[[v2:.*]] {{.*}} forward static slice:44 // FWD-NEXT: %[[v5:.*]] {{.*}} -> i545 // FWD-DAG: %[[v8:.*]] {{.*}} -> i846 // FWD-DAG: %[[v7:.*]] {{.*}} -> i747 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i948 //49 // BWD: matched: %[[v2:.*]] {{.*}} backward static slice:50 //51 // FWDBWD-NEXT: matched: %[[v2:.*]] {{.*}} static slice:52 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i153 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i254 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i355 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i456 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i557 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i658 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i759 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i860 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i961 62 %2 = "slicing-test-op" () : () -> i263 64 // FWD-NEXT: matched: %[[v3:.*]] {{.*}} forward static slice:65 // FWD-NEXT: %[[v6:.*]] {{.*}} -> i666 // FWD-NEXT: %[[v8:.*]] {{.*}} -> i867 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i968 //69 // BWD: matched: %[[v3:.*]] {{.*}} backward static slice:70 //71 // FWDBWD-NEXT: matched: %[[v3:.*]] {{.*}} static slice:72 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i173 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i274 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i375 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i476 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i577 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i678 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i779 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i880 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i981 82 %3 = "slicing-test-op" () : () -> i383 84 // FWD-NEXT: matched: %[[v4:.*]] {{.*}} forward static slice:85 // FWD-NEXT: %[[v6:.*]] {{.*}} -> i686 // FWD-NEXT: %[[v8:.*]] {{.*}} -> i887 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i988 //89 // BWD: matched: %[[v4:.*]] {{.*}} backward static slice:90 //91 // FWDBWD-NEXT: matched: %[[v4:.*]] {{.*}} static slice:92 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i193 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i294 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i395 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i496 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i597 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i698 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i799 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i8100 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i9101 102 %4 = "slicing-test-op" () : () -> i4103 104 // FWD-NEXT: matched: %[[v5:.*]] {{.*}} forward static slice:105 // FWD-DAG: %[[v7:.*]] {{.*}} -> i7106 // FWD-DAG: %[[v8:.*]] {{.*}} -> i8107 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i9108 //109 // BWD: matched: %[[v5:.*]] {{.*}} backward static slice:110 // BWD-DAG: %[[v1:.*]] = "slicing-test-op"() : () -> i1111 // BWD-DAG: %[[v2:.*]] = "slicing-test-op"() : () -> i2112 //113 // FWDBWD-NEXT: matched: %[[v5:.*]] {{.*}} static slice:114 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i1115 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i2116 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i3117 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i4118 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5119 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i6120 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i7121 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i8122 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i9123 124 %5 = "slicing-test-op" (%1, %2) : (i1, i2) -> i5125 126 // FWD-NEXT: matched: %[[v6:.*]] {{.*}} forward static slice:127 // FWD-NEXT: %[[v8:.*]] {{.*}} -> i8128 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i9129 //130 // BWD: matched: %[[v6:.*]] {{.*}} backward static slice:131 // BWD-DAG: %[[v3:.*]] = "slicing-test-op"() : () -> i3132 // BWD-DAG: %[[v4:.*]] = "slicing-test-op"() : () -> i4133 //134 // FWDBWD-NEXT: matched: %[[v6:.*]] {{.*}} static slice:135 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i1136 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i2137 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i3138 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i4139 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5140 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i6141 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i7142 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i8143 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i9144 145 %6 = "slicing-test-op" (%3, %4) : (i3, i4) -> i6146 147 // FWD-NEXT: matched: %[[v7:.*]] {{.*}} forward static slice:148 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i9149 //150 // BWD: matched: %[[v7:.*]] {{.*}} backward static slice:151 // BWD-DAG: %[[v1:.*]] = "slicing-test-op"() : () -> i1152 // BWD-DAG: %[[v2:.*]] = "slicing-test-op"() : () -> i2153 // BWD-NEXT: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5154 //155 // FWDBWD-NEXT: matched: %[[v7:.*]] {{.*}} static slice:156 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i1157 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i2158 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i3159 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i4160 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5161 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i6162 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i7163 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i8164 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i9165 166 %7 = "slicing-test-op" (%1, %5) : (i1, i5) -> i7167 168 // FWD-NEXT: matched: %[[v8:.*]] {{.*}} forward static slice:169 // FWD-NEXT: %[[v9:.*]] {{.*}} -> i9170 //171 // BWD: matched: %[[v8:.*]] {{.*}} backward static slice:172 // BWD-DAG: %[[v1:.*]] = "slicing-test-op"() : () -> i1173 // BWD-DAG: %[[v2:.*]] = "slicing-test-op"() : () -> i2174 // BWD-NEXT: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5175 // BWD-DAG: %[[v3:.*]] = "slicing-test-op"() : () -> i3176 // BWD-DAG: %[[v4:.*]] = "slicing-test-op"() : () -> i4177 // BWD-NEXT: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i6178 //179 // FWDBWD-NEXT: matched: %[[v8:.*]] {{.*}} static slice:180 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i1181 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i2182 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i3183 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i4184 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5185 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i6186 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i7187 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i8188 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i9189 190 %8 = "slicing-test-op" (%5, %6) : (i5, i6) -> i8191 192 // FWD-NEXT: matched: %[[v9:.*]] {{.*}} forward static slice:193 //194 // BWD: matched: %[[v9:.*]] {{.*}} backward static slice:195 // BWD-DAG: %[[v1:.*]] = "slicing-test-op"() : () -> i1196 // BWD-DAG: %[[v2:.*]] = "slicing-test-op"() : () -> i2197 // BWD-NEXT: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5198 // BWD-NEXT: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i7199 // BWD-DAG: %[[v3:.*]] = "slicing-test-op"() : () -> i3200 // BWD-DAG: %[[v4:.*]] = "slicing-test-op"() : () -> i4201 // BWD-NEXT: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i6202 // BWD-NEXT: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i8203 //204 // FWDBWD-NEXT: matched: %[[v9:.*]] {{.*}} static slice:205 // FWDBWD: %[[v1:.*]] = "slicing-test-op"() : () -> i1206 // FWDBWD: %[[v2:.*]] = "slicing-test-op"() : () -> i2207 // FWDBWD: %[[v3:.*]] = "slicing-test-op"() : () -> i3208 // FWDBWD: %[[v4:.*]] = "slicing-test-op"() : () -> i4209 // FWDBWD: %[[v5:.*]] = "slicing-test-op"(%[[v1]], %[[v2]]) : (i1, i2) -> i5210 // FWDBWD: %[[v6:.*]] = "slicing-test-op"(%[[v3]], %[[v4]]) : (i3, i4) -> i6211 // FWDBWD: %[[v7:.*]] = "slicing-test-op"(%[[v1]], %[[v5]]) : (i1, i5) -> i7212 // FWDBWD: %[[v8:.*]] = "slicing-test-op"(%[[v5]], %[[v6]]) : (i5, i6) -> i8213 // FWDBWD: %[[v9:.*]] = "slicing-test-op"(%[[v7]], %[[v8]]) : (i7, i8) -> i9214 215 %9 = "slicing-test-op" (%7, %8) : (i7, i8) -> i9216 217 return218}219 220// -----221 222// FWD-LABEL: slicing_test_2223// BWD-LABEL: slicing_test_2224// FWDBWD-LABEL: slicing_test_2225func.func @slicing_test_2() {226 %c0 = arith.constant 0 : index227 %c2 = arith.constant 2 : index228 %c16 = arith.constant 16 : index229 affine.for %i0 = %c0 to %c16 {230 affine.for %i1 = affine_map<(i)[] -> (i)>(%i0) to 10 {231 // BWD: matched: %[[b:.*]] {{.*}} backward static slice:232 // BWD: affine.for {{.*}}233 234 // affine.for appears in the body of scf.for235 // BWD: affine.for {{.*}}236 237 // affine.for appears as a proper op in the backward slice238 // BWD: affine.for {{.*}}239 %b = "slicing-test-op"(%i1): (index) -> index240 241 // BWD: matched: %[[c:.*]] {{.*}} backward static slice:242 // BWD: affine.for {{.*}}243 244 // affine.for appears in the body of scf.for245 // BWD-NEXT: affine.for {{.*}}246 247 // affine.for only appears in the body of scf.for248 // BWD-NOT: affine.for {{.*}}249 %c = "slicing-test-op"(%i0): (index) -> index250 }251 }252 return253}254 255// -----256 257// FWD-LABEL: slicing_test_3258// BWD-LABEL: slicing_test_3259// FWDBWD-LABEL: slicing_test_3260func.func @slicing_test_3() {261 %f = arith.constant 1.0 : f32262 %c = "slicing-test-op"(%f): (f32) -> index263 // FWD: matched: {{.*}} (f32) -> index forward static slice:264 // FWD: scf.for {{.*}}265 // FWD: matched: {{.*}} (index, index) -> index forward static slice:266 scf.for %i2 = %c to %c step %c {267 %d = "slicing-test-op"(%c, %i2): (index, index) -> index268 }269 return270}271 272// -----273 274// FWD-LABEL: slicing_test_function_argument275// BWD-LABEL: slicing_test_function_argument276// FWDBWD-LABEL: slicing_test_function_argument277func.func @slicing_test_function_argument(%arg0: index) -> index {278 // BWD: matched: {{.*}} (index, index) -> index backward static slice:279 %0 = "slicing-test-op"(%arg0, %arg0): (index, index) -> index280 return %0 : index281}282 283// -----284 285// FWD-LABEL: slicing_test_multiple_return286// BWD-LABEL: slicing_test_multiple_return287// FWDBWD-LABEL: slicing_test_multiple_return288func.func @slicing_test_multiple_return(%arg0: index) -> (index, index) {289 // BWD: matched: {{.*}} (index, index) -> (index, index) backward static slice:290 // FWD: matched: %{{.*}}:2 = "slicing-test-op"(%arg0, %arg0) : (index, index) -> (index, index) forward static slice:291 // FWD: return %{{.*}}#0, %{{.*}}#1 : index, index292 %0:2 = "slicing-test-op"(%arg0, %arg0): (index, index) -> (index, index)293 return %0#0, %0#1 : index, index294}295 296// -----297 298// FWD-LABEL: graph_region_with_cycle299// BWD-LABEL: graph_region_with_cycle300// FWDBWD-LABEL: graph_region_with_cycle301func.func @graph_region_with_cycle() {302 test.isolated_graph_region {303 // FWD: matched: [[V0:%.+]] = "slicing-test-op"([[V1:%.+]]) : (i1) -> i1 forward static slice:304 // FWD: [[V1]] = "slicing-test-op"([[V0]]) : (i1) -> i1 305 // FWD: matched: [[V1]] = "slicing-test-op"([[V0]]) : (i1) -> i1 forward static slice:306 // FWD: [[V0]] = "slicing-test-op"([[V1]]) : (i1) -> i1 307 308 // BWD: matched: [[V0:%.+]] = "slicing-test-op"([[V1:%.+]]) : (i1) -> i1 backward static slice:309 // BWD: [[V1]] = "slicing-test-op"([[V0]]) : (i1) -> i1 310 // BWD: matched: [[V1]] = "slicing-test-op"([[V0]]) : (i1) -> i1 backward static slice:311 // BWD: [[V0]] = "slicing-test-op"([[V1]]) : (i1) -> i1 312 %0 = "slicing-test-op"(%1) : (i1) -> i1313 %1 = "slicing-test-op"(%0) : (i1) -> i1314 }315 316 return317}318