@@ -151,26 +151,77 @@ define zeroext i1 @f9(i64 %dummy, i64 %a, i64 *%res) {
151
151
ret i1 %obit
152
152
}
153
153
154
- ; Check the next value down, which must use register addition instead.
154
+ ; Check the next value down, which can use register subtraction instead.
155
155
define zeroext i1 @f10 (i64 %dummy , i64 %a , i64 *%res ) {
156
156
; CHECK-LABEL: f10:
157
+ ; CHECK: llilf [[REG1:%r[0-9]+]], 2147483649
158
+ ; CHECK: sgr %r3, [[REG1]]
159
+ ; CHECK-DAG: stg %r3, 0(%r4)
160
+ ; CHECK-DAG: ipm [[REG:%r[0-5]]]
161
+ ; CHECK-DAG: afi [[REG]], 1342177280
162
+ ; CHECK-DAG: risbg %r2, [[REG]], 63, 191, 33
163
+ ; CHECK: br %r14
164
+ %t = call {i64 , i1 } @llvm.sadd.with.overflow.i64 (i64 %a , i64 -2147483649 )
165
+ %val = extractvalue {i64 , i1 } %t , 0
166
+ %obit = extractvalue {i64 , i1 } %t , 1
167
+ store i64 %val , i64 *%res
168
+ ret i1 %obit
169
+ }
170
+
171
+ ; We may be able to use LLILH instead of LLILF.
172
+ define zeroext i1 @f11 (i64 %dummy , i64 %a , i64 *%res ) {
173
+ ; CHECK-LABEL: f11:
174
+ ; CHECK: llilh [[REG1:%r[0-9]+]], 32769
175
+ ; CHECK: sgr %r3, [[REG1]]
176
+ ; CHECK-DAG: stg %r3, 0(%r4)
177
+ ; CHECK-DAG: ipm [[REG:%r[0-5]]]
178
+ ; CHECK-DAG: afi [[REG]], 1342177280
179
+ ; CHECK-DAG: risbg %r2, [[REG]], 63, 191, 33
180
+ ; CHECK: br %r14
181
+ %t = call {i64 , i1 } @llvm.sadd.with.overflow.i64 (i64 %a , i64 -2147549184 )
182
+ %val = extractvalue {i64 , i1 } %t , 0
183
+ %obit = extractvalue {i64 , i1 } %t , 1
184
+ store i64 %val , i64 *%res
185
+ ret i1 %obit
186
+ }
187
+
188
+ ; Check low end of the LLILF/SGR range.
189
+ define zeroext i1 @f12 (i64 %dummy , i64 %a , i64 *%res ) {
190
+ ; CHECK-LABEL: f12:
191
+ ; CHECK: llilf [[REG1:%r[0-9]+]], 4294967295
192
+ ; CHECK: sgr %r3, [[REG1]]
193
+ ; CHECK-DAG: stg %r3, 0(%r4)
194
+ ; CHECK-DAG: ipm [[REG:%r[0-5]]]
195
+ ; CHECK-DAG: afi [[REG]], 1342177280
196
+ ; CHECK-DAG: risbg %r2, [[REG]], 63, 191, 33
197
+ ; CHECK: br %r14
198
+ %t = call {i64 , i1 } @llvm.sadd.with.overflow.i64 (i64 %a , i64 -4294967295 )
199
+ %val = extractvalue {i64 , i1 } %t , 0
200
+ %obit = extractvalue {i64 , i1 } %t , 1
201
+ store i64 %val , i64 *%res
202
+ ret i1 %obit
203
+ }
204
+
205
+ ; Check the next value down, which must use register addition instead.
206
+ define zeroext i1 @f13 (i64 %dummy , i64 %a , i64 *%res ) {
207
+ ; CHECK-LABEL: f13:
157
208
; CHECK: llihf [[REG1:%r[0-9]+]], 4294967295
158
209
; CHECK: agr [[REG1]], %r3
159
210
; CHECK-DAG: stg [[REG1]], 0(%r4)
160
211
; CHECK-DAG: ipm [[REG:%r[0-5]]]
161
212
; CHECK-DAG: afi [[REG]], 1342177280
162
213
; CHECK-DAG: risbg %r2, [[REG]], 63, 191, 33
163
214
; CHECK: br %r14
164
- %t = call {i64 , i1 } @llvm.sadd.with.overflow.i64 (i64 %a , i64 -2147483649 )
215
+ %t = call {i64 , i1 } @llvm.sadd.with.overflow.i64 (i64 %a , i64 -4294967296 )
165
216
%val = extractvalue {i64 , i1 } %t , 0
166
217
%obit = extractvalue {i64 , i1 } %t , 1
167
218
store i64 %val , i64 *%res
168
219
ret i1 %obit
169
220
}
170
221
171
222
; Check using the overflow result for a branch.
172
- define void @f11 (i64 %dummy , i64 %a , i64 *%res ) {
173
- ; CHECK-LABEL: f11 :
223
+ define void @f14 (i64 %dummy , i64 %a , i64 *%res ) {
224
+ ; CHECK-LABEL: f14 :
174
225
; CHECK: aghi %r3, 1
175
226
; CHECK: stg %r3, 0(%r4)
176
227
; CHECK: {{jgo foo@PLT|bnor %r14}}
@@ -190,8 +241,8 @@ exit:
190
241
}
191
242
192
243
; ... and the same with the inverted direction.
193
- define void @f12 (i64 %dummy , i64 %a , i64 *%res ) {
194
- ; CHECK-LABEL: f12 :
244
+ define void @f15 (i64 %dummy , i64 %a , i64 *%res ) {
245
+ ; CHECK-LABEL: f15 :
195
246
; CHECK: aghi %r3, 1
196
247
; CHECK: stg %r3, 0(%r4)
197
248
; CHECK: {{jgno foo@PLT|bor %r14}}
0 commit comments