Skip to content

Commit 0b8c29b

Browse files
committed
[DA] Add tests for nsw doesn't hold on entier iteration
1 parent 611229f commit 0b8c29b

File tree

1 file changed

+142
-0
lines changed

1 file changed

+142
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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 < 9223372036854775806; i++)
6+
; if (i < 2147483640)
7+
; for (j = 0; j < 2147483640; j++)
8+
; a[i + j * 4294967296] = 0;
9+
;
10+
; FIXME: This is not monotonic. The nsw flag is valid under
11+
; the condition i < 2147483640, 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>,+,4294967296}<nuw><nsw><%loop.j>
17+
; CHECK-NEXT: Monotonicity: MultiSignedMonotonic
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 - none!
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, 2147483640
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+
%val = phi i64 [ %i, %loop.j.pr ], [ %val.next, %loop.j ]
36+
%j.next = add nsw i64 %j, 1
37+
%idx = getelementptr inbounds i8, ptr %a, i64 %val
38+
store i8 0, ptr %idx
39+
%val.next = add nsw i64 %val, 4294967296
40+
%exitcond.j = icmp eq i64 %j.next, 2147483640
41+
br i1 %exitcond.j, label %loop.i.latch, label %loop.j
42+
43+
loop.i.latch:
44+
%i.next = add nsw i64 %i, 1
45+
%exitcond.i = icmp eq i64 %i.next, 9223372036854775806
46+
br i1 %exitcond.i, label %exit, label %loop.i.header
47+
48+
exit:
49+
ret void
50+
}
51+
52+
; for (i = 0; i < 100; i++)
53+
; if (i < 1000)
54+
; for (j = 0; j < 100; j++)
55+
; a[i + j] = 0;
56+
;
57+
; The loop guard is always true, so the nsw flag is valid for all i.
58+
define void @nsw_under_loop_guard1(ptr %a) {
59+
; CHECK-LABEL: 'nsw_under_loop_guard1'
60+
; CHECK-NEXT: Monotonicity check:
61+
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
62+
; CHECK-NEXT: Expr: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
63+
; CHECK-NEXT: Monotonicity: MultiSignedMonotonic
64+
; CHECK-EMPTY:
65+
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
66+
; CHECK-NEXT: da analyze - output [* *]!
67+
;
68+
entry:
69+
br label %loop.i.header
70+
71+
loop.i.header:
72+
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
73+
br label %loop.j.pr
74+
75+
loop.j.pr:
76+
%guard.j = icmp slt i64 %i, 1000
77+
br i1 %guard.j, label %loop.j, label %exit
78+
79+
loop.j:
80+
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
81+
%val = phi i64 [ %i, %loop.j.pr ], [ %val.next, %loop.j ]
82+
%j.next = add nsw i64 %j, 1
83+
%idx = getelementptr inbounds i8, ptr %a, i64 %val
84+
store i8 0, ptr %idx
85+
%val.next = add nsw i64 %val, 1
86+
%exitcond.j = icmp eq i64 %j.next, 100
87+
br i1 %exitcond.j, label %loop.i.latch, label %loop.j
88+
89+
loop.i.latch:
90+
%i.next = add nsw i64 %i, 1
91+
%exitcond.i = icmp eq i64 %i.next, 100
92+
br i1 %exitcond.i, label %exit, label %loop.i.header
93+
94+
exit:
95+
ret void
96+
}
97+
98+
; for (i = 0; i < n; i++)
99+
; if (i < m)
100+
; for (j = 0; j < k; j++)
101+
; a[i + j] = 0;
102+
;
103+
; The nsw flag may valid under the condition i < k.
104+
define void @nsw_under_loop_guard2(ptr %a, i64 %n, i64 %m, i64 %k) {
105+
; CHECK-LABEL: 'nsw_under_loop_guard2'
106+
; CHECK-NEXT: Monotonicity check:
107+
; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1
108+
; CHECK-NEXT: Expr: {{\{\{}}0,+,1}<nuw><nsw><%loop.i.header>,+,1}<nuw><nsw><%loop.j>
109+
; CHECK-NEXT: Monotonicity: MultiSignedMonotonic
110+
; CHECK-EMPTY:
111+
; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1
112+
; CHECK-NEXT: da analyze - output [* *]!
113+
;
114+
entry:
115+
br label %loop.i.header
116+
117+
loop.i.header:
118+
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
119+
br label %loop.j.pr
120+
121+
loop.j.pr:
122+
%guard.j = icmp slt i64 %i, %m
123+
br i1 %guard.j, label %loop.j, label %exit
124+
125+
loop.j:
126+
%j = phi i64 [ 0, %loop.j.pr ], [ %j.next, %loop.j ]
127+
%val = phi i64 [ %i, %loop.j.pr ], [ %val.next, %loop.j ]
128+
%j.next = add nsw i64 %j, 1
129+
%idx = getelementptr inbounds i8, ptr %a, i64 %val
130+
store i8 0, ptr %idx
131+
%val.next = add nsw i64 %val, 1
132+
%exitcond.j = icmp eq i64 %j.next, %k
133+
br i1 %exitcond.j, label %loop.i.latch, label %loop.j
134+
135+
loop.i.latch:
136+
%i.next = add nsw i64 %i, 1
137+
%exitcond.i = icmp eq i64 %i.next, %n
138+
br i1 %exitcond.i, label %exit, label %loop.i.header
139+
140+
exit:
141+
ret void
142+
}

0 commit comments

Comments
 (0)