blob: 18523fd01611e7c35e8ef007388607f1a362a5b6 [file] [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 2>&1 | FileCheck %s
; for (i = 0; i < INT64_MAX - 1; i++)
; if (i < 1000)
; for (j = 0; j < 2000; j++)
; a[i + j] = 0;
;
define void @nsw_under_loop_guard0(ptr %a) {
; CHECK-LABEL: 'nsw_under_loop_guard0'
; CHECK-NEXT: Monotonicity check:
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
; CHECK-NEXT: Expr: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
; CHECK-NEXT: Entire Domain:
; CHECK-NEXT: Monotonicity: Unknown
; CHECK-NEXT: Reason: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
; CHECK-NEXT: Effective Domain:
; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic
; CHECK-EMPTY:
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
; CHECK-NEXT: da analyze - none!
;
entry:
br label %loop.i.header
loop.i.header:
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
br label %loop.j.pr
loop.j.pr:
%guard.j = icmp slt i64 %i, 1000
br i1 %guard.j, label %loop.j, label %loop.i.latch
loop.j:
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
%offset = add nsw i64 %i, %j
%idx = getelementptr inbounds i8, ptr %a, i64 %offset
store i8 0, ptr %idx
%j.next = add nsw i64 %j, 1
%ec.j = icmp eq i64 %j.next, 2000
br i1 %ec.j, label %loop.i.latch, label %loop.j
loop.i.latch:
%i.next = add nsw i64 %i, 1
%ec.i = icmp eq i64 %i.next, 9223372036854775807
br i1 %ec.i, label %exit, label %loop.i.header
exit:
ret void
}
; for (i = 0; i < INT64_MAX; i++)
; if (100 < i)
; for (j = 0; j < 100; j++)
; a[INT64_MAX - i + j] = 0;
;
define void @nsw_under_loop_guard1(ptr %a) {
; CHECK-LABEL: 'nsw_under_loop_guard1'
; CHECK-NEXT: Monotonicity check:
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
; CHECK-NEXT: Expr: {{\{\{}}9223372036854775807,+,-1}<nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
; CHECK-NEXT: Entire Domain:
; CHECK-NEXT: Monotonicity: Unknown
; CHECK-NEXT: Reason: {{\{\{}}9223372036854775807,+,-1}<nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
; CHECK-NEXT: Effective Domain:
; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic
; CHECK-EMPTY:
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
; CHECK-NEXT: da analyze - none!
;
entry:
br label %loop.i.header
loop.i.header:
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
br label %loop.j.pr
loop.j.pr:
%guard.j = icmp sgt i64 %i, 100
br i1 %guard.j, label %loop.j, label %exit
loop.j:
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
%val.0 = sub nsw i64 9223372036854775807, %i
%val = add nsw i64 %val.0, %j
%idx = getelementptr inbounds i8, ptr %a, i64 %val
store i8 0, ptr %idx
%j.next = add nsw i64 %j, 1
%ec.j = icmp eq i64 %j.next, 100
br i1 %ec.j, label %loop.i.latch, label %loop.j
loop.i.latch:
%i.next = add nsw i64 %i, 1
%ec.i = icmp eq i64 %i.next, 9223372036854775807
br i1 %ec.i, label %exit, label %loop.i.header
exit:
ret void
}
; for (i = 0; i < n; i++)
; if (i < m)
; for (j = 0; j < k; j++)
; a[i + j] = 0;
;
define void @nsw_under_loop_guard2(ptr %a, i64 %n, i64 %m, i64 %k) {
; CHECK-LABEL: 'nsw_under_loop_guard2'
; CHECK-NEXT: Monotonicity check:
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
; CHECK-NEXT: Expr: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
; CHECK-NEXT: Entire Domain:
; CHECK-NEXT: Monotonicity: Unknown
; CHECK-NEXT: Reason: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
; CHECK-NEXT: Effective Domain:
; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic
; CHECK-EMPTY:
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
; CHECK-NEXT: da analyze - output [* *]!
;
entry:
br label %loop.i.header
loop.i.header:
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
br label %loop.j.pr
loop.j.pr:
%guard.j = icmp slt i64 %i, %m
br i1 %guard.j, label %loop.j, label %exit
loop.j:
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
%val = phi i64 [ %i, %loop.j.pr ], [ %val.next, %loop.j ]
%j.next = add nsw i64 %j, 1
%idx = getelementptr inbounds i8, ptr %a, i64 %val
store i8 0, ptr %idx
%val.next = add nsw i64 %val, 1
%ec.j = icmp eq i64 %j.next, %k
br i1 %ec.j, label %loop.i.latch, label %loop.j
loop.i.latch:
%i.next = add nsw i64 %i, 1
%ec.i = icmp eq i64 %i.next, %n
br i1 %ec.i, label %exit, label %loop.i.header
exit:
ret void
}