186 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=sccp -S < %s | FileCheck %s3 4define i32 @scmp_to_sub(i32 range(i32 -1, 2) %a) {5; CHECK-LABEL: define i32 @scmp_to_sub(6; CHECK-SAME: i32 range(i32 -1, 2) [[A:%.*]]) {7; CHECK-NEXT: [[SCMP:%.*]] = sub nsw i32 [[A]], 08; CHECK-NEXT: ret i32 [[SCMP]]9;10 %scmp = call i32 @llvm.scmp(i32 %a, i32 0)11 ret i32 %scmp12}13 14define i32 @scmp_zext_to_sub(i1 %a, i1 %b) {15; CHECK-LABEL: define i32 @scmp_zext_to_sub(16; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {17; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A]] to i3218; CHECK-NEXT: [[ZEXT_B:%.*]] = zext i1 [[B]] to i3219; CHECK-NEXT: [[SCMP:%.*]] = sub nsw i32 [[ZEXT_A]], [[ZEXT_B]]20; CHECK-NEXT: ret i32 [[SCMP]]21;22 %zext_a = zext i1 %a to i3223 %zext_b = zext i1 %b to i3224 %scmp = call i32 @llvm.scmp(i32 %zext_a, i32 %zext_b)25 ret i32 %scmp26}27 28define i8 @scmp_to_sub_trunc(i32 range(i32 -1, 2) %a) {29; CHECK-LABEL: define i8 @scmp_to_sub_trunc(30; CHECK-SAME: i32 range(i32 -1, 2) [[A:%.*]]) {31; CHECK-NEXT: [[SCMP1:%.*]] = sub nsw i32 [[A]], 032; CHECK-NEXT: [[SCMP:%.*]] = trunc i32 [[SCMP1]] to i833; CHECK-NEXT: ret i8 [[SCMP]]34;35 %scmp = call i8 @llvm.scmp(i32 %a, i32 0)36 ret i8 %scmp37}38 39define i64 @scmp_to_sub_sext(i32 range(i32 -1, 2) %a) {40; CHECK-LABEL: define i64 @scmp_to_sub_sext(41; CHECK-SAME: i32 range(i32 -1, 2) [[A:%.*]]) {42; CHECK-NEXT: [[SCMP1:%.*]] = sub nsw i32 [[A]], 043; CHECK-NEXT: [[SCMP:%.*]] = sext i32 [[SCMP1]] to i6444; CHECK-NEXT: ret i64 [[SCMP]]45;46 %scmp = call i64 @llvm.scmp(i32 %a, i32 0)47 ret i64 %scmp48}49 50define i32 @scmp_to_sub_small_range(i32 range(i32 -1, 1) %a) {51; CHECK-LABEL: define i32 @scmp_to_sub_small_range(52; CHECK-SAME: i32 range(i32 -1, 1) [[A:%.*]]) {53; CHECK-NEXT: [[SCMP:%.*]] = sub nsw i32 [[A]], 054; CHECK-NEXT: ret i32 [[SCMP]]55;56 %scmp = call i32 @llvm.scmp(i32 %a, i32 0)57 ret i32 %scmp58}59 60define i32 @ucmp_to_sub(i32 range(i32 0, 3) %a) {61; CHECK-LABEL: define i32 @ucmp_to_sub(62; CHECK-SAME: i32 range(i32 0, 3) [[A:%.*]]) {63; CHECK-NEXT: [[SCMP:%.*]] = sub i32 [[A]], 164; CHECK-NEXT: ret i32 [[SCMP]]65;66 %ucmp = call i32 @llvm.ucmp(i32 %a, i32 1)67 ret i32 %ucmp68}69 70define i8 @ucmp_to_sub_trunc(i32 range(i32 0, 3) %a) {71; CHECK-LABEL: define i8 @ucmp_to_sub_trunc(72; CHECK-SAME: i32 range(i32 0, 3) [[A:%.*]]) {73; CHECK-NEXT: [[UCMP1:%.*]] = sub i32 [[A]], 174; CHECK-NEXT: [[UCMP:%.*]] = trunc i32 [[UCMP1]] to i875; CHECK-NEXT: ret i8 [[UCMP]]76;77 %ucmp = call i8 @llvm.ucmp(i32 %a, i32 1)78 ret i8 %ucmp79}80 81define i64 @ucmp_to_sub_sext(i32 range(i32 0, 3) %a) {82; CHECK-LABEL: define i64 @ucmp_to_sub_sext(83; CHECK-SAME: i32 range(i32 0, 3) [[A:%.*]]) {84; CHECK-NEXT: [[UCMP1:%.*]] = sub i32 [[A]], 185; CHECK-NEXT: [[UCMP:%.*]] = sext i32 [[UCMP1]] to i6486; CHECK-NEXT: ret i64 [[UCMP]]87;88 %ucmp = call i64 @llvm.ucmp(i32 %a, i32 1)89 ret i64 %ucmp90}91 92; TODO: we can fold this into %a.93define i32 @ucmp_to_sub_small_range(i32 range(i32 0, 2) %a) {94; CHECK-LABEL: define i32 @ucmp_to_sub_small_range(95; CHECK-SAME: i32 range(i32 0, 2) [[A:%.*]]) {96; CHECK-NEXT: [[UCMP:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 [[A]], i32 0)97; CHECK-NEXT: ret i32 [[UCMP]]98;99 %ucmp = call i32 @llvm.ucmp(i32 %a, i32 0)100 ret i32 %ucmp101}102 103define i32 @scmp_to_sub_large_range(i32 range(i32 -1, 3) %a) {104; CHECK-LABEL: define i32 @scmp_to_sub_large_range(105; CHECK-SAME: i32 range(i32 -1, 3) [[A:%.*]]) {106; CHECK-NEXT: [[SCMP:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[A]], i32 0)107; CHECK-NEXT: ret i32 [[SCMP]]108;109 %scmp = call i32 @llvm.scmp(i32 %a, i32 0)110 ret i32 %scmp111}112 113define i32 @ucmp_to_sub_large_range(i32 range(i32 -1, 3) %a) {114; CHECK-LABEL: define i32 @ucmp_to_sub_large_range(115; CHECK-SAME: i32 range(i32 -1, 3) [[A:%.*]]) {116; CHECK-NEXT: [[SCMP:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 [[A]], i32 0)117; CHECK-NEXT: ret i32 [[SCMP]]118;119 %ucmp = call i32 @llvm.ucmp(i32 %a, i32 0)120 ret i32 %ucmp121}122 123define i32 @scmp_to_sub_wrap(i8 range(i8 127, -126) %a) {124; CHECK-LABEL: define i32 @scmp_to_sub_wrap(125; CHECK-SAME: i8 range(i8 127, -126) [[A:%.*]]) {126; CHECK-NEXT: [[SCMP:%.*]] = call i32 @llvm.scmp.i32.i8(i8 [[A]], i8 -128)127; CHECK-NEXT: ret i32 [[SCMP]]128;129 %scmp = call i32 @llvm.scmp(i8 %a, i8 -128)130 ret i32 %scmp131}132 133define i32 @ucmp_to_sub_wrap(i8 range(i8 -1, 2) %a) {134; CHECK-LABEL: define i32 @ucmp_to_sub_wrap(135; CHECK-SAME: i8 range(i8 -1, 2) [[A:%.*]]) {136; CHECK-NEXT: [[UCMP:%.*]] = call i32 @llvm.ucmp.i32.i8(i8 [[A]], i8 0)137; CHECK-NEXT: ret i32 [[UCMP]]138;139 %ucmp = call i32 @llvm.ucmp(i8 %a, i8 0)140 ret i32 %ucmp141}142 143; It is incorrect to convert a ucmp into sub when the input type is i1.144define i32 @ucmp_to_sub_i1_rhs_const(i1 %a) {145; CHECK-LABEL: define i32 @ucmp_to_sub_i1_rhs_const(146; CHECK-SAME: i1 [[A:%.*]]) {147; CHECK-NEXT: [[SCMP:%.*]] = call i32 @llvm.ucmp.i32.i1(i1 [[A]], i1 false)148; CHECK-NEXT: ret i32 [[SCMP]]149;150 %ucmp = call i32 @llvm.ucmp(i1 %a, i1 false)151 ret i32 %ucmp152}153 154; It is incorrect to convert a ucmp into sub when the input type is i1.155define i32 @ucmp_to_sub_i1_lhs_const(i1 %a) {156; CHECK-LABEL: define i32 @ucmp_to_sub_i1_lhs_const(157; CHECK-SAME: i1 [[A:%.*]]) {158; CHECK-NEXT: [[SCMP:%.*]] = call i32 @llvm.ucmp.i32.i1(i1 false, i1 [[A]])159; CHECK-NEXT: ret i32 [[SCMP]]160;161 %ucmp = call i32 @llvm.ucmp(i1 false, i1 %a)162 ret i32 %ucmp163}164 165; It is incorrect to convert a ucmp into sub when the input type is i1.166define i32 @ucmp_to_sub_i1(i1 %a, i1 %b) {167; CHECK-LABEL: define i32 @ucmp_to_sub_i1(168; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) {169; CHECK-NEXT: [[SCMP:%.*]] = call i32 @llvm.ucmp.i32.i1(i1 [[A]], i1 [[B]])170; CHECK-NEXT: ret i32 [[SCMP]]171;172 %ucmp = call i32 @llvm.ucmp(i1 %a, i1 %b)173 ret i32 %ucmp174}175 176; It is incorrect to convert a scmp into sub when the input type is i1.177define i32 @scmp_to_sub_i1_rhs_const(i1 %a) {178; CHECK-LABEL: define i32 @scmp_to_sub_i1_rhs_const(179; CHECK-SAME: i1 [[A:%.*]]) {180; CHECK-NEXT: [[SCMP:%.*]] = call i32 @llvm.scmp.i32.i1(i1 [[A]], i1 false)181; CHECK-NEXT: ret i32 [[SCMP]]182;183 %scmp = call i32 @llvm.scmp(i1 %a, i1 false)184 ret i32 %scmp185}186