blob: 71ea4e95059a0d08e62527a2f569bbecf0dbaf2e [file] [log] [blame] [edit]
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -disable-output -passes="print<da>" -da-dump-monotonicity-report \
; RUN: -da-enable-monotonicity-check 2>&1 | FileCheck %s
; The offset SCEV will be delinearized into a 2D array access, like as follows:
;
; - Outer subscript: {0,+,1}<nuw><nsw><%loop.i.header>
; - Inner subscript: {0,+,1}<nuw><nsw><%loop.j.header>
;
; These subscripts are both monotonic, but we also need to check the
; monotonicity of the original addrec.
;
; char A[...][32];
; for (i = 0; i < 1ll << 62; i++)
; for (j = 0; j < 32; j++)
; if (i < (1ll << 57))
; A[i][j] = 0;
;
define void @linearized_offset_wrap(ptr %a) {
; CHECK-LABEL: 'linearized_offset_wrap'
; CHECK-NEXT: Monotonicity check:
; CHECK-NEXT: Inst: store i8 0, ptr %gep, align 1
; CHECK-NEXT: Expr: {{\{\{}}0,+,32}<%loop.i.header>,+,1}<nw><%loop.j.header>
; CHECK-NEXT: Monotonicity: Unknown
; CHECK-NEXT: Reason: {{\{\{}}0,+,32}<%loop.i.header>,+,1}<nw><%loop.j.header>
; CHECK-EMPTY:
; CHECK-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1
; CHECK-NEXT: da analyze - confused!
;
entry:
br label %loop.i.header
loop.i.header:
%i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ]
br label %loop.j.header
loop.j.header:
%j = phi i64 [ 0, %loop.i.header ], [ %j.inc, %loop.j.latch ]
%cond = icmp slt i64 %i, 144115188075855872 ; 2^57
br i1 %cond, label %if.then, label %loop.j.latch
if.then:
%gep = getelementptr inbounds [32 x i8], ptr %a, i64 %i, i64 %j
store i8 0, ptr %gep
br label %loop.j.latch
loop.j.latch:
%j.inc = add nuw nsw i64 %j, 1
%ec.j = icmp eq i64 %j.inc, 32
br i1 %ec.j, label %loop.i.latch, label %loop.j.header
loop.i.latch:
%i.inc = add nuw nsw i64 %i, 1
%ec.i = icmp eq i64 %i.inc, 4611686018427387904 ; 2^62
br i1 %ec.i, label %exit, label %loop.i.header
exit:
ret void
}