@@ -859,4 +859,80 @@ 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: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
869+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
870+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[SUB1]]
871+ ; CHECK-NEXT: ret i32 [[COND]]
872+ ;
873+ %sub = sub nsw i32 %x , %y
874+ %cmp = icmp sgt i32 %x , %y
875+ %sub1 = sub i32 0 , %sub
876+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
877+ ret i32 %cond
878+ }
879+
880+ define i32 @abs_diff_neg_no_nsw_neg (i32 %x , i32 %y ) {
881+ ; CHECK-LABEL: @abs_diff_neg_no_nsw_neg(
882+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[X:%.*]], [[Y:%.*]]
883+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
884+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
885+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[SUB1]]
886+ ; CHECK-NEXT: ret i32 [[COND]]
887+ ;
888+ %sub = sub i32 %x , %y
889+ %cmp = icmp sgt i32 %x , %y
890+ %sub1 = sub i32 0 , %sub
891+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
892+ ret i32 %cond
893+ }
894+
895+ define i32 @abs_diff_neg (i32 %x , i32 %y ) {
896+ ; CHECK-LABEL: @abs_diff_neg(
897+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y:%.*]], [[X:%.*]]
898+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
899+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
900+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[SUB1]]
901+ ; CHECK-NEXT: ret i32 [[COND]]
902+ ;
903+ %sub = sub nsw i32 %y , %x
904+ %cmp = icmp sgt i32 %x , %y
905+ %sub1 = sub i32 0 , %sub
906+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
907+ ret i32 %cond
908+ }
909+
910+ define i32 @abs_diff_neg_no_nsw (i32 %x , i32 %y ) {
911+ ; CHECK-LABEL: @abs_diff_neg_no_nsw(
912+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[Y:%.*]], [[X:%.*]]
913+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
914+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
915+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[SUB1]]
916+ ; CHECK-NEXT: ret i32 [[COND]]
917+ ;
918+ %sub = sub i32 %y , %x
919+ %cmp = icmp sgt i32 %x , %y
920+ %sub1 = sub i32 0 , %sub
921+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
922+ ret i32 %cond
923+ }
924+
925+ define i32 @abs_diff_ge (i32 %x , i32 %y ) {
926+ ; CHECK-LABEL: @abs_diff_ge(
927+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
928+ ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i32 [[X]], [[Y]]
929+ ; CHECK-NEXT: [[SUB1:%.*]] = sub i32 0, [[SUB]]
930+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP_NOT]], i32 [[SUB1]], i32 [[SUB]]
931+ ; CHECK-NEXT: ret i32 [[COND]]
932+ ;
933+ %sub = sub nsw i32 %x , %y
934+ %cmp = icmp sge i32 %x , %y
935+ %sub1 = sub i32 0 , %sub
936+ %cond = select i1 %cmp , i32 %sub , i32 %sub1
937+ ret i32 %cond
938+ }
0 commit comments