@@ -760,6 +760,89 @@ define i32 @abs_diff_signed_slt_no_nsw(i32 %a, i32 %b) {
760
760
ret i32 %cond
761
761
}
762
762
763
+ define i8 @abs_diff_signed_sgt_nsw_nuw (i8 %a , i8 %b ) {
764
+ ; CHECK-LABEL: @abs_diff_signed_sgt_nsw_nuw(
765
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
766
+ ; CHECK-NEXT: [[SUB_BA:%.*]] = sub nuw nsw i8 [[B]], [[A]]
767
+ ; CHECK-NEXT: [[SUB_AB:%.*]] = sub nuw nsw i8 [[A]], [[B]]
768
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[SUB_AB]], i8 [[SUB_BA]]
769
+ ; CHECK-NEXT: ret i8 [[COND]]
770
+ ;
771
+ %cmp = icmp sgt i8 %a , %b
772
+ %sub_ba = sub nsw nuw i8 %b , %a
773
+ %sub_ab = sub nsw nuw i8 %a , %b
774
+ %cond = select i1 %cmp , i8 %sub_ab , i8 %sub_ba
775
+ ret i8 %cond
776
+ }
777
+
778
+ define i8 @abs_diff_signed_sgt_nuw (i8 %a , i8 %b ) {
779
+ ; CHECK-LABEL: @abs_diff_signed_sgt_nuw(
780
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
781
+ ; CHECK-NEXT: [[SUB_BA:%.*]] = sub nuw i8 [[B]], [[A]]
782
+ ; CHECK-NEXT: [[SUB_AB:%.*]] = sub nuw i8 [[A]], [[B]]
783
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[SUB_AB]], i8 [[SUB_BA]]
784
+ ; CHECK-NEXT: ret i8 [[COND]]
785
+ ;
786
+ %cmp = icmp sgt i8 %a , %b
787
+ %sub_ba = sub nuw i8 %b , %a
788
+ %sub_ab = sub nuw i8 %a , %b
789
+ %cond = select i1 %cmp , i8 %sub_ab , i8 %sub_ba
790
+ ret i8 %cond
791
+ }
792
+
793
+ define i8 @abs_diff_signed_sgt_nuw_extra_use1 (i8 %a , i8 %b ) {
794
+ ; CHECK-LABEL: @abs_diff_signed_sgt_nuw_extra_use1(
795
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
796
+ ; CHECK-NEXT: [[SUB_BA:%.*]] = sub nuw i8 [[B]], [[A]]
797
+ ; CHECK-NEXT: call void @extra_use(i8 [[SUB_BA]])
798
+ ; CHECK-NEXT: [[SUB_AB:%.*]] = sub nuw i8 [[A]], [[B]]
799
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[SUB_AB]], i8 [[SUB_BA]]
800
+ ; CHECK-NEXT: ret i8 [[COND]]
801
+ ;
802
+ %cmp = icmp sgt i8 %a , %b
803
+ %sub_ba = sub nuw i8 %b , %a
804
+ call void @extra_use (i8 %sub_ba )
805
+ %sub_ab = sub nuw i8 %a , %b
806
+ %cond = select i1 %cmp , i8 %sub_ab , i8 %sub_ba
807
+ ret i8 %cond
808
+ }
809
+
810
+ define i8 @abs_diff_signed_sgt_nuw_extra_use2 (i8 %a , i8 %b ) {
811
+ ; CHECK-LABEL: @abs_diff_signed_sgt_nuw_extra_use2(
812
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
813
+ ; CHECK-NEXT: [[SUB_BA:%.*]] = sub nuw i8 [[B]], [[A]]
814
+ ; CHECK-NEXT: [[SUB_AB:%.*]] = sub nuw i8 [[A]], [[B]]
815
+ ; CHECK-NEXT: call void @extra_use(i8 [[SUB_AB]])
816
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[SUB_AB]], i8 [[SUB_BA]]
817
+ ; CHECK-NEXT: ret i8 [[COND]]
818
+ ;
819
+ %cmp = icmp sgt i8 %a , %b
820
+ %sub_ba = sub nuw i8 %b , %a
821
+ %sub_ab = sub nuw i8 %a , %b
822
+ call void @extra_use (i8 %sub_ab )
823
+ %cond = select i1 %cmp , i8 %sub_ab , i8 %sub_ba
824
+ ret i8 %cond
825
+ }
826
+
827
+ define i8 @abs_diff_signed_sgt_nuw_extra_use3 (i8 %a , i8 %b ) {
828
+ ; CHECK-LABEL: @abs_diff_signed_sgt_nuw_extra_use3(
829
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
830
+ ; CHECK-NEXT: [[SUB_BA:%.*]] = sub nuw i8 [[B]], [[A]]
831
+ ; CHECK-NEXT: call void @extra_use(i8 [[SUB_BA]])
832
+ ; CHECK-NEXT: [[SUB_AB:%.*]] = sub nuw i8 [[A]], [[B]]
833
+ ; CHECK-NEXT: call void @extra_use(i8 [[SUB_AB]])
834
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[SUB_AB]], i8 [[SUB_BA]]
835
+ ; CHECK-NEXT: ret i8 [[COND]]
836
+ ;
837
+ %cmp = icmp sgt i8 %a , %b
838
+ %sub_ba = sub nuw i8 %b , %a
839
+ call void @extra_use (i8 %sub_ba )
840
+ %sub_ab = sub nuw i8 %a , %b
841
+ call void @extra_use (i8 %sub_ab )
842
+ %cond = select i1 %cmp , i8 %sub_ab , i8 %sub_ba
843
+ ret i8 %cond
844
+ }
845
+
763
846
define i32 @abs_diff_signed_slt_swap_wrong_pred1 (i32 %a , i32 %b ) {
764
847
; CHECK-LABEL: @abs_diff_signed_slt_swap_wrong_pred1(
765
848
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
0 commit comments