This patch teaches IndVarSimplify to add nuw and nsw to certain kinds
[oota-llvm.git] / test / Transforms / IndVarSimplify / strengthen-overflow.ll
1 ; RUN: opt < %s -indvars -S | FileCheck %s
2
3 define i32 @test.signed.add.0(i32* %array, i32 %length, i32 %init) {
4 ; CHECK-LABEL: @test.signed.add.0
5  entry:
6   %upper = icmp slt i32 %init, %length
7   br i1 %upper, label %loop, label %exit
8
9  loop:
10 ; CHECK-LABEL: loop
11   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
12   %civ.inc = add i32 %civ, 1
13 ; CHECK: %civ.inc = add nsw i32 %civ, 1
14   %cmp = icmp slt i32 %civ.inc, %length
15   br i1 %cmp, label %latch, label %break
16
17  latch:
18   store i32 0, i32* %array
19   %check = icmp slt i32 %civ.inc, %length
20   br i1 %check, label %loop, label %break
21
22  break:
23   ret i32 %civ.inc
24
25  exit:
26   ret i32 42
27 }
28
29 define i32 @test.signed.add.1(i32* %array, i32 %length, i32 %init) {
30 ; CHECK-LABEL: @test.signed.add.1
31  entry:
32   %upper = icmp sle i32 %init, %length
33   br i1 %upper, label %loop, label %exit
34
35  loop:
36 ; CHECK-LABEL: loop
37   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
38   %civ.inc = add i32 %civ, 1
39 ; CHECK: %civ.inc = add i32 %civ, 1
40   %cmp = icmp slt i32 %civ.inc, %length
41   br i1 %cmp, label %latch, label %break
42
43  latch:
44   store i32 0, i32* %array
45   %check = icmp slt i32 %civ.inc, %length
46   br i1 %check, label %loop, label %break
47
48  break:
49   ret i32 %civ.inc
50
51  exit:
52   ret i32 42
53 }
54
55 define i32 @test.signed.sub.0(i32* %array, i32 %length, i32 %init) {
56 ; CHECK-LABEL: @test.signed.sub.0
57  entry:
58   %upper = icmp sgt i32 %init, %length
59   br i1 %upper, label %loop, label %exit
60
61  loop:
62 ; CHECK-LABEL: loop
63   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
64   %civ.inc = sub i32 %civ, 1
65 ; CHECK: %civ.inc = sub nsw i32 %civ, 1
66   %cmp = icmp slt i32 %civ.inc, %length
67   br i1 %cmp, label %latch, label %break
68
69  latch:
70   store i32 0, i32* %array
71   %check = icmp sgt i32 %civ.inc, %length
72   br i1 %check, label %loop, label %break
73
74  break:
75   ret i32 %civ.inc
76
77  exit:
78   ret i32 42
79 }
80
81 define i32 @test.signed.sub.1(i32* %array, i32 %length, i32 %init) {
82 ; CHECK-LABEL: @test.signed.sub.1
83  entry:
84   %upper = icmp sgt i32 %init, %length
85   br i1 %upper, label %loop, label %exit
86
87  loop:
88 ; CHECK-LABEL: loop
89   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
90   %civ.inc = sub i32 %civ, 1
91 ; CHECK: %civ.inc = sub i32 %civ, 1
92   %cmp = icmp slt i32 %civ.inc, %length
93   br i1 %cmp, label %latch, label %break
94
95  latch:
96   store i32 0, i32* %array
97   %check = icmp sge i32 %civ.inc, %length
98   br i1 %check, label %loop, label %break
99
100  break:
101   ret i32 %civ.inc
102
103  exit:
104   ret i32 42
105 }
106
107 define i32 @test.unsigned.add.0(i32* %array, i32 %length, i32 %init) {
108 ; CHECK-LABEL: @test.unsigned.add.0
109  entry:
110   %upper = icmp ult i32 %init, %length
111   br i1 %upper, label %loop, label %exit
112
113  loop:
114 ; CHECK-LABEL: loop
115   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
116   %civ.inc = add i32 %civ, 1
117 ; CHECK: %civ.inc = add nuw i32 %civ, 1
118   %cmp = icmp slt i32 %civ.inc, %length
119   br i1 %cmp, label %latch, label %break
120
121  latch:
122   store i32 0, i32* %array
123   %check = icmp ult i32 %civ.inc, %length
124   br i1 %check, label %loop, label %break
125
126  break:
127   ret i32 %civ.inc
128
129  exit:
130   ret i32 42
131 }
132
133 define i32 @test.unsigned.add.1(i32* %array, i32 %length, i32 %init) {
134 ; CHECK-LABEL: @test.unsigned.add.1
135  entry:
136   %upper = icmp ule i32 %init, %length
137   br i1 %upper, label %loop, label %exit
138
139  loop:
140 ; CHECK-LABEL: loop
141   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
142   %civ.inc = add i32 %civ, 1
143 ; CHECK: %civ.inc = add i32 %civ, 1
144   %cmp = icmp slt i32 %civ.inc, %length
145   br i1 %cmp, label %latch, label %break
146
147  latch:
148   store i32 0, i32* %array
149   %check = icmp ult i32 %civ.inc, %length
150   br i1 %check, label %loop, label %break
151
152  break:
153   ret i32 %civ.inc
154
155  exit:
156   ret i32 42
157 }
158
159 define i32 @test.unsigned.sub.0(i32* %array, i32* %length_ptr, i32 %init) {
160 ; CHECK-LABEL: @test.unsigned.sub.0
161  entry:
162   %length = load i32* %length_ptr, !range !0
163   %upper = icmp ult i32 %init, %length
164   br i1 %upper, label %loop, label %exit
165
166  loop:
167 ; CHECK-LABEL: loop
168   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
169   %civ.inc = sub i32 %civ, 2
170 ; CHECK: %civ.inc = sub nuw i32 %civ, 2
171   %cmp = icmp slt i32 %civ.inc, %length
172   br i1 %cmp, label %latch, label %break
173
174  latch:
175   store i32 0, i32* %array
176   %check = icmp ult i32 %civ.inc, %length
177   br i1 %check, label %loop, label %break
178
179  break:
180   ret i32 %civ.inc
181
182  exit:
183   ret i32 42
184 }
185
186 define i32 @test.unsigned.sub.1(i32* %array, i32* %length_ptr, i32 %init) {
187 ; CHECK-LABEL: @test.unsigned.sub.1
188  entry:
189   %length = load i32* %length_ptr, !range !1
190   %upper = icmp ult i32 %init, %length
191   br i1 %upper, label %loop, label %exit
192
193  loop:
194 ; CHECK-LABEL: loop
195   %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
196   %civ.inc = sub i32 %civ, 2
197 ; CHECK: %civ.inc = sub i32 %civ, 2
198   %cmp = icmp slt i32 %civ.inc, %length
199   br i1 %cmp, label %latch, label %break
200
201  latch:
202   store i32 0, i32* %array
203   %check = icmp ult i32 %civ.inc, %length
204   br i1 %check, label %loop, label %break
205
206  break:
207   ret i32 %civ.inc
208
209  exit:
210   ret i32 42
211 }
212
213 !0 = !{i32 0, i32 2}
214 !1 = !{i32 0, i32 42}