Skip to content

Commit 873e630

Browse files
committed
[ConstraintElimination] Add tests inspired by PR54224.
1 parent 9b740c0 commit 873e630

File tree

2 files changed

+205
-0
lines changed

2 files changed

+205
-0
lines changed

llvm/test/Transforms/ConstraintElimination/add-nuw.ll

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,3 +454,127 @@ if.end: ; preds = %entry
454454
}
455455

456456
declare void @use(i1)
457+
458+
define i1 @add_nuw_neg_pr54224_i16(i16 %a) {
459+
; CHECK-LABEL: @add_nuw_neg_pr54224_i16(
460+
; CHECK-NEXT: entry:
461+
; CHECK-NEXT: [[NEG2:%.*]] = add nuw i16 [[A:%.*]], -305
462+
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
463+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
464+
; CHECK: exit.1:
465+
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i16 [[A]], 0
466+
; CHECK-NEXT: ret i1 [[C_2]]
467+
; CHECK: exit.2:
468+
; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i16 [[A]], 0
469+
; CHECK-NEXT: ret i1 true
470+
;
471+
entry:
472+
%neg2 = add nuw i16 %a, -305
473+
%c.1 = icmp ugt i16 0, %neg2
474+
br i1 %c.1, label %exit.1, label %exit.2
475+
476+
exit.1:
477+
%c.2 = icmp ugt i16 %a, 0
478+
ret i1 %c.2
479+
480+
exit.2:
481+
%c.3 = icmp ugt i16 %a, 0
482+
ret i1 %c.3
483+
}
484+
485+
define i1 @add_nuw_neg_pr54224_i64(i64 %a) {
486+
; CHECK-LABEL: @add_nuw_neg_pr54224_i64(
487+
; CHECK-NEXT: entry:
488+
; CHECK-NEXT: [[NEG2:%.*]] = add nuw i64 [[A:%.*]], -305
489+
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]]
490+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
491+
; CHECK: exit.1:
492+
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i64 [[A]], 0
493+
; CHECK-NEXT: ret i1 [[C_2]]
494+
; CHECK: exit.2:
495+
; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i64 [[A]], 0
496+
; CHECK-NEXT: ret i1 true
497+
;
498+
entry:
499+
%neg2 = add nuw i64 %a, -305
500+
%c.1 = icmp ugt i64 0, %neg2
501+
br i1 %c.1, label %exit.1, label %exit.2
502+
503+
exit.1:
504+
%c.2 = icmp ugt i64 %a, 0
505+
ret i1 %c.2
506+
507+
exit.2:
508+
%c.3 = icmp ugt i64 %a, 0
509+
ret i1 %c.3
510+
}
511+
512+
define i1 @add_nuw_neg2_i8(i8 %a) {
513+
; CHECK-LABEL: @add_nuw_neg2_i8(
514+
; CHECK-NEXT: entry:
515+
; CHECK-NEXT: [[NEG2:%.*]] = add nuw i8 [[A:%.*]], -4
516+
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[NEG2]], -2
517+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
518+
; CHECK: exit.1:
519+
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[A]], 2
520+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[A]], 1
521+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_2]]
522+
; CHECK-NEXT: ret i1 [[RES_1]]
523+
; CHECK: exit.2:
524+
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[A]], 3
525+
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[A]], 2
526+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[C_3]], [[F_1]]
527+
; CHECK-NEXT: ret i1 [[RES_2]]
528+
;
529+
entry:
530+
%neg2 = add nuw i8 %a, -4
531+
%c.1 = icmp ult i8 %neg2, -2
532+
br i1 %c.1, label %exit.1, label %exit.2
533+
534+
exit.1:
535+
%t.1 = icmp ult i8 %a, 2
536+
%c.2 = icmp ult i8 %a, 1
537+
%res.1 = xor i1 %t.1, %c.2
538+
ret i1 %res.1
539+
540+
exit.2:
541+
%c.3 = icmp ult i8 %a, 3
542+
%f.1 = icmp ult i8 %a, 2
543+
%res.2 = xor i1 %c.3, %f.1
544+
ret i1 %res.2
545+
}
546+
547+
define i1 @add_nuw_neg2_i64(i64 %a) {
548+
; CHECK-LABEL: @add_nuw_neg2_i64(
549+
; CHECK-NEXT: entry:
550+
; CHECK-NEXT: [[NEG2:%.*]] = add nuw i64 [[A:%.*]], -4
551+
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i64 [[NEG2]], -2
552+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
553+
; CHECK: exit.1:
554+
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i64 [[A]], 2
555+
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i64 [[A]], 1
556+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_2]]
557+
; CHECK-NEXT: ret i1 [[RES_1]]
558+
; CHECK: exit.2:
559+
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i64 [[A]], 3
560+
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i64 [[A]], 2
561+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[C_3]], [[F_1]]
562+
; CHECK-NEXT: ret i1 [[RES_2]]
563+
;
564+
entry:
565+
%neg2 = add nuw i64 %a, -4
566+
%c.1 = icmp ult i64 %neg2, -2
567+
br i1 %c.1, label %exit.1, label %exit.2
568+
569+
exit.1:
570+
%t.1 = icmp ult i64 %a, 2
571+
%c.2 = icmp ult i64 %a, 1
572+
%res.1 = xor i1 %t.1, %c.2
573+
ret i1 %res.1
574+
575+
exit.2:
576+
%c.3 = icmp ult i64 %a, 3
577+
%f.1 = icmp ult i64 %a, 2
578+
%res.2 = xor i1 %c.3, %f.1
579+
ret i1 %res.2
580+
}

