@@ -209,8 +209,26 @@ define i32 @expand_strcmp_s1_fail_3(ptr %C) {
209
209
210
210
define i1 @expand_strcmp_eq_s2 (ptr %C ) {
211
211
; CHECK-LABEL: @expand_strcmp_eq_s2(
212
- ; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr [[C:%.*]], ptr @s2)
213
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], 0
212
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 1
213
+ ; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i32
214
+ ; CHECK-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP2]], 48
215
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 0
216
+ ; CHECK-NEXT: br i1 [[TMP4]], label [[STRCMP_EXPAND_SUB_IS_ZERO:%.*]], label [[STRCMP_EXPAND_SUB_JOIN:%.*]]
217
+ ; CHECK: strcmp_expand_sub_is_zero:
218
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 1
219
+ ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
220
+ ; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i32
221
+ ; CHECK-NEXT: [[TMP8:%.*]] = sub nsw i32 [[TMP7]], 49
222
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0
223
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[STRCMP_EXPAND_SUB_IS_ZERO1:%.*]], label [[STRCMP_EXPAND_SUB_JOIN]]
224
+ ; CHECK: strcmp_expand_sub_is_zero1:
225
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 2
226
+ ; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 1
227
+ ; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i32
228
+ ; CHECK-NEXT: br label [[STRCMP_EXPAND_SUB_JOIN]]
229
+ ; CHECK: strcmp_expand_sub_join:
230
+ ; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[STRCMP_EXPAND_SUB_IS_ZERO]] ], [ [[TMP12]], [[STRCMP_EXPAND_SUB_IS_ZERO1]] ]
231
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP13]], 0
214
232
; CHECK-NEXT: ret i1 [[CMP]]
215
233
;
216
234
%call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -220,8 +238,26 @@ define i1 @expand_strcmp_eq_s2(ptr %C) {
220
238
221
239
define i1 @expand_strcmp_ne_s2 (ptr %C ) {
222
240
; CHECK-LABEL: @expand_strcmp_ne_s2(
223
- ; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr [[C:%.*]], ptr @s2)
224
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[CALL]], 0
241
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 1
242
+ ; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i32
243
+ ; CHECK-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP2]], 48
244
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 0
245
+ ; CHECK-NEXT: br i1 [[TMP4]], label [[STRCMP_EXPAND_SUB_IS_ZERO:%.*]], label [[STRCMP_EXPAND_SUB_JOIN:%.*]]
246
+ ; CHECK: strcmp_expand_sub_is_zero:
247
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 1
248
+ ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
249
+ ; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i32
250
+ ; CHECK-NEXT: [[TMP8:%.*]] = sub nsw i32 [[TMP7]], 49
251
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0
252
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[STRCMP_EXPAND_SUB_IS_ZERO1:%.*]], label [[STRCMP_EXPAND_SUB_JOIN]]
253
+ ; CHECK: strcmp_expand_sub_is_zero1:
254
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 2
255
+ ; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 1
256
+ ; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i32
257
+ ; CHECK-NEXT: br label [[STRCMP_EXPAND_SUB_JOIN]]
258
+ ; CHECK: strcmp_expand_sub_join:
259
+ ; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[STRCMP_EXPAND_SUB_IS_ZERO]] ], [ [[TMP12]], [[STRCMP_EXPAND_SUB_IS_ZERO1]] ]
260
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP13]], 0
225
261
; CHECK-NEXT: ret i1 [[CMP]]
226
262
;
227
263
%call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -231,8 +267,26 @@ define i1 @expand_strcmp_ne_s2(ptr %C) {
231
267
232
268
define i1 @expand_strcmp_sgt_s2 (ptr %C ) {
233
269
; CHECK-LABEL: @expand_strcmp_sgt_s2(
234
- ; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr [[C:%.*]], ptr @s2)
235
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CALL]], 0
270
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 1
271
+ ; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i32
272
+ ; CHECK-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP2]], 48
273
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 0
274
+ ; CHECK-NEXT: br i1 [[TMP4]], label [[STRCMP_EXPAND_SUB_IS_ZERO:%.*]], label [[STRCMP_EXPAND_SUB_JOIN:%.*]]
275
+ ; CHECK: strcmp_expand_sub_is_zero:
276
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 1
277
+ ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
278
+ ; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i32
279
+ ; CHECK-NEXT: [[TMP8:%.*]] = sub nsw i32 [[TMP7]], 49
280
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0
281
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[STRCMP_EXPAND_SUB_IS_ZERO1:%.*]], label [[STRCMP_EXPAND_SUB_JOIN]]
282
+ ; CHECK: strcmp_expand_sub_is_zero1:
283
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 2
284
+ ; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 1
285
+ ; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i32
286
+ ; CHECK-NEXT: br label [[STRCMP_EXPAND_SUB_JOIN]]
287
+ ; CHECK: strcmp_expand_sub_join:
288
+ ; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[STRCMP_EXPAND_SUB_IS_ZERO]] ], [ [[TMP12]], [[STRCMP_EXPAND_SUB_IS_ZERO1]] ]
289
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP13]], 0
236
290
; CHECK-NEXT: ret i1 [[CMP]]
237
291
;
238
292
%call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -242,8 +296,26 @@ define i1 @expand_strcmp_sgt_s2(ptr %C) {
242
296
243
297
define i1 @expand_strcmp_sge_s2 (ptr %C ) {
244
298
; CHECK-LABEL: @expand_strcmp_sge_s2(
245
- ; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr [[C:%.*]], ptr @s2)
246
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[CALL]], 0
299
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 1
300
+ ; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i32
301
+ ; CHECK-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP2]], 48
302
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 0
303
+ ; CHECK-NEXT: br i1 [[TMP4]], label [[STRCMP_EXPAND_SUB_IS_ZERO:%.*]], label [[STRCMP_EXPAND_SUB_JOIN:%.*]]
304
+ ; CHECK: strcmp_expand_sub_is_zero:
305
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 1
306
+ ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
307
+ ; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i32
308
+ ; CHECK-NEXT: [[TMP8:%.*]] = sub nsw i32 [[TMP7]], 49
309
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0
310
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[STRCMP_EXPAND_SUB_IS_ZERO1:%.*]], label [[STRCMP_EXPAND_SUB_JOIN]]
311
+ ; CHECK: strcmp_expand_sub_is_zero1:
312
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 2
313
+ ; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 1
314
+ ; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i32
315
+ ; CHECK-NEXT: br label [[STRCMP_EXPAND_SUB_JOIN]]
316
+ ; CHECK: strcmp_expand_sub_join:
317
+ ; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[STRCMP_EXPAND_SUB_IS_ZERO]] ], [ [[TMP12]], [[STRCMP_EXPAND_SUB_IS_ZERO1]] ]
318
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[TMP13]], 0
247
319
; CHECK-NEXT: ret i1 [[CMP]]
248
320
;
249
321
%call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -253,8 +325,26 @@ define i1 @expand_strcmp_sge_s2(ptr %C) {
253
325
254
326
define i1 @expand_strcmp_slt_s2 (ptr %C ) {
255
327
; CHECK-LABEL: @expand_strcmp_slt_s2(
256
- ; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr [[C:%.*]], ptr @s2)
257
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[CALL]], 0
328
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 1
329
+ ; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i32
330
+ ; CHECK-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP2]], 48
331
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 0
332
+ ; CHECK-NEXT: br i1 [[TMP4]], label [[STRCMP_EXPAND_SUB_IS_ZERO:%.*]], label [[STRCMP_EXPAND_SUB_JOIN:%.*]]
333
+ ; CHECK: strcmp_expand_sub_is_zero:
334
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 1
335
+ ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
336
+ ; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i32
337
+ ; CHECK-NEXT: [[TMP8:%.*]] = sub nsw i32 [[TMP7]], 49
338
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0
339
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[STRCMP_EXPAND_SUB_IS_ZERO1:%.*]], label [[STRCMP_EXPAND_SUB_JOIN]]
340
+ ; CHECK: strcmp_expand_sub_is_zero1:
341
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 2
342
+ ; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 1
343
+ ; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i32
344
+ ; CHECK-NEXT: br label [[STRCMP_EXPAND_SUB_JOIN]]
345
+ ; CHECK: strcmp_expand_sub_join:
346
+ ; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[STRCMP_EXPAND_SUB_IS_ZERO]] ], [ [[TMP12]], [[STRCMP_EXPAND_SUB_IS_ZERO1]] ]
347
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP13]], 0
258
348
; CHECK-NEXT: ret i1 [[CMP]]
259
349
;
260
350
%call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -264,8 +354,26 @@ define i1 @expand_strcmp_slt_s2(ptr %C) {
264
354
265
355
define i1 @expand_strcmp_sle_s2 (ptr %C ) {
266
356
; CHECK-LABEL: @expand_strcmp_sle_s2(
267
- ; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr [[C:%.*]], ptr @s2)
268
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[CALL]], 0
357
+ ; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 1
358
+ ; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i32
359
+ ; CHECK-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP2]], 48
360
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 0
361
+ ; CHECK-NEXT: br i1 [[TMP4]], label [[STRCMP_EXPAND_SUB_IS_ZERO:%.*]], label [[STRCMP_EXPAND_SUB_JOIN:%.*]]
362
+ ; CHECK: strcmp_expand_sub_is_zero:
363
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 1
364
+ ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
365
+ ; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i32
366
+ ; CHECK-NEXT: [[TMP8:%.*]] = sub nsw i32 [[TMP7]], 49
367
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0
368
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[STRCMP_EXPAND_SUB_IS_ZERO1:%.*]], label [[STRCMP_EXPAND_SUB_JOIN]]
369
+ ; CHECK: strcmp_expand_sub_is_zero1:
370
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 2
371
+ ; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 1
372
+ ; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i32
373
+ ; CHECK-NEXT: br label [[STRCMP_EXPAND_SUB_JOIN]]
374
+ ; CHECK: strcmp_expand_sub_join:
375
+ ; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[STRCMP_EXPAND_SUB_IS_ZERO]] ], [ [[TMP12]], [[STRCMP_EXPAND_SUB_IS_ZERO1]] ]
376
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP13]], 0
269
377
; CHECK-NEXT: ret i1 [[CMP]]
270
378
;
271
379
%call = call i32 @strcmp (ptr %C , ptr @s2 )
0 commit comments