blob: 36e92627977ef334f32141693e29fd4e7fa361b0 [file] [edit]
; 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
}