Skip to content

Commit 040871d

Browse files
committed
[CVP] Add tests for range of with.overflow result; NFC
Test range of with.overflow result in the no-overflow branch. llvm-svn: 358341
1 parent a96480e commit 040871d

File tree

1 file changed

+252
-0
lines changed

1 file changed

+252
-0
lines changed

llvm/test/Transforms/CorrelatedValuePropagation/overflow_predicate.ll

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,3 +472,255 @@ trap:
472472
call void @llvm.trap()
473473
unreachable
474474
}
475+
476+
define i1 @uadd_val(i8 %x, i1* %pc) {
477+
; CHECK-LABEL: @uadd_val(
478+
; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 [[X:%.*]], i8 100)
479+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
480+
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
481+
; CHECK: no_overflow:
482+
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
483+
; CHECK-NEXT: br label [[SPLIT:%.*]]
484+
; CHECK: split:
485+
; CHECK-NEXT: [[C1:%.*]] = icmp ugt i8 [[VAL]], 100
486+
; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
487+
; CHECK-NEXT: [[C2:%.*]] = icmp uge i8 [[VAL]], 100
488+
; CHECK-NEXT: ret i1 [[C2]]
489+
; CHECK: trap:
490+
; CHECK-NEXT: call void @llvm.trap()
491+
; CHECK-NEXT: unreachable
492+
;
493+
%val_ov = call {i8, i1} @llvm.uadd.with.overflow(i8 %x, i8 100)
494+
%ov = extractvalue {i8, i1} %val_ov, 1
495+
br i1 %ov, label %trap, label %no_overflow
496+
497+
no_overflow:
498+
%val = extractvalue {i8, i1} %val_ov, 0
499+
br label %split
500+
501+
split:
502+
%c1 = icmp ugt i8 %val, 100
503+
store i1 %c1, i1* %pc
504+
%c2 = icmp uge i8 %val, 100
505+
ret i1 %c2
506+
507+
trap:
508+
call void @llvm.trap()
509+
unreachable
510+
}
511+
512+
define i1 @sadd_val(i8 %x, i1* %pc) {
513+
; CHECK-LABEL: @sadd_val(
514+
; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 100)
515+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
516+
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
517+
; CHECK: no_overflow:
518+
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
519+
; CHECK-NEXT: br label [[SPLIT:%.*]]
520+
; CHECK: split:
521+
; CHECK-NEXT: [[C1:%.*]] = icmp sgt i8 [[VAL]], -28
522+
; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
523+
; CHECK-NEXT: [[C2:%.*]] = icmp sge i8 [[VAL]], -28
524+
; CHECK-NEXT: ret i1 [[C2]]
525+
; CHECK: trap:
526+
; CHECK-NEXT: call void @llvm.trap()
527+
; CHECK-NEXT: unreachable
528+
;
529+
%val_ov = call {i8, i1} @llvm.sadd.with.overflow(i8 %x, i8 100)
530+
%ov = extractvalue {i8, i1} %val_ov, 1
531+
br i1 %ov, label %trap, label %no_overflow
532+
533+
no_overflow:
534+
%val = extractvalue {i8, i1} %val_ov, 0
535+
br label %split
536+
537+
split:
538+
%c1 = icmp sgt i8 %val, -28
539+
store i1 %c1, i1* %pc
540+
%c2 = icmp sge i8 %val, -28
541+
ret i1 %c2
542+
543+
trap:
544+
call void @llvm.trap()
545+
unreachable
546+
}
547+
548+
define i1 @usub_val(i8 %x, i1* %pc) {
549+
; CHECK-LABEL: @usub_val(
550+
; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[X:%.*]], i8 100)
551+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
552+
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
553+
; CHECK: no_overflow:
554+
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
555+
; CHECK-NEXT: br label [[SPLIT:%.*]]
556+
; CHECK: split:
557+
; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[VAL]], -101
558+
; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
559+
; CHECK-NEXT: [[C2:%.*]] = icmp ule i8 [[VAL]], -101
560+
; CHECK-NEXT: ret i1 [[C2]]
561+
; CHECK: trap:
562+
; CHECK-NEXT: call void @llvm.trap()
563+
; CHECK-NEXT: unreachable
564+
;
565+
%val_ov = call {i8, i1} @llvm.usub.with.overflow(i8 %x, i8 100)
566+
%ov = extractvalue {i8, i1} %val_ov, 1
567+
br i1 %ov, label %trap, label %no_overflow
568+
569+
no_overflow:
570+
%val = extractvalue {i8, i1} %val_ov, 0
571+
br label %split
572+
573+
split:
574+
%c1 = icmp ult i8 %val, 155
575+
store i1 %c1, i1* %pc
576+
%c2 = icmp ule i8 %val, 155
577+
ret i1 %c2
578+
579+
trap:
580+
call void @llvm.trap()
581+
unreachable
582+
}
583+
584+
define i1 @ssub_val(i8 %x, i1* %pc) {
585+
; CHECK-LABEL: @ssub_val(
586+
; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 100)
587+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
588+
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
589+
; CHECK: no_overflow:
590+
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
591+
; CHECK-NEXT: br label [[SPLIT:%.*]]
592+
; CHECK: split:
593+
; CHECK-NEXT: [[C1:%.*]] = icmp slt i8 [[VAL]], 27
594+
; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
595+
; CHECK-NEXT: [[C2:%.*]] = icmp sle i8 [[VAL]], 27
596+
; CHECK-NEXT: ret i1 [[C2]]
597+
; CHECK: trap:
598+
; CHECK-NEXT: call void @llvm.trap()
599+
; CHECK-NEXT: unreachable
600+
;
601+
%val_ov = call {i8, i1} @llvm.ssub.with.overflow(i8 %x, i8 100)
602+
%ov = extractvalue {i8, i1} %val_ov, 1
603+
br i1 %ov, label %trap, label %no_overflow
604+
605+
no_overflow:
606+
%val = extractvalue {i8, i1} %val_ov, 0
607+
br label %split
608+
609+
split:
610+
%c1 = icmp slt i8 %val, 27
611+
store i1 %c1, i1* %pc
612+
%c2 = icmp sle i8 %val, 27
613+
ret i1 %c2
614+
615+
trap:
616+
call void @llvm.trap()
617+
unreachable
618+
}
619+
620+
define i1 @umul_val(i8 %x, i1* %pc) {
621+
; CHECK-LABEL: @umul_val(
622+
; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.umul.with.overflow.i8(i8 [[X:%.*]], i8 10)
623+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
624+
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
625+
; CHECK: no_overflow:
626+
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
627+
; CHECK-NEXT: br label [[SPLIT:%.*]]
628+
; CHECK: split:
629+
; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[VAL]], -6
630+
; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
631+
; CHECK-NEXT: [[C2:%.*]] = icmp ule i8 [[VAL]], -6
632+
; CHECK-NEXT: ret i1 [[C2]]
633+
; CHECK: trap:
634+
; CHECK-NEXT: call void @llvm.trap()
635+
; CHECK-NEXT: unreachable
636+
;
637+
%val_ov = call {i8, i1} @llvm.umul.with.overflow(i8 %x, i8 10)
638+
%ov = extractvalue {i8, i1} %val_ov, 1
639+
br i1 %ov, label %trap, label %no_overflow
640+
641+
no_overflow:
642+
%val = extractvalue {i8, i1} %val_ov, 0
643+
br label %split
644+
645+
split:
646+
%c1 = icmp ult i8 %val, 250
647+
store i1 %c1, i1* %pc
648+
%c2 = icmp ule i8 %val, 250
649+
ret i1 %c2
650+
651+
trap:
652+
call void @llvm.trap()
653+
unreachable
654+
}
655+
656+
define i1 @smul_val_bound1(i8 %x, i1* %pc) {
657+
; CHECK-LABEL: @smul_val_bound1(
658+
; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 [[X:%.*]], i8 10)
659+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
660+
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
661+
; CHECK: no_overflow:
662+
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
663+
; CHECK-NEXT: br label [[SPLIT:%.*]]
664+
; CHECK: split:
665+
; CHECK-NEXT: [[C1:%.*]] = icmp slt i8 [[VAL]], 120
666+
; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
667+
; CHECK-NEXT: [[C2:%.*]] = icmp sle i8 [[VAL]], 120
668+
; CHECK-NEXT: ret i1 [[C2]]
669+
; CHECK: trap:
670+
; CHECK-NEXT: call void @llvm.trap()
671+
; CHECK-NEXT: unreachable
672+
;
673+
%val_ov = call {i8, i1} @llvm.smul.with.overflow(i8 %x, i8 10)
674+
%ov = extractvalue {i8, i1} %val_ov, 1
675+
br i1 %ov, label %trap, label %no_overflow
676+
677+
no_overflow:
678+
%val = extractvalue {i8, i1} %val_ov, 0
679+
br label %split
680+
681+
split:
682+
%c1 = icmp slt i8 %val, 120
683+
store i1 %c1, i1* %pc
684+
%c2 = icmp sle i8 %val, 120
685+
ret i1 %c2
686+
687+
trap:
688+
call void @llvm.trap()
689+
unreachable
690+
}
691+
692+
define i1 @smul_val_bound2(i8 %x, i1* %pc) {
693+
; CHECK-LABEL: @smul_val_bound2(
694+
; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 [[X:%.*]], i8 10)
695+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
696+
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
697+
; CHECK: no_overflow:
698+
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
699+
; CHECK-NEXT: br label [[SPLIT:%.*]]
700+
; CHECK: split:
701+
; CHECK-NEXT: [[C1:%.*]] = icmp sgt i8 [[VAL]], -120
702+
; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
703+
; CHECK-NEXT: [[C2:%.*]] = icmp sge i8 [[VAL]], -120
704+
; CHECK-NEXT: ret i1 [[C2]]
705+
; CHECK: trap:
706+
; CHECK-NEXT: call void @llvm.trap()
707+
; CHECK-NEXT: unreachable
708+
;
709+
%val_ov = call {i8, i1} @llvm.smul.with.overflow(i8 %x, i8 10)
710+
%ov = extractvalue {i8, i1} %val_ov, 1
711+
br i1 %ov, label %trap, label %no_overflow
712+
713+
no_overflow:
714+
%val = extractvalue {i8, i1} %val_ov, 0
715+
br label %split
716+
717+
split:
718+
%c1 = icmp sgt i8 %val, -120
719+
store i1 %c1, i1* %pc
720+
%c2 = icmp sge i8 %val, -120
721+
ret i1 %c2
722+
723+
trap:
724+
call void @llvm.trap()
725+
unreachable
726+
}

0 commit comments

Comments
 (0)