diff --git a/llvm/test/Transforms/InstCombine/sub-minmax.ll b/llvm/test/Transforms/InstCombine/sub-minmax.ll index 0d27bf9e427846..8465535fdb2e3b 100644 --- a/llvm/test/Transforms/InstCombine/sub-minmax.ll +++ b/llvm/test/Transforms/InstCombine/sub-minmax.ll @@ -732,5 +732,102 @@ define i8 @sub_add_umin(i8 %x, i8 %y, i8 %z) { ret i8 %s } +define i8 @sub_add_umin_commute_umin(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sub_add_umin_commute_umin( +; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[Y]]) +; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] +; CHECK-NEXT: ret i8 [[S]] +; + %a = add i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %z, i8 %y) + %s = sub i8 %a, %m + ret i8 %s +} + +define i8 @sub_add_umin_commute_add(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sub_add_umin_commute_add( +; CHECK-NEXT: [[A:%.*]] = add i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[Z:%.*]]) +; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] +; CHECK-NEXT: ret i8 [[S]] +; + %a = add i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %z) + %s = sub i8 %a, %m + ret i8 %s +} + +define i8 @sub_add_umin_commute_add_umin(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sub_add_umin_commute_add_umin( +; CHECK-NEXT: [[A:%.*]] = add i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[Y]]) +; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] +; CHECK-NEXT: ret i8 [[S]] +; + %a = add i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %z, i8 %y) + %s = sub i8 %a, %m + ret i8 %s +} + +define <2 x i8> @sub_add_umin_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { +; CHECK-LABEL: @sub_add_umin_vec( +; CHECK-NEXT: [[A:%.*]] = add <2 x i8> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[Y]], <2 x i8> [[Z:%.*]]) +; CHECK-NEXT: [[S:%.*]] = sub <2 x i8> [[A]], [[M]] +; CHECK-NEXT: ret <2 x i8> [[S]] +; + %a = add <2 x i8> %x, %y + %m = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %y, <2 x i8> %z) + %s = sub <2 x i8> %a, %m + ret <2 x i8> %s +} + +; negative test + +define i8 @sub_add_umin_mismatch(i8 %x, i8 %y, i8 %z, i8 %t) { +; CHECK-LABEL: @sub_add_umin_mismatch( +; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[T:%.*]], i8 [[Z:%.*]]) +; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] +; CHECK-NEXT: ret i8 [[S]] +; + %a = add i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %t, i8 %z) + %s = sub i8 %a, %m + ret i8 %s +} + +define i8 @sub_add_umin_use_a(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sub_add_umin_use_a( +; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[Z:%.*]]) +; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] +; CHECK-NEXT: call void @use8(i8 [[A]]) +; CHECK-NEXT: ret i8 [[S]] +; + %a = add i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %z) + %s = sub i8 %a, %m + call void @use8(i8 %a) + ret i8 %s +} + +define i8 @sub_add_umin_use_m(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @sub_add_umin_use_m( +; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[Z:%.*]]) +; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] +; CHECK-NEXT: call void @use8(i8 [[M]]) +; CHECK-NEXT: ret i8 [[S]] +; + %a = add i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %z) + %s = sub i8 %a, %m + call void @use8(i8 %m) + ret i8 %s +} + declare void @use8(i8) declare void @use32(i32 %u)