|
5 | 5 | define i32 @load_with_pointer_phi_no_runtime_checks(%s1* %data) {
|
6 | 6 | ; CHECK-LABEL: load_with_pointer_phi_no_runtime_checks
|
7 | 7 | ; CHECK-NEXT: loop.header:
|
8 |
| -; CHECK-NEXT: Report: cannot identify array bounds |
| 8 | +; CHECK-NEXT: Memory dependences are safe |
9 | 9 | ;
|
10 | 10 | entry:
|
11 | 11 | br label %loop.header
|
@@ -40,7 +40,7 @@ exit: ; preds = %loop.latch
|
40 | 40 | define i32 @store_with_pointer_phi_no_runtime_checks(%s1* %data) {
|
41 | 41 | ; CHECK-LABEL: 'store_with_pointer_phi_no_runtime_checks'
|
42 | 42 | ; CHECK-NEXT: loop.header:
|
43 |
| -; CHECK-NEXT: Report: cannot identify array bounds |
| 43 | +; CHECK-NEXT: Memory dependences are safe |
44 | 44 | ;
|
45 | 45 | entry:
|
46 | 46 | br label %loop.header
|
@@ -75,7 +75,23 @@ exit: ; preds = %loop.latch
|
75 | 75 | define i32 @store_with_pointer_phi_runtime_checks(double* %A, double* %B, double* %C) {
|
76 | 76 | ; CHECK-LABEL: 'store_with_pointer_phi_runtime_checks'
|
77 | 77 | ; CHECK-NEXT: loop.header:
|
78 |
| -; CHECK-NEXT: Report: cannot identify array bounds |
| 78 | +; CHECK-NEXT: Memory dependences are safe with run-time checks |
| 79 | +; CHECK: Run-time memory checks: |
| 80 | +; CHECK-NEXT: Check 0: |
| 81 | +; CHECK-NEXT: Comparing group ([[GROUP_B:.+]]): |
| 82 | +; CHECK-NEXT: %gep.1 = getelementptr inbounds double, double* %B, i64 %iv |
| 83 | +; CHECK-NEXT: Against group ([[GROUP_C:.+]]): |
| 84 | +; CHECK-NEXT: %gep.2 = getelementptr inbounds double, double* %C, i64 %iv |
| 85 | +; CHECK-NEXT: Check 1: |
| 86 | +; CHECK-NEXT: Comparing group ([[GROUP_B]]): |
| 87 | +; CHECK-NEXT: %gep.1 = getelementptr inbounds double, double* %B, i64 %iv |
| 88 | +; CHECK-NEXT: Against group ([[GROUP_A:.+]]): |
| 89 | +; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv |
| 90 | +; CHECK-NEXT: Check 2: |
| 91 | +; CHECK-NEXT: Comparing group ([[GROUP_C]]): |
| 92 | +; CHECK-NEXT: %gep.2 = getelementptr inbounds double, double* %C, i64 %iv |
| 93 | +; CHECK-NEXT: Against group ([[GROUP_A]]): |
| 94 | +; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv |
79 | 95 | ;
|
80 | 96 | entry:
|
81 | 97 | br label %loop.header
|
@@ -184,10 +200,41 @@ exit: ; preds = %loop.latch
|
184 | 200 | define i32 @store_with_pointer_phi_incoming_phi(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) {
|
185 | 201 | ; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi'
|
186 | 202 | ; CHECK-NEXT: loop.header:
|
187 |
| -; CHECK-NEXT: Report: cannot identify array bounds |
188 |
| -; CHECK-NEXT: Dependences: |
189 |
| -; CHECK-NEXT: Run-time memory checks: |
190 |
| -; CHECK-NEXT: Grouped accesses: |
| 203 | +; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop |
| 204 | +; CHECK-NEXT: Dependences: |
| 205 | +; CHECK-NEXT: Unknown: |
| 206 | +; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> |
| 207 | +; CHECK-NEXT: store double %mul16, double* %ptr.2, align 8 |
| 208 | +; CHECK-EMPTY: |
| 209 | +; CHECK-NEXT: Run-time memory checks: |
| 210 | +; CHECK-NEXT: Check 0: |
| 211 | +; CHECK-NEXT: Comparing group ([[GROUP_C:.+]]): |
| 212 | +; CHECK-NEXT: double* %C |
| 213 | +; CHECK-NEXT: Against group ([[GROUP_B:.+]]): |
| 214 | +; CHECK-NEXT: double* %B |
| 215 | +; CHECK-NEXT: Check 1: |
| 216 | +; CHECK-NEXT: Comparing group ([[GROUP_C]]): |
| 217 | +; CHECK-NEXT: double* %C |
| 218 | +; CHECK-NEXT: Against group ([[GROUP_A:.+]]): |
| 219 | +; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv |
| 220 | +; CHECK-NEXT: double* %A |
| 221 | +; CHECK-NEXT: Check 2: |
| 222 | +; CHECK-NEXT: Comparing group ([[GROUP_B]]): |
| 223 | +; CHECK-NEXT: double* %B |
| 224 | +; CHECK-NEXT: Against group ([[GROUP_A]]): |
| 225 | +; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv |
| 226 | +; CHECK-NEXT: double* %A |
| 227 | +; CHECK-NEXT: Grouped accesses: |
| 228 | +; CHECK-NEXT: Group [[GROUP_C]]: |
| 229 | +; CHECK-NEXT: (Low: %C High: (8 + %C)) |
| 230 | +; CHECK-NEXT: Member: %C |
| 231 | +; CHECK-NEXT: Group [[GROUP_B]]: |
| 232 | +; CHECK-NEXT: (Low: %B High: (8 + %B)) |
| 233 | +; CHECK-NEXT: Member: %B |
| 234 | +; CHECK-NEXT: Group [[GROUP_A]]: |
| 235 | +; CHECK-NEXT: (Low: %A High: (256000 + %A)) |
| 236 | +; CHECK-NEXT: Member: {%A,+,8}<nuw><%loop.header> |
| 237 | +; CHECK-NEXT: Member: %A |
191 | 238 | ; CHECK-EMPTY
|
192 | 239 | entry:
|
193 | 240 | br label %loop.header
|
@@ -229,10 +276,41 @@ exit: ; preds = %loop.latch
|
229 | 276 | define i32 @store_with_pointer_phi_incoming_phi_irreducible_cycle(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) {
|
230 | 277 | ; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi_irreducible_cycle'
|
231 | 278 | ; CHECK-NEXT: loop.header:
|
232 |
| -; CHECK-NEXT: Report: cannot identify array bounds |
233 |
| -; CHECK-NEXT: Dependences: |
234 |
| -; CHECK-NEXT: Run-time memory checks: |
235 |
| -; CHECK-NEXT: Grouped accesses: |
| 279 | +; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop |
| 280 | +; CHECK-NEXT: Dependences: |
| 281 | +; CHECK-NEXT: Unknown: |
| 282 | +; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> |
| 283 | +; CHECK-NEXT: store double %mul16, double* %ptr.3, align 8 |
| 284 | +; CHECK-EMPTY: |
| 285 | +; CHECK-NEXT: Run-time memory checks: |
| 286 | +; CHECK-NEXT: Check 0: |
| 287 | +; CHECK-NEXT: Comparing group ([[GROUP_C:.+]]): |
| 288 | +; CHECK-NEXT: double* %C |
| 289 | +; CHECK-NEXT: Against group ([[GROUP_B:.+]]): |
| 290 | +; CHECK-NEXT: double* %B |
| 291 | +; CHECK-NEXT: Check 1: |
| 292 | +; CHECK-NEXT: Comparing group ([[GROUP_C]]): |
| 293 | +; CHECK-NEXT: double* %C |
| 294 | +; CHECK-NEXT: Against group ([[GROUP_A:.+]]): |
| 295 | +; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv |
| 296 | +; CHECK-NEXT: double* %A |
| 297 | +; CHECK-NEXT: Check 2: |
| 298 | +; CHECK-NEXT: Comparing group ([[GROUP_B]]): |
| 299 | +; CHECK-NEXT: double* %B |
| 300 | +; CHECK-NEXT: Against group ([[GROUP_A]]): |
| 301 | +; CHECK-NEXT: %arrayidx = getelementptr inbounds double, double* %A, i64 %iv |
| 302 | +; CHECK-NEXT: double* %A |
| 303 | +; CHECK-NEXT: Grouped accesses: |
| 304 | +; CHECK-NEXT: Group [[GROUP_C]] |
| 305 | +; CHECK-NEXT: (Low: %C High: (8 + %C)) |
| 306 | +; CHECK-NEXT: Member: %C |
| 307 | +; CHECK-NEXT: Group [[GROUP_B]] |
| 308 | +; CHECK-NEXT: (Low: %B High: (8 + %B)) |
| 309 | +; CHECK-NEXT: Member: %B |
| 310 | +; CHECK-NEXT: Group [[GROUP_A]] |
| 311 | +; CHECK-NEXT: (Low: %A High: (256000 + %A)) |
| 312 | +; CHECK-NEXT: Member: {%A,+,8}<nuw><%loop.header> |
| 313 | +; CHECK-NEXT: Member: %A |
236 | 314 | ; CHECK-EMPTY
|
237 | 315 | entry:
|
238 | 316 | br label %loop.header
|
@@ -334,10 +412,59 @@ exit: ; preds = %loop.latch
|
334 | 412 | define void @phi_load_store_memdep_check(i1 %c, i16* %A, i16* %B, i16* %C) {
|
335 | 413 | ; CHECK-LABEL: Loop access info in function 'phi_load_store_memdep_check':
|
336 | 414 | ; CHECK-NEXT: for.body:
|
337 |
| -; CHECK-NEXT: Report: cannot identify array bounds |
338 |
| -; CHECK-NEXT: Dependences: |
339 |
| -; CHECK-NEXT: Run-time memory checks: |
340 |
| -; CHECK-NEXT: Grouped accesses: |
| 415 | +; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop |
| 416 | +; CHECK-NEXT: Dependences: |
| 417 | +; CHECK-NEXT: Unknown: |
| 418 | +; CHECK-NEXT: %lv3 = load i16, i16* %c.sink, align 2 -> |
| 419 | +; CHECK-NEXT: store i16 %add, i16* %c.sink, align 1 |
| 420 | +; CHECK-EMPTY: |
| 421 | +; CHECK-NEXT: Unknown: |
| 422 | +; CHECK-NEXT: %lv3 = load i16, i16* %c.sink, align 2 -> |
| 423 | +; CHECK-NEXT: store i16 %add, i16* %c.sink, align 1 |
| 424 | +; CHECK-EMPTY: |
| 425 | +; CHECK-NEXT: Unknown: |
| 426 | +; CHECK-NEXT: %lv = load i16, i16* %A, align 1 -> |
| 427 | +; CHECK-NEXT: store i16 %lv, i16* %A, align 1 |
| 428 | +; CHECK-EMPTY: |
| 429 | +; CHECK-NEXT: Unknown: |
| 430 | +; CHECK-NEXT: store i16 %lv, i16* %A, align 1 -> |
| 431 | +; CHECK-NEXT: %lv2 = load i16, i16* %A, align 1 |
| 432 | +; CHECK-EMPTY: |
| 433 | +; CHECK-NEXT: Run-time memory checks: |
| 434 | +; CHECK-NEXT: Check 0: |
| 435 | +; CHECK-NEXT: Comparing group ([[GROUP_A:.+]]): |
| 436 | +; CHECK-NEXT: i16* %A |
| 437 | +; CHECK-NEXT: i16* %A |
| 438 | +; CHECK-NEXT: Against group ([[GROUP_C:.+]]): |
| 439 | +; CHECK-NEXT: i16* %C |
| 440 | +; CHECK-NEXT: i16* %C |
| 441 | +; CHECK-NEXT: Check 1: |
| 442 | +; CHECK-NEXT: Comparing group ([[GROUP_A]]): |
| 443 | +; CHECK-NEXT: i16* %A |
| 444 | +; CHECK-NEXT: i16* %A |
| 445 | +; CHECK-NEXT: Against group ([[GROUP_B:.+]]): |
| 446 | +; CHECK-NEXT: i16* %B |
| 447 | +; CHECK-NEXT: i16* %B |
| 448 | +; CHECK-NEXT: Check 2: |
| 449 | +; CHECK-NEXT: Comparing group ([[GROUP_C]]): |
| 450 | +; CHECK-NEXT: i16* %C |
| 451 | +; CHECK-NEXT: i16* %C |
| 452 | +; CHECK-NEXT: Against group ([[GROUP_B]]): |
| 453 | +; CHECK-NEXT: i16* %B |
| 454 | +; CHECK-NEXT: i16* %B |
| 455 | +; CHECK-NEXT: Grouped accesses: |
| 456 | +; CHECK-NEXT: Group [[GROUP_A]] |
| 457 | +; CHECK-NEXT: (Low: %A High: (2 + %A)) |
| 458 | +; CHECK-NEXT: Member: %A |
| 459 | +; CHECK-NEXT: Member: %A |
| 460 | +; CHECK-NEXT: Group [[GROUP_C]] |
| 461 | +; CHECK-NEXT: (Low: %C High: (2 + %C)) |
| 462 | +; CHECK-NEXT: Member: %C |
| 463 | +; CHECK-NEXT: Member: %C |
| 464 | +; CHECK-NEXT: Group [[GROUP_B]] |
| 465 | +; CHECK-NEXT: (Low: %B High: (2 + %B)) |
| 466 | +; CHECK-NEXT: Member: %B |
| 467 | +; CHECK-NEXT: Member: %B |
341 | 468 | ; CHECK-EMPTY:
|
342 | 469 | ;
|
343 | 470 | entry:
|
|
0 commit comments