@@ -865,9 +865,7 @@ define i32 @abs_range_metadata(i32 %x) {
865865define i32 @abs_diff (i32 %x , i32 %y ) {
866866; CHECK-LABEL: @abs_diff(
867867; 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]]
868+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[SUB]], i1 false)
871869; CHECK-NEXT: ret i32 [[COND]]
872870;
873871 %sub = sub nsw i32 %x , %y
@@ -925,9 +923,33 @@ define i32 @abs_diff_neg_no_nsw(i32 %x, i32 %y) {
925923define i32 @abs_diff_ge (i32 %x , i32 %y ) {
926924; CHECK-LABEL: @abs_diff_ge(
927925; 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]]
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)
931953; CHECK-NEXT: ret i32 [[COND]]
932954;
933955 %sub = sub nsw i32 %x , %y
@@ -936,3 +958,42 @@ define i32 @abs_diff_ge(i32 %x, i32 %y) {
936958 %cond = select i1 %cmp , i32 %sub , i32 %sub1
937959 ret i32 %cond
938960}
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