| ; 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 | |
| } |