@@ -209,8 +209,26 @@ define i32 @expand_strcmp_s1_fail_3(ptr %C) {
209209
210210define i1 @expand_strcmp_eq_s2 (ptr %C ) {
211211; 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
214232; CHECK-NEXT: ret i1 [[CMP]]
215233;
216234 %call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -220,8 +238,26 @@ define i1 @expand_strcmp_eq_s2(ptr %C) {
220238
221239define i1 @expand_strcmp_ne_s2 (ptr %C ) {
222240; 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
225261; CHECK-NEXT: ret i1 [[CMP]]
226262;
227263 %call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -231,8 +267,26 @@ define i1 @expand_strcmp_ne_s2(ptr %C) {
231267
232268define i1 @expand_strcmp_sgt_s2 (ptr %C ) {
233269; 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
236290; CHECK-NEXT: ret i1 [[CMP]]
237291;
238292 %call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -242,8 +296,26 @@ define i1 @expand_strcmp_sgt_s2(ptr %C) {
242296
243297define i1 @expand_strcmp_sge_s2 (ptr %C ) {
244298; 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
247319; CHECK-NEXT: ret i1 [[CMP]]
248320;
249321 %call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -253,8 +325,26 @@ define i1 @expand_strcmp_sge_s2(ptr %C) {
253325
254326define i1 @expand_strcmp_slt_s2 (ptr %C ) {
255327; 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
258348; CHECK-NEXT: ret i1 [[CMP]]
259349;
260350 %call = call i32 @strcmp (ptr %C , ptr @s2 )
@@ -264,8 +354,26 @@ define i1 @expand_strcmp_slt_s2(ptr %C) {
264354
265355define i1 @expand_strcmp_sle_s2 (ptr %C ) {
266356; 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
269377; CHECK-NEXT: ret i1 [[CMP]]
270378;
271379 %call = call i32 @strcmp (ptr %C , ptr @s2 )
0 commit comments