; RUN: opt -disable-output -passes='print,print' %s 2>&1 | FileCheck %s --check-prefixes=ALLOW-BEFORE ; RUN: opt -disable-output -passes='print,print' %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) to i64)) + %p)) ; ALLOW-BEFORE-NEXT: Member: {%p,+,4}<%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) to i64)) + %p)) ; ALLOW-AFTER-NEXT: Member: {%p,+,4}<%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 }