Skip to content

Commit 55b4451

Browse files
committed
[NFC][CVP] Add some tests for sub with preexisting no-wrap flags
We can use those to further limit the ranges in LVI.
1 parent a751f55 commit 55b4451

File tree

1 file changed

+216
-0
lines changed
  • llvm/test/Transforms/CorrelatedValuePropagation

1 file changed

+216
-0
lines changed

llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,4 +407,220 @@ define i1 @test13(i8 %x, i64* %p) {
407407
ret i1 %cmp
408408
}
409409

410+
define i1 @test14(i32 %a, i32 %b) {
411+
; CHECK-LABEL: @test14(
412+
; CHECK-NEXT: begin:
413+
; CHECK-NEXT: [[CMP0:%.*]] = icmp sge i32 [[A:%.*]], 0
414+
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
415+
; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
416+
; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
417+
; CHECK: bb:
418+
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], [[B]]
419+
; CHECK-NEXT: br label [[CONT:%.*]]
420+
; CHECK: cont:
421+
; CHECK-NEXT: [[RES:%.*]] = icmp sge i32 [[SUB]], 0
422+
; CHECK-NEXT: br label [[EXIT]]
423+
; CHECK: exit:
424+
; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
425+
; CHECK-NEXT: ret i1 [[IV]]
426+
;
427+
begin:
428+
%cmp0 = icmp sge i32 %a, 0
429+
%cmp1 = icmp sge i32 %b, 0
430+
%br = and i1 %cmp0, %cmp1
431+
br i1 %br, label %bb, label %exit
432+
433+
bb:
434+
%sub = sub i32 %a, %b
435+
br label %cont
436+
437+
cont:
438+
%res = icmp sge i32 %sub, 0
439+
br label %exit
440+
441+
exit:
442+
%iv = phi i1 [ true, %begin ], [ %res, %cont ]
443+
ret i1 %iv
444+
}
445+
446+
define i1 @test15(i32 %a, i32 %b) {
447+
; CHECK-LABEL: @test15(
448+
; CHECK-NEXT: begin:
449+
; CHECK-NEXT: [[CMP0:%.*]] = icmp sge i32 [[A:%.*]], 0
450+
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
451+
; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
452+
; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
453+
; CHECK: bb:
454+
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], [[B]]
455+
; CHECK-NEXT: br label [[CONT:%.*]]
456+
; CHECK: cont:
457+
; CHECK-NEXT: [[RES:%.*]] = icmp sge i32 [[SUB]], 0
458+
; CHECK-NEXT: br label [[EXIT]]
459+
; CHECK: exit:
460+
; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
461+
; CHECK-NEXT: ret i1 [[IV]]
462+
;
463+
begin:
464+
%cmp0 = icmp sge i32 %a, 0
465+
%cmp1 = icmp sge i32 %b, 0
466+
%br = and i1 %cmp0, %cmp1
467+
br i1 %br, label %bb, label %exit
468+
469+
bb:
470+
%sub = sub nsw i32 %a, %b
471+
br label %cont
472+
473+
cont:
474+
%res = icmp sge i32 %sub, 0
475+
br label %exit
476+
477+
exit:
478+
%iv = phi i1 [ true, %begin ], [ %res, %cont ]
479+
ret i1 %iv
480+
}
481+
482+
define i1 @test16(i32 %a, i32 %b) {
483+
; CHECK-LABEL: @test16(
484+
; CHECK-NEXT: begin:
485+
; CHECK-NEXT: [[CMP0:%.*]] = icmp sge i32 [[A:%.*]], 0
486+
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
487+
; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
488+
; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
489+
; CHECK: bb:
490+
; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], [[B]]
491+
; CHECK-NEXT: br label [[CONT:%.*]]
492+
; CHECK: cont:
493+
; CHECK-NEXT: [[RES:%.*]] = icmp sge i32 [[SUB]], 0
494+
; CHECK-NEXT: br label [[EXIT]]
495+
; CHECK: exit:
496+
; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
497+
; CHECK-NEXT: ret i1 [[IV]]
498+
;
499+
begin:
500+
%cmp0 = icmp sge i32 %a, 0
501+
%cmp1 = icmp sge i32 %b, 0
502+
%br = and i1 %cmp0, %cmp1
503+
br i1 %br, label %bb, label %exit
504+
505+
bb:
506+
%sub = sub nuw i32 %a, %b
507+
br label %cont
508+
509+
cont:
510+
%res = icmp sge i32 %sub, 0
511+
br label %exit
512+
513+
exit:
514+
%iv = phi i1 [ true, %begin ], [ %res, %cont ]
515+
ret i1 %iv
516+
}
517+
518+
define i1 @test17(i32 %a, i32 %b) {
519+
; CHECK-LABEL: @test17(
520+
; CHECK-NEXT: begin:
521+
; CHECK-NEXT: [[CMP0:%.*]] = icmp sle i32 [[A:%.*]], 0
522+
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
523+
; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
524+
; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
525+
; CHECK: bb:
526+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], [[B]]
527+
; CHECK-NEXT: br label [[CONT:%.*]]
528+
; CHECK: cont:
529+
; CHECK-NEXT: [[RES:%.*]] = icmp sle i32 [[SUB]], 0
530+
; CHECK-NEXT: br label [[EXIT]]
531+
; CHECK: exit:
532+
; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
533+
; CHECK-NEXT: ret i1 [[IV]]
534+
;
535+
begin:
536+
%cmp0 = icmp sle i32 %a, 0
537+
%cmp1 = icmp sge i32 %b, 0
538+
%br = and i1 %cmp0, %cmp1
539+
br i1 %br, label %bb, label %exit
540+
541+
bb:
542+
%sub = sub i32 %a, %b
543+
br label %cont
544+
545+
cont:
546+
%res = icmp sle i32 %sub, 0
547+
br label %exit
548+
549+
exit:
550+
%iv = phi i1 [ true, %begin ], [ %res, %cont ]
551+
ret i1 %iv
552+
}
553+
554+
define i1 @test18(i32 %a, i32 %b) {
555+
; CHECK-LABEL: @test18(
556+
; CHECK-NEXT: begin:
557+
; CHECK-NEXT: [[CMP0:%.*]] = icmp sle i32 [[A:%.*]], 0
558+
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
559+
; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
560+
; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
561+
; CHECK: bb:
562+
; CHECK-NEXT: [[SUB:%.*]] = sub nuw i32 [[A]], [[B]]
563+
; CHECK-NEXT: br label [[CONT:%.*]]
564+
; CHECK: cont:
565+
; CHECK-NEXT: [[RES:%.*]] = icmp sle i32 [[SUB]], 0
566+
; CHECK-NEXT: br label [[EXIT]]
567+
; CHECK: exit:
568+
; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
569+
; CHECK-NEXT: ret i1 [[IV]]
570+
;
571+
begin:
572+
%cmp0 = icmp sle i32 %a, 0
573+
%cmp1 = icmp sge i32 %b, 0
574+
%br = and i1 %cmp0, %cmp1
575+
br i1 %br, label %bb, label %exit
576+
577+
bb:
578+
%sub = sub nuw i32 %a, %b
579+
br label %cont
580+
581+
cont:
582+
%res = icmp sle i32 %sub, 0
583+
br label %exit
584+
585+
exit:
586+
%iv = phi i1 [ true, %begin ], [ %res, %cont ]
587+
ret i1 %iv
588+
}
589+
590+
define i1 @test19(i32 %a, i32 %b) {
591+
; CHECK-LABEL: @test19(
592+
; CHECK-NEXT: begin:
593+
; CHECK-NEXT: [[CMP0:%.*]] = icmp sle i32 [[A:%.*]], 0
594+
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[B:%.*]], 0
595+
; CHECK-NEXT: [[BR:%.*]] = and i1 [[CMP0]], [[CMP1]]
596+
; CHECK-NEXT: br i1 [[BR]], label [[BB:%.*]], label [[EXIT:%.*]]
597+
; CHECK: bb:
598+
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], [[B]]
599+
; CHECK-NEXT: br label [[CONT:%.*]]
600+
; CHECK: cont:
601+
; CHECK-NEXT: [[RES:%.*]] = icmp sle i32 [[SUB]], 0
602+
; CHECK-NEXT: br label [[EXIT]]
603+
; CHECK: exit:
604+
; CHECK-NEXT: [[IV:%.*]] = phi i1 [ true, [[BEGIN:%.*]] ], [ [[RES]], [[CONT]] ]
605+
; CHECK-NEXT: ret i1 [[IV]]
606+
;
607+
begin:
608+
%cmp0 = icmp sle i32 %a, 0
609+
%cmp1 = icmp sge i32 %b, 0
610+
%br = and i1 %cmp0, %cmp1
611+
br i1 %br, label %bb, label %exit
612+
613+
bb:
614+
%sub = sub nsw i32 %a, %b
615+
br label %cont
616+
617+
cont:
618+
%res = icmp sle i32 %sub, 0
619+
br label %exit
620+
621+
exit:
622+
%iv = phi i1 [ true, %begin ], [ %res, %cont ]
623+
ret i1 %iv
624+
}
625+
410626
attributes #4 = { noreturn }

0 commit comments

Comments
 (0)