813 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @f(i1 %cond, i32 %x, i32 %x2) {5; CHECK-LABEL: @f(6; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], [[X2:%.*]]7; CHECK-NEXT: ret i1 [[C]]8;9 %y = select i1 %cond, i32 poison, i32 %x10 %c = icmp eq i32 %y, %x211 ret i1 %c12}13 14define i1 @icmp_ne_common_op00(i1 %c, i6 %x, i6 %y, i6 %z) {15; CHECK-LABEL: @icmp_ne_common_op00(16; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]17; CHECK-NEXT: [[R:%.*]] = icmp ne i6 [[X:%.*]], [[R_V]]18; CHECK-NEXT: ret i1 [[R]]19;20 %cmp1 = icmp ne i6 %x, %y21 %cmp2 = icmp ne i6 %x, %z22 %r = select i1 %c, i1 %cmp1, i1 %cmp223 ret i1 %r24}25 26define i1 @icmp_ne_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {27; CHECK-LABEL: @icmp_ne_samesign_common(28; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]29; CHECK-NEXT: [[R:%.*]] = icmp ne i6 [[X:%.*]], [[R_V]]30; CHECK-NEXT: ret i1 [[R]]31;32 %cmp1 = icmp samesign ne i6 %x, %y33 %cmp2 = icmp ne i6 %x, %z34 %r = select i1 %c, i1 %cmp1, i1 %cmp235 ret i1 %r36}37 38define i1 @icmp_ne_common_op01(i1 %c, i3 %x, i3 %y, i3 %z) {39; CHECK-LABEL: @icmp_ne_common_op01(40; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i3 [[Y:%.*]], i3 [[Z:%.*]]41; CHECK-NEXT: [[R:%.*]] = icmp ne i3 [[X:%.*]], [[R_V]]42; CHECK-NEXT: ret i1 [[R]]43;44 %cmp1 = icmp ne i3 %x, %y45 %cmp2 = icmp ne i3 %z, %x46 %r = select i1 %c, i1 %cmp1, i1 %cmp247 ret i1 %r48}49 50define i1 @icmp_ne_common_op10(i1 %c, i4 %x, i4 %y, i4 %z) {51; CHECK-LABEL: @icmp_ne_common_op10(52; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]]53; CHECK-NEXT: [[R:%.*]] = icmp ne i4 [[X:%.*]], [[R_V]]54; CHECK-NEXT: ret i1 [[R]]55;56 %cmp1 = icmp ne i4 %y, %x57 %cmp2 = icmp ne i4 %x, %z58 %r = select i1 %c, i1 %cmp1, i1 %cmp259 ret i1 %r60}61 62define <3 x i1> @icmp_ne_common_op11(<3 x i1> %c, <3 x i17> %x, <3 x i17> %y, <3 x i17> %z) {63; CHECK-LABEL: @icmp_ne_common_op11(64; CHECK-NEXT: [[R_V:%.*]] = select <3 x i1> [[C:%.*]], <3 x i17> [[Y:%.*]], <3 x i17> [[Z:%.*]]65; CHECK-NEXT: [[R:%.*]] = icmp ne <3 x i17> [[X:%.*]], [[R_V]]66; CHECK-NEXT: ret <3 x i1> [[R]]67;68 %cmp1 = icmp ne <3 x i17> %y, %x69 %cmp2 = icmp ne <3 x i17> %z, %x70 %r = select <3 x i1> %c, <3 x i1> %cmp1, <3 x i1> %cmp271 ret <3 x i1> %r72}73 74define i1 @icmp_eq_common_op00(i1 %c, i5 %x, i5 %y, i5 %z) {75; CHECK-LABEL: @icmp_eq_common_op00(76; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i5 [[Y:%.*]], i5 [[Z:%.*]]77; CHECK-NEXT: [[R:%.*]] = icmp eq i5 [[X:%.*]], [[R_V]]78; CHECK-NEXT: ret i1 [[R]]79;80 %cmp1 = icmp eq i5 %x, %y81 %cmp2 = icmp eq i5 %x, %z82 %r = select i1 %c, i1 %cmp1, i1 %cmp283 ret i1 %r84}85 86define i1 @icmp_eq_samesign_common(i1 %c, i5 %x, i5 %y, i5 %z) {87; CHECK-LABEL: @icmp_eq_samesign_common(88; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i5 [[Y:%.*]], i5 [[Z:%.*]]89; CHECK-NEXT: [[R:%.*]] = icmp eq i5 [[X:%.*]], [[R_V]]90; CHECK-NEXT: ret i1 [[R]]91;92 %cmp1 = icmp eq i5 %x, %y93 %cmp2 = icmp samesign eq i5 %x, %z94 %r = select i1 %c, i1 %cmp1, i1 %cmp295 ret i1 %r96}97 98define <5 x i1> @icmp_eq_common_op01(<5 x i1> %c, <5 x i7> %x, <5 x i7> %y, <5 x i7> %z) {99; CHECK-LABEL: @icmp_eq_common_op01(100; CHECK-NEXT: [[R_V:%.*]] = select <5 x i1> [[C:%.*]], <5 x i7> [[Y:%.*]], <5 x i7> [[Z:%.*]]101; CHECK-NEXT: [[R:%.*]] = icmp eq <5 x i7> [[X:%.*]], [[R_V]]102; CHECK-NEXT: ret <5 x i1> [[R]]103;104 %cmp1 = icmp eq <5 x i7> %x, %y105 %cmp2 = icmp eq <5 x i7> %z, %x106 %r = select <5 x i1> %c, <5 x i1> %cmp1, <5 x i1> %cmp2107 ret <5 x i1> %r108}109 110define i1 @icmp_eq_common_op10(i1 %c, i32 %x, i32 %y, i32 %z) {111; CHECK-LABEL: @icmp_eq_common_op10(112; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]113; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[X:%.*]], [[R_V]]114; CHECK-NEXT: ret i1 [[R]]115;116 %cmp1 = icmp eq i32 %y, %x117 %cmp2 = icmp eq i32 %x, %z118 %r = select i1 %c, i1 %cmp1, i1 %cmp2119 ret i1 %r120}121 122define i1 @icmp_eq_common_op11(i1 %c, i64 %x, i64 %y, i64 %z) {123; CHECK-LABEL: @icmp_eq_common_op11(124; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]125; CHECK-NEXT: [[R:%.*]] = icmp eq i64 [[X:%.*]], [[R_V]]126; CHECK-NEXT: ret i1 [[R]]127;128 %cmp1 = icmp eq i64 %y, %x129 %cmp2 = icmp eq i64 %z, %x130 %r = select i1 %c, i1 %cmp1, i1 %cmp2131 ret i1 %r132}133 134define i1 @icmp_common_one_use_1(i1 %c, i8 %x, i8 %y, i8 %z) {135; CHECK-LABEL: @icmp_common_one_use_1(136; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]137; CHECK-NEXT: call void @use(i1 [[CMP1]])138; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i8 [[Y]], i8 [[Z:%.*]]139; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X]], [[R_V]]140; CHECK-NEXT: ret i1 [[R]]141;142 %cmp1 = icmp eq i8 %y, %x143 call void @use(i1 %cmp1)144 %cmp2 = icmp eq i8 %z, %x145 %r = select i1 %c, i1 %cmp1, i1 %cmp2146 ret i1 %r147}148 149define i1 @icmp_slt_common(i1 %c, i6 %x, i6 %y, i6 %z) {150; CHECK-LABEL: @icmp_slt_common(151; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]152; CHECK-NEXT: [[R:%.*]] = icmp slt i6 [[X:%.*]], [[R_V]]153; CHECK-NEXT: ret i1 [[R]]154;155 %cmp1 = icmp slt i6 %x, %y156 %cmp2 = icmp slt i6 %x, %z157 %r = select i1 %c, i1 %cmp1, i1 %cmp2158 ret i1 %r159}160 161define i1 @icmp_slt_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {162; CHECK-LABEL: @icmp_slt_samesign_common(163; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]164; CHECK-NEXT: [[R:%.*]] = icmp slt i6 [[X:%.*]], [[R_V]]165; CHECK-NEXT: ret i1 [[R]]166;167 %cmp1 = icmp samesign ult i6 %x, %y168 %cmp2 = icmp slt i6 %x, %z169 %r = select i1 %c, i1 %cmp1, i1 %cmp2170 ret i1 %r171}172 173define i1 @icmp_sgt_common(i1 %c, i6 %x, i6 %y, i6 %z) {174; CHECK-LABEL: @icmp_sgt_common(175; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]176; CHECK-NEXT: [[R:%.*]] = icmp sgt i6 [[X:%.*]], [[R_V]]177; CHECK-NEXT: ret i1 [[R]]178;179 %cmp1 = icmp sgt i6 %x, %y180 %cmp2 = icmp sgt i6 %x, %z181 %r = select i1 %c, i1 %cmp1, i1 %cmp2182 ret i1 %r183}184 185define i1 @icmp_sgt_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {186; CHECK-LABEL: @icmp_sgt_samesign_common(187; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]188; CHECK-NEXT: [[R:%.*]] = icmp sgt i6 [[X:%.*]], [[R_V]]189; CHECK-NEXT: ret i1 [[R]]190;191 %cmp1 = icmp samesign ugt i6 %x, %y192 %cmp2 = icmp sgt i6 %x, %z193 %r = select i1 %c, i1 %cmp1, i1 %cmp2194 ret i1 %r195}196 197define i1 @icmp_sle_common(i1 %c, i6 %x, i6 %y, i6 %z) {198; CHECK-LABEL: @icmp_sle_common(199; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]200; CHECK-NEXT: [[R:%.*]] = icmp sge i6 [[X:%.*]], [[R_V]]201; CHECK-NEXT: ret i1 [[R]]202;203 %cmp1 = icmp sle i6 %y, %x204 %cmp2 = icmp sle i6 %z, %x205 %r = select i1 %c, i1 %cmp1, i1 %cmp2206 ret i1 %r207}208 209define i1 @icmp_sle_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {210; CHECK-LABEL: @icmp_sle_samesign_common(211; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]212; CHECK-NEXT: [[R:%.*]] = icmp sge i6 [[X:%.*]], [[R_V]]213; CHECK-NEXT: ret i1 [[R]]214;215 %cmp1 = icmp sle i6 %y, %x216 %cmp2 = icmp samesign ule i6 %z, %x217 %r = select i1 %c, i1 %cmp1, i1 %cmp2218 ret i1 %r219}220 221define i1 @icmp_sge_common(i1 %c, i6 %x, i6 %y, i6 %z) {222; CHECK-LABEL: @icmp_sge_common(223; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]224; CHECK-NEXT: [[R:%.*]] = icmp sle i6 [[X:%.*]], [[R_V]]225; CHECK-NEXT: ret i1 [[R]]226;227 %cmp1 = icmp sge i6 %y, %x228 %cmp2 = icmp sge i6 %z, %x229 %r = select i1 %c, i1 %cmp1, i1 %cmp2230 ret i1 %r231}232 233define i1 @icmp_sge_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {234; CHECK-LABEL: @icmp_sge_samesign_common(235; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]236; CHECK-NEXT: [[R:%.*]] = icmp sle i6 [[X:%.*]], [[R_V]]237; CHECK-NEXT: ret i1 [[R]]238;239 %cmp1 = icmp sge i6 %y, %x240 %cmp2 = icmp samesign uge i6 %z, %x241 %r = select i1 %c, i1 %cmp1, i1 %cmp2242 ret i1 %r243}244 245define i1 @icmp_slt_sgt_common(i1 %c, i6 %x, i6 %y, i6 %z) {246; CHECK-LABEL: @icmp_slt_sgt_common(247; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]248; CHECK-NEXT: [[R:%.*]] = icmp slt i6 [[X:%.*]], [[R_V]]249; CHECK-NEXT: ret i1 [[R]]250;251 %cmp1 = icmp slt i6 %x, %y252 %cmp2 = icmp sgt i6 %z, %x253 %r = select i1 %c, i1 %cmp1, i1 %cmp2254 ret i1 %r255}256 257define i1 @icmp_slt_sgt_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {258; CHECK-LABEL: @icmp_slt_sgt_samesign_common(259; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]260; CHECK-NEXT: [[R:%.*]] = icmp slt i6 [[X:%.*]], [[R_V]]261; CHECK-NEXT: ret i1 [[R]]262;263 %cmp1 = icmp samesign ult i6 %x, %y264 %cmp2 = icmp sgt i6 %z, %x265 %r = select i1 %c, i1 %cmp1, i1 %cmp2266 ret i1 %r267}268 269define i1 @icmp_sle_sge_common(i1 %c, i6 %x, i6 %y, i6 %z) {270; CHECK-LABEL: @icmp_sle_sge_common(271; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]272; CHECK-NEXT: [[R:%.*]] = icmp sge i6 [[X:%.*]], [[R_V]]273; CHECK-NEXT: ret i1 [[R]]274;275 %cmp1 = icmp sle i6 %y, %x276 %cmp2 = icmp sge i6 %x, %z277 %r = select i1 %c, i1 %cmp1, i1 %cmp2278 ret i1 %r279}280 281define i1 @icmp_sle_sge_samesign_common(i1 %c, i6 %x, i6 %y, i6 %z) {282; CHECK-LABEL: @icmp_sle_sge_samesign_common(283; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]284; CHECK-NEXT: [[R:%.*]] = icmp sge i6 [[X:%.*]], [[R_V]]285; CHECK-NEXT: ret i1 [[R]]286;287 %cmp1 = icmp sle i6 %y, %x288 %cmp2 = icmp samesign uge i6 %x, %z289 %r = select i1 %c, i1 %cmp1, i1 %cmp2290 ret i1 %r291}292 293define i1 @icmp_ult_common(i1 %c, i6 %x, i6 %y, i6 %z) {294; CHECK-LABEL: @icmp_ult_common(295; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]296; CHECK-NEXT: [[R:%.*]] = icmp ult i6 [[X:%.*]], [[R_V]]297; CHECK-NEXT: ret i1 [[R]]298;299 %cmp1 = icmp ult i6 %x, %y300 %cmp2 = icmp ult i6 %x, %z301 %r = select i1 %c, i1 %cmp1, i1 %cmp2302 ret i1 %r303}304 305define i1 @icmp_ule_common(i1 %c, i6 %x, i6 %y, i6 %z) {306; CHECK-LABEL: @icmp_ule_common(307; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]308; CHECK-NEXT: [[R:%.*]] = icmp uge i6 [[X:%.*]], [[R_V]]309; CHECK-NEXT: ret i1 [[R]]310;311 %cmp1 = icmp ule i6 %y, %x312 %cmp2 = icmp ule i6 %z, %x313 %r = select i1 %c, i1 %cmp1, i1 %cmp2314 ret i1 %r315}316 317define i1 @icmp_ugt_common(i1 %c, i8 %x, i8 %y, i8 %z) {318; CHECK-LABEL: @icmp_ugt_common(319; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]320; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[X:%.*]], [[R_V]]321; CHECK-NEXT: ret i1 [[R]]322;323 %cmp1 = icmp ugt i8 %y, %x324 %cmp2 = icmp ugt i8 %z, %x325 %r = select i1 %c, i1 %cmp1, i1 %cmp2326 ret i1 %r327}328 329define i1 @icmp_uge_common(i1 %c, i6 %x, i6 %y, i6 %z) {330; CHECK-LABEL: @icmp_uge_common(331; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]332; CHECK-NEXT: [[R:%.*]] = icmp ule i6 [[X:%.*]], [[R_V]]333; CHECK-NEXT: ret i1 [[R]]334;335 %cmp1 = icmp uge i6 %y, %x336 %cmp2 = icmp uge i6 %z, %x337 %r = select i1 %c, i1 %cmp1, i1 %cmp2338 ret i1 %r339}340 341define i1 @icmp_ult_ugt_common(i1 %c, i6 %x, i6 %y, i6 %z) {342; CHECK-LABEL: @icmp_ult_ugt_common(343; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]344; CHECK-NEXT: [[R:%.*]] = icmp ult i6 [[X:%.*]], [[R_V]]345; CHECK-NEXT: ret i1 [[R]]346;347 %cmp1 = icmp ult i6 %x, %y348 %cmp2 = icmp ugt i6 %z, %x349 %r = select i1 %c, i1 %cmp1, i1 %cmp2350 ret i1 %r351}352 353define i1 @icmp_ule_uge_common(i1 %c, i6 %x, i6 %y, i6 %z) {354; CHECK-LABEL: @icmp_ule_uge_common(355; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]356; CHECK-NEXT: [[R:%.*]] = icmp uge i6 [[X:%.*]], [[R_V]]357; CHECK-NEXT: ret i1 [[R]]358;359 %cmp1 = icmp ule i6 %y, %x360 %cmp2 = icmp uge i6 %x, %z361 %r = select i1 %c, i1 %cmp1, i1 %cmp2362 ret i1 %r363}364 365; negative test: pred is not the same366 367define i1 @icmp_common_pred_different(i1 %c, i8 %x, i8 %y, i8 %z) {368; CHECK-LABEL: @icmp_common_pred_different(369; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]370; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Z:%.*]], [[X]]371; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]372; CHECK-NEXT: ret i1 [[R]]373;374 %cmp1 = icmp eq i8 %y, %x375 %cmp2 = icmp ne i8 %z, %x376 %r = select i1 %c, i1 %cmp1, i1 %cmp2377 ret i1 %r378}379 380; negative test for non-equality: two pred is not swap381 382define i1 @icmp_common_pred_not_swap(i1 %c, i8 %x, i8 %y, i8 %z) {383; CHECK-LABEL: @icmp_common_pred_not_swap(384; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]385; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 [[Z:%.*]], [[X]]386; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]387; CHECK-NEXT: ret i1 [[R]]388;389 %cmp1 = icmp slt i8 %y, %x390 %cmp2 = icmp sle i8 %z, %x391 %r = select i1 %c, i1 %cmp1, i1 %cmp2392 ret i1 %r393}394 395; negative test for non-equality: not commute pred396 397define i1 @icmp_common_pred_not_commute_pred(i1 %c, i8 %x, i8 %y, i8 %z) {398; CHECK-LABEL: @icmp_common_pred_not_commute_pred(399; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]400; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[Z:%.*]], [[X]]401; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]402; CHECK-NEXT: ret i1 [[R]]403;404 %cmp1 = icmp slt i8 %y, %x405 %cmp2 = icmp sgt i8 %z, %x406 %r = select i1 %c, i1 %cmp1, i1 %cmp2407 ret i1 %r408}409 410; negative test: both icmp is not one-use411 412define i1 @icmp_common_one_use_0(i1 %c, i8 %x, i8 %y, i8 %z) {413; CHECK-LABEL: @icmp_common_one_use_0(414; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]415; CHECK-NEXT: call void @use(i1 [[CMP1]])416; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[Z:%.*]], [[X]]417; CHECK-NEXT: call void @use(i1 [[CMP2]])418; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]419; CHECK-NEXT: ret i1 [[R]]420;421 %cmp1 = icmp eq i8 %y, %x422 call void @use(i1 %cmp1)423 %cmp2 = icmp eq i8 %z, %x424 call void @use(i1 %cmp2)425 %r = select i1 %c, i1 %cmp1, i1 %cmp2426 ret i1 %r427}428 429; negative test: no common op430 431define i1 @icmp_no_common(i1 %c, i8 %x, i8 %y, i8 %z) {432; CHECK-LABEL: @icmp_no_common(433; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[Y:%.*]], 0434; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[Z:%.*]], [[X:%.*]]435; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]436; CHECK-NEXT: ret i1 [[R]]437;438 %cmp1 = icmp eq i8 %y, 0439 %cmp2 = icmp eq i8 %z, %x440 %r = select i1 %c, i1 %cmp1, i1 %cmp2441 ret i1 %r442}443 444define i1 @test_select_inverse_eq(i64 %x, i1 %y) {445; CHECK-LABEL: @test_select_inverse_eq(446; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[X:%.*]], 0447; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[Y:%.*]], [[CMP2]]448; CHECK-NEXT: ret i1 [[SEL]]449;450 %cmp1 = icmp ne i64 %x, 0451 %cmp2 = icmp eq i64 %x, 0452 %sel = select i1 %y, i1 %cmp1, i1 %cmp2453 ret i1 %sel454}455 456define i1 @test_select_inverse_signed(i64 %x, i1 %y) {457; CHECK-LABEL: @test_select_inverse_signed(458; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i64 [[X:%.*]], 0459; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[Y:%.*]], [[CMP2]]460; CHECK-NEXT: ret i1 [[SEL]]461;462 %cmp1 = icmp sgt i64 %x, -1463 %cmp2 = icmp slt i64 %x, 0464 %sel = select i1 %y, i1 %cmp1, i1 %cmp2465 ret i1 %sel466}467 468define i1 @test_select_inverse_unsigned(i64 %x, i1 %y) {469; CHECK-LABEL: @test_select_inverse_unsigned(470; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i64 [[X:%.*]], 10471; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[Y:%.*]], [[CMP2]]472; CHECK-NEXT: ret i1 [[SEL]]473;474 %cmp1 = icmp ult i64 %x, 11475 %cmp2 = icmp ugt i64 %x, 10476 %sel = select i1 %y, i1 %cmp1, i1 %cmp2477 ret i1 %sel478}479 480define i1 @test_select_inverse_eq_ptr(ptr %x, i1 %y) {481; CHECK-LABEL: @test_select_inverse_eq_ptr(482; CHECK-NEXT: [[CMP2:%.*]] = icmp ne ptr [[X:%.*]], null483; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[Y:%.*]], [[CMP2]]484; CHECK-NEXT: ret i1 [[SEL]]485;486 %cmp1 = icmp eq ptr %x, null487 %cmp2 = icmp ne ptr %x, null488 %sel = select i1 %y, i1 %cmp1, i1 %cmp2489 ret i1 %sel490}491 492define i1 @test_select_inverse_fail(i64 %x, i1 %y) {493; CHECK-LABEL: @test_select_inverse_fail(494; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[X:%.*]], 0495; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i64 [[X]], 0496; CHECK-NEXT: [[SEL:%.*]] = select i1 [[Y:%.*]], i1 [[CMP1]], i1 [[CMP2]]497; CHECK-NEXT: ret i1 [[SEL]]498;499 %cmp1 = icmp sgt i64 %x, 0500 %cmp2 = icmp slt i64 %x, 0501 %sel = select i1 %y, i1 %cmp1, i1 %cmp2502 ret i1 %sel503}504 505define <2 x i1> @test_select_inverse_vec(<2 x i64> %x, <2 x i1> %y) {506; CHECK-LABEL: @test_select_inverse_vec(507; CHECK-NEXT: [[CMP2:%.*]] = icmp eq <2 x i64> [[X:%.*]], zeroinitializer508; CHECK-NEXT: [[SEL:%.*]] = xor <2 x i1> [[Y:%.*]], [[CMP2]]509; CHECK-NEXT: ret <2 x i1> [[SEL]]510;511 %cmp1 = icmp ne <2 x i64> %x, zeroinitializer512 %cmp2 = icmp eq <2 x i64> %x, zeroinitializer513 %sel = select <2 x i1> %y, <2 x i1> %cmp1, <2 x i1> %cmp2514 ret <2 x i1> %sel515}516 517define <2 x i1> @test_select_inverse_vec_fail(<2 x i64> %x, i1 %y) {518; CHECK-LABEL: @test_select_inverse_vec_fail(519; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i64> [[X:%.*]], zeroinitializer520; CHECK-NEXT: [[CMP2:%.*]] = icmp eq <2 x i64> [[X]], zeroinitializer521; CHECK-NEXT: [[SEL:%.*]] = select i1 [[Y:%.*]], <2 x i1> [[CMP1]], <2 x i1> [[CMP2]]522; CHECK-NEXT: ret <2 x i1> [[SEL]]523;524 %cmp1 = icmp ne <2 x i64> %x, zeroinitializer525 %cmp2 = icmp eq <2 x i64> %x, zeroinitializer526 %sel = select i1 %y, <2 x i1> %cmp1, <2 x i1> %cmp2527 ret <2 x i1> %sel528}529 530define i1 @test_select_inverse_nonconst1(i64 %x, i64 %y, i1 %cond) {531; CHECK-LABEL: @test_select_inverse_nonconst1(532; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]533; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[COND:%.*]], [[CMP2]]534; CHECK-NEXT: ret i1 [[SEL]]535;536 %cmp1 = icmp ne i64 %x, %y537 %cmp2 = icmp eq i64 %x, %y538 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2539 ret i1 %sel540}541 542define i1 @test_select_inverse_nonconst2(i64 %x, i64 %y, i1 %cond) {543; CHECK-LABEL: @test_select_inverse_nonconst2(544; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]]545; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[COND:%.*]], [[CMP2]]546; CHECK-NEXT: ret i1 [[SEL]]547;548 %cmp1 = icmp ne i64 %x, %y549 %cmp2 = icmp eq i64 %y, %x550 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2551 ret i1 %sel552}553 554define i1 @test_select_inverse_nonconst3(i64 %x, i64 %y, i1 %cond) {555; CHECK-LABEL: @test_select_inverse_nonconst3(556; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]557; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[COND:%.*]], [[CMP2]]558; CHECK-NEXT: ret i1 [[SEL]]559;560 %cmp1 = icmp ult i64 %x, %y561 %cmp2 = icmp uge i64 %x, %y562 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2563 ret i1 %sel564}565 566define i1 @test_select_inverse_nonconst4(i64 %x, i64 %y, i64 %z, i1 %cond) {567; CHECK-LABEL: @test_select_inverse_nonconst4(568; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[X:%.*]], [[Y:%.*]]569; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[Z:%.*]], [[Y]]570; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i1 [[CMP1]], i1 [[CMP2]]571; CHECK-NEXT: ret i1 [[SEL]]572;573 %cmp1 = icmp ult i64 %x, %y574 %cmp2 = icmp uge i64 %z, %y575 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2576 ret i1 %sel577}578 579define i1 @test_select_inverse_samesign_true_arm(i64 %x, i64 %y, i1 %cond) {580; CHECK-LABEL: @test_select_inverse_samesign_true_arm(581; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ult i64 [[X:%.*]], [[Y:%.*]]582; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[X]], [[Y]]583; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i1 [[CMP1]], i1 [[CMP2]]584; CHECK-NEXT: ret i1 [[SEL]]585;586 %cmp1 = icmp samesign ult i64 %x, %y587 %cmp2 = icmp uge i64 %x, %y588 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2589 ret i1 %sel590}591 592define i1 @test_select_inverse_samesign_false_arm(i64 %x, i64 %y, i1 %cond) {593; CHECK-LABEL: @test_select_inverse_samesign_false_arm(594; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[X:%.*]], [[Y:%.*]]595; CHECK-NEXT: [[CMP2:%.*]] = icmp samesign uge i64 [[X]], [[Y]]596; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i1 [[CMP1]], i1 [[CMP2]]597; CHECK-NEXT: ret i1 [[SEL]]598;599 %cmp1 = icmp ult i64 %x, %y600 %cmp2 = icmp samesign uge i64 %x, %y601 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2602 ret i1 %sel603}604 605define i1 @test_select_inverse_samesign_both(i64 %x, i64 %y, i1 %cond) {606; CHECK-LABEL: @test_select_inverse_samesign_both(607; CHECK-NEXT: [[CMP2:%.*]] = icmp samesign uge i64 [[X:%.*]], [[Y:%.*]]608; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[COND:%.*]], [[CMP2]]609; CHECK-NEXT: ret i1 [[SEL]]610;611 %cmp1 = icmp samesign ult i64 %x, %y612 %cmp2 = icmp samesign uge i64 %x, %y613 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2614 ret i1 %sel615}616 617define i1 @test_select_inverse_samesign_false_arm_rhsc_same_sign(i64 %x, i64 %y, i1 %cond) {618; CHECK-LABEL: @test_select_inverse_samesign_false_arm_rhsc_same_sign(619; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[X:%.*]], 11620; CHECK-NEXT: [[CMP2:%.*]] = icmp samesign ugt i64 [[X]], 10621; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i1 [[CMP1]], i1 [[CMP2]]622; CHECK-NEXT: ret i1 [[SEL]]623;624 %cmp1 = icmp ult i64 %x, 11625 %cmp2 = icmp samesign ugt i64 %x, 10626 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2627 ret i1 %sel628}629 630define i1 @test_select_inverse_samesign_true_arm_rhsc_same_sign(i64 %x, i64 %y, i1 %cond) {631; CHECK-LABEL: @test_select_inverse_samesign_true_arm_rhsc_same_sign(632; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ult i64 [[X:%.*]], 11633; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i64 [[X]], 10634; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i1 [[CMP1]], i1 [[CMP2]]635; CHECK-NEXT: ret i1 [[SEL]]636;637 %cmp1 = icmp samesign ult i64 %x, 11638 %cmp2 = icmp ugt i64 %x, 10639 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2640 ret i1 %sel641}642 643define i1 @test_select_inverse_samesign_both_rhsc_same_sign(i64 %x, i64 %y, i1 %cond) {644; CHECK-LABEL: @test_select_inverse_samesign_both_rhsc_same_sign(645; CHECK-NEXT: [[CMP2:%.*]] = icmp samesign ugt i64 [[X:%.*]], 10646; CHECK-NEXT: [[SEL:%.*]] = xor i1 [[COND:%.*]], [[CMP2]]647; CHECK-NEXT: ret i1 [[SEL]]648;649 %cmp1 = icmp samesign ult i64 %x, 11650 %cmp2 = icmp samesign ugt i64 %x, 10651 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2652 ret i1 %sel653}654 655define i1 @test_select_inverse_samesign_both_rhsc_diff_sign(i64 %x, i64 %y, i1 %cond) {656; CHECK-LABEL: @test_select_inverse_samesign_both_rhsc_diff_sign(657; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign slt i64 [[X:%.*]], 0658; CHECK-NEXT: [[CMP2:%.*]] = icmp samesign sgt i64 [[X]], -1659; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i1 [[CMP1]], i1 [[CMP2]]660; CHECK-NEXT: ret i1 [[SEL]]661;662 %cmp1 = icmp samesign slt i64 %x, 0663 %cmp2 = icmp samesign sgt i64 %x, -1664 %sel = select i1 %cond, i1 %cmp1, i1 %cmp2665 ret i1 %sel666}667 668define i1 @sel_icmp_two_cmp(i1 %c, i32 %a1, i32 %a2, i32 %a3, i32 %a4) {669; CHECK-LABEL: @sel_icmp_two_cmp(670; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]671; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[A3:%.*]], [[A4:%.*]]672; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]673; CHECK-NEXT: ret i1 [[CMP]]674;675 %v1 = call i8 @llvm.ucmp(i32 %a1, i32 %a2)676 %v2 = call i8 @llvm.scmp(i32 %a3, i32 %a4)677 %sel = select i1 %c, i8 %v1, i8 %v2678 %cmp = icmp sle i8 %sel, 0679 ret i1 %cmp680}681 682define i1 @sel_icmp_two_cmp_extra_use1(i1 %c, i32 %a1, i32 %a2, i32 %a3, i32 %a4) {683; CHECK-LABEL: @sel_icmp_two_cmp_extra_use1(684; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])685; CHECK-NEXT: call void @use.i8(i8 [[V1]])686; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1]], [[A2]]687; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[A3:%.*]], [[A4:%.*]]688; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]689; CHECK-NEXT: ret i1 [[CMP]]690;691 %v1 = call i8 @llvm.ucmp(i32 %a1, i32 %a2)692 %v2 = call i8 @llvm.scmp(i32 %a3, i32 %a4)693 call void @use.i8(i8 %v1)694 %sel = select i1 %c, i8 %v1, i8 %v2695 %cmp = icmp sle i8 %sel, 0696 ret i1 %cmp697}698 699define i1 @sel_icmp_two_cmp_extra_use2(i1 %c, i32 %a1, i32 %a2, i32 %a3, i32 %a4) {700; CHECK-LABEL: @sel_icmp_two_cmp_extra_use2(701; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])702; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])703; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]704; CHECK-NEXT: call void @use.i8(i8 [[SEL]])705; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1706; CHECK-NEXT: ret i1 [[CMP]]707;708 %v1 = call i8 @llvm.ucmp(i32 %a1, i32 %a2)709 %v2 = call i8 @llvm.scmp(i32 %a3, i32 %a4)710 %sel = select i1 %c, i8 %v1, i8 %v2711 call void @use.i8(i8 %sel)712 %cmp = icmp sle i8 %sel, 0713 ret i1 %cmp714}715 716define i1 @sel_icmp_two_cmp_not_const(i1 %c, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i8 %b) {717; CHECK-LABEL: @sel_icmp_two_cmp_not_const(718; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])719; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])720; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]721; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[SEL]], [[B:%.*]]722; CHECK-NEXT: ret i1 [[CMP]]723;724 %v1 = call i8 @llvm.ucmp(i32 %a1, i32 %a2)725 %v2 = call i8 @llvm.scmp(i32 %a3, i32 %a4)726 %sel = select i1 %c, i8 %v1, i8 %v2727 %cmp = icmp sle i8 %sel, %b728 ret i1 %cmp729}730 731define <2 x i1> @sel_icmp_two_cmp_vec(i1 %c, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3, <2 x i32> %a4) {732; CHECK-LABEL: @sel_icmp_two_cmp_vec(733; CHECK-NEXT: [[CMP1:%.*]] = icmp ule <2 x i32> [[A1:%.*]], [[A2:%.*]]734; CHECK-NEXT: [[CMP2:%.*]] = icmp sle <2 x i32> [[A3:%.*]], [[A4:%.*]]735; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], <2 x i1> [[CMP1]], <2 x i1> [[CMP2]]736; CHECK-NEXT: ret <2 x i1> [[CMP]]737;738 %v1 = call <2 x i8> @llvm.ucmp(<2 x i32> %a1, <2 x i32> %a2)739 %v2 = call <2 x i8> @llvm.scmp(<2 x i32> %a3, <2 x i32> %a4)740 %sel = select i1 %c, <2 x i8> %v1, <2 x i8> %v2741 %cmp = icmp sle <2 x i8> %sel, zeroinitializer742 ret <2 x i1> %cmp743}744 745define <2 x i1> @sel_icmp_two_cmp_vec_nonsplat(i1 %c, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3, <2 x i32> %a4) {746; CHECK-LABEL: @sel_icmp_two_cmp_vec_nonsplat(747; CHECK-NEXT: [[V1:%.*]] = call <2 x i8> @llvm.ucmp.v2i8.v2i32(<2 x i32> [[A1:%.*]], <2 x i32> [[A2:%.*]])748; CHECK-NEXT: [[V2:%.*]] = call <2 x i8> @llvm.scmp.v2i8.v2i32(<2 x i32> [[A3:%.*]], <2 x i32> [[A4:%.*]])749; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], <2 x i8> [[V1]], <2 x i8> [[V2]]750; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[SEL]], <i8 1, i8 2>751; CHECK-NEXT: ret <2 x i1> [[CMP]]752;753 %v1 = call <2 x i8> @llvm.ucmp(<2 x i32> %a1, <2 x i32> %a2)754 %v2 = call <2 x i8> @llvm.scmp(<2 x i32> %a3, <2 x i32> %a4)755 %sel = select i1 %c, <2 x i8> %v1, <2 x i8> %v2756 %cmp = icmp sle <2 x i8> %sel, <i8 0, i8 1>757 ret <2 x i1> %cmp758}759 760define i1 @sel_icmp_cmp_and_simplify(i1 %c, i32 %a1, i32 %a2) {761; CHECK-LABEL: @sel_icmp_cmp_and_simplify(762; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]763; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true764; CHECK-NEXT: [[CMP:%.*]] = select i1 [[NOT_C]], i1 true, i1 [[CMP1]]765; CHECK-NEXT: ret i1 [[CMP]]766;767 %v = call i8 @llvm.ucmp(i32 %a1, i32 %a2)768 %sel = select i1 %c, i8 %v, i8 0769 %cmp = icmp sle i8 %sel, 0770 ret i1 %cmp771}772 773define i1 @sel_icmp_cmp_and_no_simplify(i1 %c, i32 %a1, i32 %a2, i8 %b) {774; CHECK-LABEL: @sel_icmp_cmp_and_no_simplify(775; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]776; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 [[B:%.*]], 1777; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]778; CHECK-NEXT: ret i1 [[CMP]]779;780 %v = call i8 @llvm.ucmp(i32 %a1, i32 %a2)781 %sel = select i1 %c, i8 %v, i8 %b782 %cmp = icmp sle i8 %sel, 0783 ret i1 %cmp784}785 786define i1 @sel_icmp_cmp_and_no_simplify_comm(i1 %c, i32 %a1, i32 %a2, i8 %b) {787; CHECK-LABEL: @sel_icmp_cmp_and_no_simplify_comm(788; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[B:%.*]], 1789; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]790; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]791; CHECK-NEXT: ret i1 [[CMP]]792;793 %v = call i8 @llvm.ucmp(i32 %a1, i32 %a2)794 %sel = select i1 %c, i8 %b, i8 %v795 %cmp = icmp sle i8 %sel, 0796 ret i1 %cmp797}798 799define i1 @icmp_lt_slt(i1 %c, i32 %arg) {800; CHECK-LABEL: @icmp_lt_slt(801; CHECK-NEXT: [[SELECT_V:%.*]] = select i1 [[C:%.*]], i32 131072, i32 0802; CHECK-NEXT: [[SELECT:%.*]] = icmp slt i32 [[ARG:%.*]], [[SELECT_V]]803; CHECK-NEXT: ret i1 [[SELECT]]804;805 %cmp1 = icmp samesign ult i32 %arg, 131072806 %cmp2 = icmp slt i32 %arg, 0807 %select = select i1 %c, i1 %cmp1, i1 %cmp2808 ret i1 %select809}810 811declare void @use(i1)812declare void @use.i8(i8)813