| ; RUN: opt -disable-output -passes='print<access-info><allow-partial>,print<access-info>' %s 2>&1 | FileCheck %s --check-prefixes=ALLOW-BEFORE | |
| ; RUN: opt -disable-output -passes='print<access-info>,print<access-info><allow-partial>' %s 2>&1 | FileCheck %s --check-prefixes=ALLOW-AFTER | |
| ; Check that we get the right results when loop access analysis is run twice, | |
| ; once without partial results and once with. | |
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32" | |
| define void @gep_loaded_offset(ptr %p, ptr %q, ptr %r, i32 %n) { | |
| ; ALLOW-BEFORE-LABEL: 'gep_loaded_offset' | |
| ; ALLOW-BEFORE-NEXT: while.body: | |
| ; ALLOW-BEFORE-NEXT: Report: cannot identify array bounds | |
| ; ALLOW-BEFORE-NEXT: Dependences: | |
| ; ALLOW-BEFORE-NEXT: Run-time memory checks: | |
| ; ALLOW-BEFORE-NEXT: Check 0: | |
| ; ALLOW-BEFORE-NEXT: Comparing group GRP0: | |
| ; ALLOW-BEFORE-NEXT: %p.addr = phi ptr [ %incdec.ptr, %while.body ], [ %p, %entry ] | |
| ; ALLOW-BEFORE-NEXT: Against group GRP1: | |
| ; ALLOW-BEFORE-NEXT: ptr %r | |
| ; ALLOW-BEFORE-NEXT: Grouped accesses: | |
| ; ALLOW-BEFORE-NEXT: Group GRP0: | |
| ; ALLOW-BEFORE-NEXT: (Low: %p High: (4 + (4 * (zext i32 (-1 + %n)<nsw> to i64))<nuw><nsw> + %p)) | |
| ; ALLOW-BEFORE-NEXT: Member: {%p,+,4}<nuw><%while.body> | |
| ; ALLOW-BEFORE-NEXT: Group GRP1: | |
| ; ALLOW-BEFORE-NEXT: (Low: %r High: (8 + %r)) | |
| ; ALLOW-BEFORE-NEXT: Member: %r | |
| ; ALLOW-BEFORE-NEXT: Generated run-time checks are incomplete | |
| ; ALLOW-BEFORE-EMPTY: | |
| ; ALLOW-BEFORE-NEXT: Non vectorizable stores to invariant address were not found in loop. | |
| ; ALLOW-BEFORE-NEXT: SCEV assumptions: | |
| ; ALLOW-BEFORE-EMPTY: | |
| ; ALLOW-BEFORE-NEXT: Expressions re-written: | |
| ; | |
| ; ALLOW-BEFORE-LABEL: 'gep_loaded_offset' | |
| ; ALLOW-BEFORE-NEXT: while.body: | |
| ; ALLOW-BEFORE-NEXT: Report: cannot identify array bounds | |
| ; ALLOW-BEFORE-NEXT: Dependences: | |
| ; ALLOW-BEFORE-NEXT: Run-time memory checks: | |
| ; ALLOW-BEFORE-NEXT: Grouped accesses: | |
| ; ALLOW-BEFORE-EMPTY: | |
| ; ALLOW-BEFORE-NEXT: Non vectorizable stores to invariant address were not found in loop. | |
| ; ALLOW-BEFORE-NEXT: SCEV assumptions: | |
| ; ALLOW-BEFORE-EMPTY: | |
| ; ALLOW-BEFORE-NEXT: Expressions re-written: | |
| ; | |
| ; ALLOW-AFTER-LABEL: 'gep_loaded_offset' | |
| ; ALLOW-AFTER-NEXT: while.body: | |
| ; ALLOW-AFTER-NEXT: Report: cannot identify array bounds | |
| ; ALLOW-AFTER-NEXT: Dependences: | |
| ; ALLOW-AFTER-NEXT: Run-time memory checks: | |
| ; ALLOW-AFTER-NEXT: Grouped accesses: | |
| ; ALLOW-AFTER-EMPTY: | |
| ; ALLOW-AFTER-NEXT: Non vectorizable stores to invariant address were not found in loop. | |
| ; ALLOW-AFTER-NEXT: SCEV assumptions: | |
| ; ALLOW-AFTER-EMPTY: | |
| ; ALLOW-AFTER-NEXT: Expressions re-written: | |
| ; | |
| ; ALLOW-AFTER-LABEL: 'gep_loaded_offset' | |
| ; ALLOW-AFTER-NEXT: while.body: | |
| ; ALLOW-AFTER-NEXT: Report: cannot identify array bounds | |
| ; ALLOW-AFTER-NEXT: Dependences: | |
| ; ALLOW-AFTER-NEXT: Run-time memory checks: | |
| ; ALLOW-AFTER-NEXT: Check 0: | |
| ; ALLOW-AFTER-NEXT: Comparing group GRP0: | |
| ; ALLOW-AFTER-NEXT: %p.addr = phi ptr [ %incdec.ptr, %while.body ], [ %p, %entry ] | |
| ; ALLOW-AFTER-NEXT: Against group GRP1: | |
| ; ALLOW-AFTER-NEXT: ptr %r | |
| ; ALLOW-AFTER-NEXT: Grouped accesses: | |
| ; ALLOW-AFTER-NEXT: Group GRP0: | |
| ; ALLOW-AFTER-NEXT: (Low: %p High: (4 + (4 * (zext i32 (-1 + %n)<nsw> to i64))<nuw><nsw> + %p)) | |
| ; ALLOW-AFTER-NEXT: Member: {%p,+,4}<nuw><%while.body> | |
| ; ALLOW-AFTER-NEXT: Group GRP1: | |
| ; ALLOW-AFTER-NEXT: (Low: %r High: (8 + %r)) | |
| ; ALLOW-AFTER-NEXT: Member: %r | |
| ; ALLOW-AFTER-NEXT: Generated run-time checks are incomplete | |
| ; ALLOW-AFTER-EMPTY: | |
| ; ALLOW-AFTER-NEXT: Non vectorizable stores to invariant address were not found in loop. | |
| ; ALLOW-AFTER-NEXT: SCEV assumptions: | |
| ; ALLOW-AFTER-EMPTY: | |
| ; ALLOW-AFTER-NEXT: Expressions re-written: | |
| ; | |
| entry: | |
| br label %while.body | |
| while.body: | |
| %n.addr = phi i32 [ %dec, %while.body ], [ %n, %entry ] | |
| %p.addr = phi ptr [ %incdec.ptr, %while.body ], [ %p, %entry ] | |
| %dec = add nsw i32 %n.addr, -1 | |
| %rval = load i64, ptr %r, align 4 | |
| %arrayidx = getelementptr inbounds i32, ptr %q, i64 %rval | |
| %val = load i32, ptr %arrayidx, align 4 | |
| %incdec.ptr = getelementptr inbounds nuw i8, ptr %p.addr, i64 4 | |
| store i32 %val, ptr %p.addr, align 4 | |
| %tobool.not = icmp eq i32 %dec, 0 | |
| br i1 %tobool.not, label %while.end, label %while.body | |
| while.end: | |
| ret void | |
| } |