@@ -859,4 +859,141 @@ define i32 @abs_range_metadata(i32 %x) {
859859 %b = and i32 %a , 15
860860 ret i32 %b
861861}
862+
862863!1 = !{i32 0 , i32 16 }
864+
865+ define i32 @abs_diff (i32 %x , i32 %y ) {
866+ ; CHECK-LABEL: @abs_diff(
867+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
868+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
869+ ; CHECK-NEXT: ret i32 [[COND]]
870+ ;
871+ %sub = sub nsw i32 %x , %y
872+ %cmp = icmp sgt i32 %x , %y
873+ %sub1 = sub i32 0 , %sub
874+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
875+ ret i32 %cond
876+ }
877+
878+ define i32 @abs_diff_neg_no_nsw_neg (i32 %x , i32 %y ) {
879+ ; CHECK-LABEL: @abs_diff_neg_no_nsw_neg(
880+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[X:%.*]], [[Y:%.*]]
881+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
882+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
883+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[SUB1]]
884+ ; CHECK-NEXT: ret i32 [[COND]]
885+ ;
886+ %sub = sub i32 %x , %y
887+ %cmp = icmp sgt i32 %x , %y
888+ %sub1 = sub i32 0 , %sub
889+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
890+ ret i32 %cond
891+ }
892+
893+ define i32 @abs_diff_neg (i32 %x , i32 %y ) {
894+ ; CHECK-LABEL: @abs_diff_neg(
895+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y:%.*]], [[X:%.*]]
896+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
897+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
898+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[SUB1]]
899+ ; CHECK-NEXT: ret i32 [[COND]]
900+ ;
901+ %sub = sub nsw i32 %y , %x
902+ %cmp = icmp sgt i32 %x , %y
903+ %sub1 = sub i32 0 , %sub
904+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
905+ ret i32 %cond
906+ }
907+
908+ define i32 @abs_diff_neg_no_nsw (i32 %x , i32 %y ) {
909+ ; CHECK-LABEL: @abs_diff_neg_no_nsw(
910+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[Y:%.*]], [[X:%.*]]
911+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
912+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
913+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[SUB1]]
914+ ; CHECK-NEXT: ret i32 [[COND]]
915+ ;
916+ %sub = sub i32 %y , %x
917+ %cmp = icmp sgt i32 %x , %y
918+ %sub1 = sub i32 0 , %sub
919+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
920+ ret i32 %cond
921+ }
922+
923+ define i32 @abs_diff_ge (i32 %x , i32 %y ) {
924+ ; CHECK-LABEL: @abs_diff_ge(
925+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
926+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
927+ ; CHECK-NEXT: ret i32 [[COND]]
928+ ;
929+ %sub = sub nsw i32 %x , %y
930+ %cmp = icmp sge i32 %x , %y
931+ %sub1 = sub i32 0 , %sub
932+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
933+ ret i32 %cond
934+ }
935+
936+ define i32 @abs_diff_slt_commute (i32 %x , i32 %y ) {
937+ ; CHECK-LABEL: @abs_diff_slt_commute(
938+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
939+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
940+ ; CHECK-NEXT: ret i32 [[COND]]
941+ ;
942+ %sub = sub nsw i32 %x , %y
943+ %cmp = icmp slt i32 %y , %x
944+ %sub1 = sub i32 0 , %sub
945+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
946+ ret i32 %cond
947+ }
948+
949+ define i32 @abs_diff_sge_same (i32 %x , i32 %y ) {
950+ ; CHECK-LABEL: @abs_diff_sge_same(
951+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
952+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
953+ ; CHECK-NEXT: ret i32 [[COND]]
954+ ;
955+ %sub = sub nsw i32 %x , %y
956+ %cmp = icmp sge i32 %x , %y
957+ %sub1 = sub i32 0 , %sub
958+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
959+ ret i32 %cond
960+ }
961+
962+ define i32 @abs_diff_sle_inverted (i32 %x , i32 %y ) {
963+ ; CHECK-LABEL: @abs_diff_sle_inverted(
964+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
965+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
966+ ; CHECK-NEXT: ret i32 [[COND]]
967+ ;
968+ %sub = sub nsw i32 %x , %y
969+ %cmp = icmp sle i32 %x , %y
970+ %sub1 = sub i32 0 , %sub
971+ %cond = select i1 %cmp , i32 %sub1 , i32 %sub
972+ ret i32 %cond
973+ }
974+
975+ define i32 @abs_diff_sle_commute (i32 %x , i32 %y ) {
976+ ; CHECK-LABEL: @abs_diff_sle_commute(
977+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
978+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
979+ ; CHECK-NEXT: ret i32 [[COND]]
980+ ;
981+ %sub = sub nsw i32 %x , %y
982+ %cmp = icmp sle i32 %y , %x
983+ %sub1 = sub i32 0 , %sub
984+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
985+ ret i32 %cond
986+ }
987+
988+ define i8 @abs_diff_sle_y_x (i8 %x , i8 %y ) {
989+ ; CHECK-LABEL: @abs_diff_sle_y_x(
990+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]]
991+ ; CHECK-NEXT: [[COND:%.*]] = call i8 @llvm.abs.i8(i8 [[SUB]], i1 false)
992+ ; CHECK-NEXT: ret i8 [[COND]]
993+ ;
994+ %sub = sub nsw i8 %x , %y
995+ %cmp = icmp sle i8 %y , %x
996+ %sub1 = sub i8 0 , %sub
997+ %cond = select i1 %cmp , i8 %sub , i8 %sub1
998+ ret i8 %cond
999+ }
0 commit comments