| ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes='print<access-info>' -memory-check-merge-threshold=0 -disable-output < %s 2>&1 | FileCheck %s |
| |
| ; The read and write entries for %a0 must not exhaust the merge budget by |
| ; processing the same runtime pointer twice. Both accesses to %a then fit in |
| ; one checking group, leaving one runtime check against %b instead of two. |
| |
| define void @merge_read_write_pointer(ptr %a, ptr %b) { |
| ; CHECK-LABEL: 'merge_read_write_pointer' |
| ; CHECK-NEXT: loop: |
| ; CHECK-NEXT: Memory dependences are safe with run-time checks |
| ; CHECK-NEXT: Dependences: |
| ; CHECK-NEXT: Forward: |
| ; CHECK-NEXT: %v = load i32, ptr %a0, align 4 -> |
| ; CHECK-NEXT: store i32 %sum, ptr %a0, align 4 |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: Run-time memory checks: |
| ; CHECK-NEXT: Check 0: |
| ; CHECK-NEXT: Comparing group GRP0: |
| ; CHECK-NEXT: %a1 = getelementptr i32, ptr %a, i64 %offset |
| ; CHECK-NEXT: %a0 = getelementptr i32, ptr %a, i64 %iv |
| ; CHECK-NEXT: Against group GRP1: |
| ; CHECK-NEXT: %bp = getelementptr i32, ptr %b, i64 %iv |
| ; CHECK-NEXT: Grouped accesses: |
| ; CHECK-NEXT: Group GRP0: |
| ; CHECK-NEXT: (Low: %a High: (384 + %a)) |
| ; CHECK-NEXT: Member: {(256 + %a),+,4}<nw><%loop> |
| ; CHECK-NEXT: Member: {%a,+,4}<nw><%loop> |
| ; CHECK-NEXT: Group GRP1: |
| ; CHECK-NEXT: (Low: %b High: (128 + %b)) |
| ; CHECK-NEXT: Member: {%b,+,4}<nw><%loop> |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. |
| ; CHECK-NEXT: SCEV assumptions: |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: Expressions re-written: |
| ; |
| entry: |
| br label %loop |
| |
| loop: |
| %iv = phi i64 [0, %entry], [%next, %loop] |
| %a0 = getelementptr i32, ptr %a, i64 %iv |
| %v = load i32, ptr %a0 |
| %bp = getelementptr i32, ptr %b, i64 %iv |
| %w = load i32, ptr %bp |
| %sum = add i32 %v, %w |
| store i32 %sum, ptr %a0 |
| %offset = add nuw nsw i64 %iv, 64 |
| %a1 = getelementptr i32, ptr %a, i64 %offset |
| store i32 %w, ptr %a1 |
| %next = add nuw nsw i64 %iv, 1 |
| %done = icmp eq i64 %next, 32 |
| br i1 %done, label %exit, label %loop |
| |
| exit: |
| ret void |
| } |