; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -passes='print' -disable-output %s 2>&1 | FileCheck %s target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" ; Note: The datalayout for the test specifies a 32 bit index type. ; No UB: accessing last valid byte, pointer after the object ; doesnt wrap (%p + 2147483647). define void @pointer_after_object_does_not_wrap(i32 %y, ptr %s, ptr %p) { ; CHECK-LABEL: 'pointer_after_object_does_not_wrap' ; CHECK-NEXT: loop: ; CHECK-NEXT: Memory dependences are safe with run-time checks ; CHECK-NEXT: Dependences: ; CHECK-NEXT: Run-time memory checks: ; CHECK-NEXT: Check 0: ; CHECK-NEXT: Comparing group GRP0: ; CHECK-NEXT: %gep2.iv = getelementptr inbounds i8, ptr %p, i32 %iv ; CHECK-NEXT: Against group GRP1: ; CHECK-NEXT: %gep1.iv = getelementptr inbounds i8, ptr %s, i32 %iv ; CHECK-NEXT: Grouped accesses: ; CHECK-NEXT: Group GRP0: ; CHECK-NEXT: (Low: (%y + %p) High: (2147483647 + %p)) ; CHECK-NEXT: Member: {(%y + %p),+,1}<%loop> ; CHECK-NEXT: Group GRP1: ; CHECK-NEXT: (Low: (%y + %s) High: (2147483647 + %s)) ; CHECK-NEXT: Member: {(%y + %s),+,1}<%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 i32 [ %y, %entry ], [ %iv.next, %loop ] %gep1.iv = getelementptr inbounds i8 , ptr %s, i32 %iv %load = load i8, ptr %gep1.iv, align 4 %gep2.iv = getelementptr inbounds i8, ptr %p, i32 %iv store i8 %load, ptr %gep2.iv, align 4 %iv.next = add nsw i32 %iv, 1 %c.2 = icmp slt i32 %iv.next, 2147483647 br i1 %c.2, label %loop, label %exit exit: ret void } ; UB: accessing %p + 2147483646 and p + 2147483647. ; Pointer the past the object would wrap in signed. define void @pointer_after_object_would_wrap(i32 %y, ptr %s, ptr %p) { ; CHECK-LABEL: 'pointer_after_object_would_wrap' ; CHECK-NEXT: loop: ; CHECK-NEXT: Memory dependences are safe with run-time checks ; CHECK-NEXT: Dependences: ; CHECK-NEXT: Run-time memory checks: ; CHECK-NEXT: Check 0: ; CHECK-NEXT: Comparing group GRP0: ; CHECK-NEXT: %gep2.iv = getelementptr inbounds i8, ptr %p, i32 %iv ; CHECK-NEXT: Against group GRP1: ; CHECK-NEXT: %gep1.iv = getelementptr inbounds i8, ptr %s, i32 %iv ; CHECK-NEXT: Grouped accesses: ; CHECK-NEXT: Group GRP0: ; CHECK-NEXT: (Low: (%y + %p) High: (-2147483648 + %p)) ; CHECK-NEXT: Member: {(%y + %p),+,1}<%loop> ; CHECK-NEXT: Group GRP1: ; CHECK-NEXT: (Low: (%y + %s) High: (-2147483648 + %s)) ; CHECK-NEXT: Member: {(%y + %s),+,1}<%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 i32 [ %y, %entry ], [ %iv.next, %loop ] %gep1.iv = getelementptr inbounds i8 , ptr %s, i32 %iv %load = load i16, ptr %gep1.iv, align 4 %gep2.iv = getelementptr inbounds i8, ptr %p, i32 %iv store i16 %load, ptr %gep2.iv, align 4 %iv.next = add nsw i32 %iv, 1 %c.2 = icmp slt i32 %iv.next, 2147483647 br i1 %c.2, label %loop, label %exit exit: ret void }