llvm/test/Transforms/ConstraintElimination/sub-nuw.ll

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,84 @@ bb.3:
272272
}
273273

274274
declare void @use(i1)
275+
276+
define i1 @sub_nuw_i16_simp(i16 %a) {
277+
; CHECK-LABEL: @sub_nuw_i16_simp(
278+
; CHECK-NEXT: entry:
279+
; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], 305
280+
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
281+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
282+
; CHECK: exit.1:
283+
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i16 [[A]], 0
284+
; CHECK-NEXT: ret i1 [[C_2]]
285+
; CHECK: exit.2:
286+
; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i16 [[A]], 0
287+
; CHECK-NEXT: ret i1 true
288+
;
289+
entry:
290+
%neg2 = sub nuw i16 %a, 305
291+
%c.1 = icmp ugt i16 0, %neg2
292+
br i1 %c.1, label %exit.1, label %exit.2
293+
294+
exit.1:
295+
%c.2 = icmp ugt i16 %a, 0
296+
ret i1 %c.2
297+
298+
exit.2:
299+
%c.3 = icmp ugt i16 %a, 0
300+
ret i1 %c.3
301+
}
302+
303+
define i1 @sub_nuw_i64_simp(i64 %a) {
304+
; CHECK-LABEL: @sub_nuw_i64_simp(
305+
; CHECK-NEXT: entry:
306+
; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i64 [[A:%.*]], 305
307+
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]]
308+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
309+
; CHECK: exit.1:
310+
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i64 [[A]], 0
311+
; CHECK-NEXT: ret i1 [[C_2]]
312+
; CHECK: exit.2:
313+
; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i64 [[A]], 0
314+
; CHECK-NEXT: ret i1 true
315+
;
316+
entry:
317+
%neg2 = sub nuw i64 %a, 305
318+
%c.1 = icmp ugt i64 0, %neg2
319+
br i1 %c.1, label %exit.1, label %exit.2
320+
321+
exit.1:
322+
%c.2 = icmp ugt i64 %a, 0
323+
ret i1 %c.2
324+
325+
exit.2:
326+
%c.3 = icmp ugt i64 %a, 0
327+
ret i1 %c.3
328+
}
329+
330+
define i1 @sub_nuw_neg_i16(i16 %a) {
331+
; CHECK-LABEL: @sub_nuw_neg_i16(
332+
; CHECK-NEXT: entry:
333+
; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], -305
334+
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
335+
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
336+
; CHECK: exit.1:
337+
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i16 [[A]], 0
338+
; CHECK-NEXT: ret i1 false
339+
; CHECK: exit.2:
340+
; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i16 [[A]], 0
341+
; CHECK-NEXT: ret i1 [[C_3]]
342+
;
343+
entry:
344+
%neg2 = sub nuw i16 %a, -305
345+
%c.1 = icmp ugt i16 0, %neg2
346+
br i1 %c.1, label %exit.1, label %exit.2
347+
348+
exit.1:
349+
%c.2 = icmp ugt i16 %a, 0
350+
ret i1 %c.2
351+
352+
exit.2:
353+
%c.3 = icmp ugt i16 %a, 0
354+
ret i1 %c.3
355+
}

0 commit comments

Comments
 (0)