Skip to content

Commit 774a239

Browse files
committed
[DA] Add tests for nsw doesn't hold on entier iteration
1 parent c2fe1d9 commit 774a239

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt < %s -disable-output -passes="print<da>" -da-dump-monotonicity-report \
3+
; RUN: -da-enable-monotonicity-check 2>&1 | FileCheck %s
4+
5+
; for (i = 0; i < INT64_MAX - 1; i++)
6+
; if (i < 1000)
7+
; for (j = 0; j < 2000; j++)
8+
; a[i + j] = 0;
9+
;
10+
; FIXME: This is not monotonic. The nsw flag is valid under
11+
; the condition i < 1000, not for all i.
12+
define void @nsw_under_loop_guard0(ptr %a) {
13+
; CHECK-LABEL: 'nsw_under_loop_guard0'
14+
; CHECK-NEXT: Monotonicity check:
15+
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
16+
; CHECK-NEXT: Expr: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
17+
; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic
18+
; CHECK-EMPTY:
19+
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
20+
; CHECK-NEXT: da analyze - output [* *]!
21+
;
22+
entry:
23+
br label %loop.i.header
24+
25+
loop.i.header:
26+
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
27+
br label %loop.j.pr
28+
29+
loop.j.pr:
30+
%guard.j = icmp slt i64 %i, 1000
31+
br i1 %guard.j, label %loop.j, label %exit
32+
33+
loop.j:
34+
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
35+
%offset = add nsw i64 %i, %j
36+
%idx = getelementptr inbounds i8, ptr %a, i64 %offset
37+
store i8 0, ptr %idx
38+
%j.next = add nsw i64 %j, 1
39+
%exitcond.j = icmp eq i64 %j.next, 2000
40+
br i1 %exitcond.j, label %loop.i.latch, label %loop.j
41+
42+
loop.i.latch:
43+
%i.next = add nsw i64 %i, 1
44+
%exitcond.i = icmp eq i64 %i.next, 9223372036854775807
45+
br i1 %exitcond.i, label %exit, label %loop.i.header
46+
47+
exit:
48+
ret void
49+
}
50+
51+
; for (i = 0; i < 100; i++)
52+
; if (i < 1000)
53+
; for (j = 0; j < 100; j++)
54+
; a[i + j] = 0;
55+
;
56+
; The loop guard is always true, so the nsw flag is valid for all i.
57+
define void @nsw_under_loop_guard1(ptr %a) {
58+
; CHECK-LABEL: 'nsw_under_loop_guard1'
59+
; CHECK-NEXT: Monotonicity check:
60+
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
61+
; CHECK-NEXT: Expr: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
62+
; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic
63+
; CHECK-EMPTY:
64+
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
65+
; CHECK-NEXT: da analyze - output [* *]!
66+
;
67+
entry:
68+
br label %loop.i.header
69+
70+
loop.i.header:
71+
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
72+
br label %loop.j.pr
73+
74+
loop.j.pr:
75+
%guard.j = icmp slt i64 %i, 1000
76+
br i1 %guard.j, label %loop.j, label %exit
77+
78+
loop.j:
79+
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
80+
%val = phi i64 [ %i, %loop.j.pr ], [ %val.next, %loop.j ]
81+
%j.next = add nsw i64 %j, 1
82+
%idx = getelementptr inbounds i8, ptr %a, i64 %val
83+
store i8 0, ptr %idx
84+
%val.next = add nsw i64 %val, 1
85+
%exitcond.j = icmp eq i64 %j.next, 100
86+
br i1 %exitcond.j, label %loop.i.latch, label %loop.j
87+
88+
loop.i.latch:
89+
%i.next = add nsw i64 %i, 1
90+
%exitcond.i = icmp eq i64 %i.next, 100
91+
br i1 %exitcond.i, label %exit, label %loop.i.header
92+
93+
exit:
94+
ret void
95+
}
96+
97+
; for (i = 0; i < n; i++)
98+
; if (i < m)
99+
; for (j = 0; j < k; j++)
100+
; a[i + j] = 0;
101+
;
102+
; The nsw flag may valid under the condition i < k.
103+
define void @nsw_under_loop_guard2(ptr %a, i64 %n, i64 %m, i64 %k) {
104+
; CHECK-LABEL: 'nsw_under_loop_guard2'
105+
; CHECK-NEXT: Monotonicity check:
106+
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
107+
; CHECK-NEXT: Expr: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
108+
; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic
109+
; CHECK-EMPTY:
110+
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
111+
; CHECK-NEXT: da analyze - output [* *]!
112+
;
113+
entry:
114+
br label %loop.i.header
115+
116+
loop.i.header:
117+
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
118+
br label %loop.j.pr
119+
120+
loop.j.pr:
121+
%guard.j = icmp slt i64 %i, %m
122+
br i1 %guard.j, label %loop.j, label %exit
123+
124+
loop.j:
125+
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
126+
%val = phi i64 [ %i, %loop.j.pr ], [ %val.next, %loop.j ]
127+
%j.next = add nsw i64 %j, 1
128+
%idx = getelementptr inbounds i8, ptr %a, i64 %val
129+
store i8 0, ptr %idx
130+
%val.next = add nsw i64 %val, 1
131+
%exitcond.j = icmp eq i64 %j.next, %k
132+
br i1 %exitcond.j, label %loop.i.latch, label %loop.j
133+
134+
loop.i.latch:
135+
%i.next = add nsw i64 %i, 1
136+
%exitcond.i = icmp eq i64 %i.next, %n
137+
br i1 %exitcond.i, label %exit, label %loop.i.header
138+
139+
exit:
140+
ret void
141+
}

0 commit comments

Comments
 (0)