Skip to content

Commit 9b982f6

Browse files
committed
[ConstraintElim] Add pre-commit tests. NFC.
1 parent e5054fb commit 9b982f6

File tree

1 file changed

+265
-0
lines changed
  • llvm/test/Transforms/ConstraintElimination

1 file changed

+265
-0
lines changed

llvm/test/Transforms/ConstraintElimination/minmax.ll

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,271 @@ end:
343343
ret i32 0
344344
}
345345

346+
; Test from PR75155
347+
define i32 @simplify_slt_smax_val(i32 %a, i32 %b) {
348+
; CHECK-LABEL: define i32 @simplify_slt_smax_val
349+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
350+
; CHECK-NEXT: start:
351+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
352+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
353+
; CHECK: then:
354+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
355+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
356+
; CHECK-NEXT: ret i32 [[MAX]]
357+
; CHECK: else:
358+
; CHECK-NEXT: ret i32 -1
359+
;
360+
start:
361+
%cmp = icmp slt i32 %a, %b
362+
br i1 %cmp, label %then, label %else
363+
then:
364+
%add = add nsw i32 %a, 1
365+
%max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
366+
ret i32 %max
367+
else:
368+
ret i32 -1
369+
}
370+
371+
define i32 @simplify_slt_smax_val_commuted(i32 %a, i32 %b) {
372+
; CHECK-LABEL: define i32 @simplify_slt_smax_val_commuted
373+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
374+
; CHECK-NEXT: start:
375+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
376+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
377+
; CHECK: then:
378+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
379+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[ADD]], i32 [[B]])
380+
; CHECK-NEXT: ret i32 [[MAX]]
381+
; CHECK: else:
382+
; CHECK-NEXT: ret i32 -1
383+
;
384+
start:
385+
%cmp = icmp slt i32 %a, %b
386+
br i1 %cmp, label %then, label %else
387+
then:
388+
%add = add nsw i32 %a, 1
389+
%max = call i32 @llvm.smax.i32(i32 %add, i32 %b)
390+
ret i32 %max
391+
else:
392+
ret i32 -1
393+
}
394+
395+
define i32 @simplify_slt_smax_val_at_use(i32 %a, i32 %b) {
396+
; CHECK-LABEL: define i32 @simplify_slt_smax_val_at_use
397+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
398+
; CHECK-NEXT: start:
399+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
400+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
401+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
402+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
403+
; CHECK: then:
404+
; CHECK-NEXT: ret i32 [[MAX]]
405+
; CHECK: else:
406+
; CHECK-NEXT: ret i32 -1
407+
;
408+
start:
409+
%cmp = icmp slt i32 %a, %b
410+
%add = add nsw i32 %a, 1
411+
%max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
412+
br i1 %cmp, label %then, label %else
413+
then:
414+
ret i32 %max
415+
else:
416+
ret i32 -1
417+
}
418+
419+
define i32 @simplify_sgt_smax_val(i32 %a, i32 %b) {
420+
; CHECK-LABEL: define i32 @simplify_sgt_smax_val
421+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
422+
; CHECK-NEXT: start:
423+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], [[B]]
424+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
425+
; CHECK: then:
426+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
427+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
428+
; CHECK-NEXT: ret i32 [[MAX]]
429+
; CHECK: else:
430+
; CHECK-NEXT: ret i32 -1
431+
;
432+
start:
433+
%cmp = icmp sgt i32 %a, %b
434+
br i1 %cmp, label %then, label %else
435+
then:
436+
%add = add nsw i32 %a, 1
437+
%max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
438+
ret i32 %max
439+
else:
440+
ret i32 -1
441+
}
442+
443+
define i32 @simplify_sle_smax_val(i32 %a, i32 %b) {
444+
; CHECK-LABEL: define i32 @simplify_sle_smax_val
445+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
446+
; CHECK-NEXT: start:
447+
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A]], [[B]]
448+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
449+
; CHECK: then:
450+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
451+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
452+
; CHECK-NEXT: ret i32 [[MAX]]
453+
; CHECK: else:
454+
; CHECK-NEXT: ret i32 -1
455+
;
456+
start:
457+
%cmp = icmp sle i32 %a, %b
458+
br i1 %cmp, label %then, label %else
459+
then:
460+
%add = add nsw i32 %a, 1
461+
%max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
462+
ret i32 %max
463+
else:
464+
ret i32 -1
465+
}
466+
467+
define i32 @simplify_sge_smax_val(i32 %a, i32 %b) {
468+
; CHECK-LABEL: define i32 @simplify_sge_smax_val
469+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
470+
; CHECK-NEXT: start:
471+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A]], [[B]]
472+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
473+
; CHECK: then:
474+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
475+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
476+
; CHECK-NEXT: ret i32 [[MAX]]
477+
; CHECK: else:
478+
; CHECK-NEXT: ret i32 -1
479+
;
480+
start:
481+
%cmp = icmp sge i32 %a, %b
482+
br i1 %cmp, label %then, label %else
483+
then:
484+
%add = add nsw i32 %a, 1
485+
%max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
486+
ret i32 %max
487+
else:
488+
ret i32 -1
489+
}
490+
491+
define i32 @simplify_ult_umax_val(i32 %a, i32 %b) {
492+
; CHECK-LABEL: define i32 @simplify_ult_umax_val
493+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
494+
; CHECK-NEXT: start:
495+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
496+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
497+
; CHECK: then:
498+
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
499+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[B]], i32 [[ADD]])
500+
; CHECK-NEXT: ret i32 [[MAX]]
501+
; CHECK: else:
502+
; CHECK-NEXT: ret i32 -1
503+
;
504+
start:
505+
%cmp = icmp ult i32 %a, %b
506+
br i1 %cmp, label %then, label %else
507+
then:
508+
%add = add nuw i32 %a, 1
509+
%max = call i32 @llvm.umax.i32(i32 %b, i32 %add)
510+
ret i32 %max
511+
else:
512+
ret i32 -1
513+
}
514+
515+
define i32 @simplify_slt_smin_val(i32 %a, i32 %b) {
516+
; CHECK-LABEL: define i32 @simplify_slt_smin_val
517+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
518+
; CHECK-NEXT: start:
519+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
520+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
521+
; CHECK: then:
522+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
523+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smin.i32(i32 [[B]], i32 [[ADD]])
524+
; CHECK-NEXT: ret i32 [[MAX]]
525+
; CHECK: else:
526+
; CHECK-NEXT: ret i32 -1
527+
;
528+
start:
529+
%cmp = icmp slt i32 %a, %b
530+
br i1 %cmp, label %then, label %else
531+
then:
532+
%add = add nsw i32 %a, 1
533+
%max = call i32 @llvm.smin.i32(i32 %b, i32 %add)
534+
ret i32 %max
535+
else:
536+
ret i32 -1
537+
}
538+
539+
define i32 @simplify_ult_umin_val(i32 %a, i32 %b) {
540+
; CHECK-LABEL: define i32 @simplify_ult_umin_val
541+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
542+
; CHECK-NEXT: start:
543+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
544+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
545+
; CHECK: then:
546+
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
547+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umin.i32(i32 [[B]], i32 [[ADD]])
548+
; CHECK-NEXT: ret i32 [[MAX]]
549+
; CHECK: else:
550+
; CHECK-NEXT: ret i32 -1
551+
;
552+
start:
553+
%cmp = icmp ult i32 %a, %b
554+
br i1 %cmp, label %then, label %else
555+
then:
556+
%add = add nuw i32 %a, 1
557+
%max = call i32 @llvm.umin.i32(i32 %b, i32 %add)
558+
ret i32 %max
559+
else:
560+
ret i32 -1
561+
}
562+
563+
define i32 @simplify_slt_smax_val_fail1(i32 %a, i32 %b) {
564+
; CHECK-LABEL: define i32 @simplify_slt_smax_val_fail1
565+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
566+
; CHECK-NEXT: start:
567+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
568+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
569+
; CHECK: then:
570+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 2
571+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
572+
; CHECK-NEXT: ret i32 [[MAX]]
573+
; CHECK: else:
574+
; CHECK-NEXT: ret i32 -1
575+
;
576+
start:
577+
%cmp = icmp slt i32 %a, %b
578+
br i1 %cmp, label %then, label %else
579+
then:
580+
%add = add nsw i32 %a, 2
581+
%max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
582+
ret i32 %max
583+
else:
584+
ret i32 -1
585+
}
586+
587+
define i32 @simplify_ult_smax_val_fail2(i32 %a, i32 %b) {
588+
; CHECK-LABEL: define i32 @simplify_ult_smax_val_fail2
589+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
590+
; CHECK-NEXT: start:
591+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
592+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
593+
; CHECK: then:
594+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
595+
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
596+
; CHECK-NEXT: ret i32 [[MAX]]
597+
; CHECK: else:
598+
; CHECK-NEXT: ret i32 -1
599+
;
600+
start:
601+
%cmp = icmp ult i32 %a, %b
602+
br i1 %cmp, label %then, label %else
603+
then:
604+
%add = add nsw i32 %a, 1
605+
%max = call i32 @llvm.smax.i32(i32 %b, i32 %add)
606+
ret i32 %max
607+
else:
608+
ret i32 -1
609+
}
610+
346611
declare i32 @llvm.smin.i32(i32, i32)
347612
declare i32 @llvm.smax.i32(i32, i32)
348613
declare i32 @llvm.umin.i32(i32, i32)

0 commit comments

Comments
 (0)