brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.7 KiB · 58f171e Raw
400 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; Given a pattern like:5;   %old_cmp1 = icmp slt i32 %x, C26;   %old_replacement = select i1 %old_cmp1, i32 %target_low, i32 %target_high7;   %old_x_offseted = add i32 %x, C18;   %old_cmp0 = icmp ult i32 %old_x_offseted, C09;   %r = select i1 %old_cmp0, i32 %x, i32 %old_replacement10; it can be rewriten as more canonical pattern:11;   %new_cmp1 = icmp slt i32 %x, -C112;   %new_cmp2 = icmp sge i32 %x, C0-C113;   %new_clamped_low = select i1 %new_cmp1, i32 %target_low, i32 %x14;   %r = select i1 %new_cmp2, i32 %target_high, i32 %new_clamped_low15; Iff -C1 s<= C2 s<= C0-C116; Also, ULT predicate can also be UGE; or UGT iff C0 != -1 (+invert result)17; Also, SLT predicate can also be SGE; or SGT iff C2 != INT_MAX (+invert res.)18 19;-------------------------------------------------------------------------------20 21; Basic pattern. There is no 'and', so lower threshold is 0 (inclusive).22; The upper threshold is 65535 (inclusive).23; There are 2 icmp's so for scalars there are 4 possible combinations.24; The constant in %t0 has to be between the thresholds, i.e 65536 <= Ct0 <= 0.25 26define i32 @t0_ult_slt_65536(i32 %x, i32 %replacement_low, i32 %replacement_high) {27; CHECK-LABEL: @t0_ult_slt_65536(28; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 029; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 6553530; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]31; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]32; CHECK-NEXT:    ret i32 [[R]]33;34  %t0 = icmp slt i32 %x, 6553635  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high36  %t2 = icmp ult i32 %x, 6553637  %r = select i1 %t2, i32 %x, i32 %t138  ret i32 %r39}40define i32 @t1_ult_slt_0(i32 %x, i32 %replacement_low, i32 %replacement_high) {41; CHECK-LABEL: @t1_ult_slt_0(42; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 043; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 6553544; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]45; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]46; CHECK-NEXT:    ret i32 [[R]]47;48  %t0 = icmp slt i32 %x, 049  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high50  %t2 = icmp ult i32 %x, 6553651  %r = select i1 %t2, i32 %x, i32 %t152  ret i32 %r53}54 55define i32 @t2_ult_sgt_65536(i32 %x, i32 %replacement_low, i32 %replacement_high) {56; CHECK-LABEL: @t2_ult_sgt_65536(57; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 058; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 6553559; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]60; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]61; CHECK-NEXT:    ret i32 [[R]]62;63  %t0 = icmp sgt i32 %x, 6553564  %t1 = select i1 %t0, i32 %replacement_high, i32 %replacement_low65  %t2 = icmp ult i32 %x, 6553666  %r = select i1 %t2, i32 %x, i32 %t167  ret i32 %r68}69define i32 @t3_ult_sgt_neg1(i32 %x, i32 %replacement_low, i32 %replacement_high) {70; CHECK-LABEL: @t3_ult_sgt_neg1(71; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 072; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 6553573; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]74; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]75; CHECK-NEXT:    ret i32 [[R]]76;77  %t0 = icmp sgt i32 %x, -178  %t1 = select i1 %t0, i32 %replacement_high, i32 %replacement_low79  %t2 = icmp ult i32 %x, 6553680  %r = select i1 %t2, i32 %x, i32 %t181  ret i32 %r82}83 84define i32 @t4_ugt_slt_65536(i32 %x, i32 %replacement_low, i32 %replacement_high) {85; CHECK-LABEL: @t4_ugt_slt_65536(86; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 087; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 6553588; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]89; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]90; CHECK-NEXT:    ret i32 [[R]]91;92  %t0 = icmp slt i32 %x, 6553693  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high94  %t2 = icmp ugt i32 %x, 6553595  %r = select i1 %t2, i32 %t1, i32 %x96  ret i32 %r97}98define i32 @t5_ugt_slt_0(i32 %x, i32 %replacement_low, i32 %replacement_high) {99; CHECK-LABEL: @t5_ugt_slt_0(100; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 0101; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 65535102; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]103; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]104; CHECK-NEXT:    ret i32 [[R]]105;106  %t0 = icmp slt i32 %x, 0107  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high108  %t2 = icmp ugt i32 %x, 65535109  %r = select i1 %t2, i32 %t1, i32 %x110  ret i32 %r111}112 113define i32 @t6_ugt_sgt_65536(i32 %x, i32 %replacement_low, i32 %replacement_high) {114; CHECK-LABEL: @t6_ugt_sgt_65536(115; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 0116; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 65535117; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]118; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]119; CHECK-NEXT:    ret i32 [[R]]120;121  %t0 = icmp sgt i32 %x, 65535122  %t1 = select i1 %t0, i32 %replacement_high, i32 %replacement_low123  %t2 = icmp ugt i32 %x, 65535124  %r = select i1 %t2, i32 %t1, i32 %x125  ret i32 %r126}127define i32 @t7_ugt_sgt_neg1(i32 %x, i32 %replacement_low, i32 %replacement_high) {128; CHECK-LABEL: @t7_ugt_sgt_neg1(129; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 0130; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[X]], 65535131; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[X]]132; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i32 [[REPLACEMENT_HIGH:%.*]], i32 [[TMP3]]133; CHECK-NEXT:    ret i32 [[R]]134;135  %t0 = icmp sgt i32 %x, -1136  %t1 = select i1 %t0, i32 %replacement_high, i32 %replacement_low137  %t2 = icmp ugt i32 %x, 65535138  %r = select i1 %t2, i32 %t1, i32 %x139  ret i32 %r140}141 142;-------------------------------------------------------------------------------143 144; So Ct0 can not be s> 65536, or s< 0145 146define i32 @n8_ult_slt_65537(i32 %x, i32 %replacement_low, i32 %replacement_high) {147; CHECK-LABEL: @n8_ult_slt_65537(148; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 65537149; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]150; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536151; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]152; CHECK-NEXT:    ret i32 [[R]]153;154  %t0 = icmp slt i32 %x, 65537155  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high156  %t2 = icmp ult i32 %x, 65536157  %r = select i1 %t2, i32 %x, i32 %t1158  ret i32 %r159}160define i32 @n9_ult_slt_neg1(i32 %x, i32 %replacement_low, i32 %replacement_high) {161; CHECK-LABEL: @n9_ult_slt_neg1(162; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], -1163; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]164; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536165; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]166; CHECK-NEXT:    ret i32 [[R]]167;168  %t0 = icmp slt i32 %x, -1169  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high170  %t2 = icmp ult i32 %x, 65536171  %r = select i1 %t2, i32 %x, i32 %t1172  ret i32 %r173}174 175;-------------------------------------------------------------------------------176 177declare void @use32(i32)178declare void @use1(i1)179 180; One-use restrictions: here the entire pattern needs to be one-use.181; FIXME: if %t0 could be reused then it's less restrictive.182 183define i32 @n10_oneuse0(i32 %x, i32 %replacement_low, i32 %replacement_high) {184; CHECK-LABEL: @n10_oneuse0(185; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 32768186; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]187; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536188; CHECK-NEXT:    call void @use1(i1 [[T2]])189; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]190; CHECK-NEXT:    ret i32 [[R]]191;192  %t0 = icmp slt i32 %x, 32768193  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high194  %t2 = icmp ult i32 %x, 65536195  call void @use1(i1 %t2)196  %r = select i1 %t2, i32 %x, i32 %t1197  ret i32 %r198}199define i32 @n11_oneuse1(i32 %x, i32 %replacement_low, i32 %replacement_high) {200; CHECK-LABEL: @n11_oneuse1(201; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 32768202; CHECK-NEXT:    call void @use1(i1 [[T0]])203; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]204; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536205; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]206; CHECK-NEXT:    ret i32 [[R]]207;208  %t0 = icmp slt i32 %x, 32768209  call void @use1(i1 %t0)210  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high211  %t2 = icmp ult i32 %x, 65536212  %r = select i1 %t2, i32 %x, i32 %t1213  ret i32 %r214}215define i32 @n12_oneuse2(i32 %x, i32 %replacement_low, i32 %replacement_high) {216; CHECK-LABEL: @n12_oneuse2(217; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 32768218; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]219; CHECK-NEXT:    call void @use32(i32 [[T1]])220; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536221; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]222; CHECK-NEXT:    ret i32 [[R]]223;224  %t0 = icmp slt i32 %x, 32768225  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high226  call void @use32(i32 %t1)227  %t2 = icmp ult i32 %x, 65536228  %r = select i1 %t2, i32 %x, i32 %t1229  ret i32 %r230}231 232define i32 @n13_oneuse3(i32 %x, i32 %replacement_low, i32 %replacement_high) {233; CHECK-LABEL: @n13_oneuse3(234; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 32768235; CHECK-NEXT:    call void @use1(i1 [[T0]])236; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]237; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536238; CHECK-NEXT:    call void @use1(i1 [[T2]])239; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]240; CHECK-NEXT:    ret i32 [[R]]241;242  %t0 = icmp slt i32 %x, 32768243  call void @use1(i1 %t0)244  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high245  %t2 = icmp ult i32 %x, 65536246  call void @use1(i1 %t2)247  %r = select i1 %t2, i32 %x, i32 %t1248  ret i32 %r249}250define i32 @n14_oneuse4(i32 %x, i32 %replacement_low, i32 %replacement_high) {251; CHECK-LABEL: @n14_oneuse4(252; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 32768253; CHECK-NEXT:    call void @use1(i1 [[T0]])254; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]255; CHECK-NEXT:    call void @use32(i32 [[T1]])256; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536257; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]258; CHECK-NEXT:    ret i32 [[R]]259;260  %t0 = icmp slt i32 %x, 32768261  call void @use1(i1 %t0)262  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high263  call void @use32(i32 %t1)264  %t2 = icmp ult i32 %x, 65536265  %r = select i1 %t2, i32 %x, i32 %t1266  ret i32 %r267}268define i32 @n15_oneuse5(i32 %x, i32 %replacement_low, i32 %replacement_high) {269; CHECK-LABEL: @n15_oneuse5(270; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 32768271; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]272; CHECK-NEXT:    call void @use32(i32 [[T1]])273; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536274; CHECK-NEXT:    call void @use1(i1 [[T2]])275; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]276; CHECK-NEXT:    ret i32 [[R]]277;278  %t0 = icmp slt i32 %x, 32768279  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high280  call void @use32(i32 %t1)281  %t2 = icmp ult i32 %x, 65536282  call void @use1(i1 %t2)283  %r = select i1 %t2, i32 %x, i32 %t1284  ret i32 %r285}286 287define i32 @n16_oneuse6(i32 %x, i32 %replacement_low, i32 %replacement_high) {288; CHECK-LABEL: @n16_oneuse6(289; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 [[X:%.*]], 32768290; CHECK-NEXT:    call void @use1(i1 [[T0]])291; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], i32 [[REPLACEMENT_LOW:%.*]], i32 [[REPLACEMENT_HIGH:%.*]]292; CHECK-NEXT:    call void @use32(i32 [[T1]])293; CHECK-NEXT:    [[T2:%.*]] = icmp ult i32 [[X]], 65536294; CHECK-NEXT:    call void @use1(i1 [[T2]])295; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], i32 [[X]], i32 [[T1]]296; CHECK-NEXT:    ret i32 [[R]]297;298  %t0 = icmp slt i32 %x, 32768299  call void @use1(i1 %t0)300  %t1 = select i1 %t0, i32 %replacement_low, i32 %replacement_high301  call void @use32(i32 %t1)302  %t2 = icmp ult i32 %x, 65536303  call void @use1(i1 %t2)304  %r = select i1 %t2, i32 %x, i32 %t1305  ret i32 %r306}307 308;-------------------------------------------------------------------------------309 310; Vectors311 312define <2 x i32> @t17_ult_slt_vec_splat(<2 x i32> %x, <2 x i32> %replacement_low, <2 x i32> %replacement_high) {313; CHECK-LABEL: @t17_ult_slt_vec_splat(314; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer315; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <2 x i32> [[X]], splat (i32 65535)316; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[REPLACEMENT_LOW:%.*]], <2 x i32> [[X]]317; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[TMP2]], <2 x i32> [[REPLACEMENT_HIGH:%.*]], <2 x i32> [[TMP3]]318; CHECK-NEXT:    ret <2 x i32> [[R]]319;320  %t0 = icmp slt <2 x i32> %x, <i32 65536, i32 65536>321  %t1 = select <2 x i1> %t0, <2 x i32> %replacement_low, <2 x i32> %replacement_high322  %t2 = icmp ult <2 x i32> %x, <i32 65536, i32 65536>323  %r = select <2 x i1> %t2, <2 x i32> %x, <2 x i32> %t1324  ret <2 x i32> %r325}326define <2 x i32> @t18_ult_slt_vec_nonsplat(<2 x i32> %x, <2 x i32> %replacement_low, <2 x i32> %replacement_high) {327; CHECK-LABEL: @t18_ult_slt_vec_nonsplat(328; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer329; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <2 x i32> [[X]], <i32 65535, i32 32767>330; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[REPLACEMENT_LOW:%.*]], <2 x i32> [[X]]331; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[TMP2]], <2 x i32> [[REPLACEMENT_HIGH:%.*]], <2 x i32> [[TMP3]]332; CHECK-NEXT:    ret <2 x i32> [[R]]333;334  %t0 = icmp slt <2 x i32> %x, <i32 65536, i32 32768>335  %t1 = select <2 x i1> %t0, <2 x i32> %replacement_low, <2 x i32> %replacement_high336  %t2 = icmp ult <2 x i32> %x, <i32 65536, i32 32768>337  %r = select <2 x i1> %t2, <2 x i32> %x, <2 x i32> %t1338  ret <2 x i32> %r339}340 341define <3 x i32> @t19_ult_slt_vec_poison0(<3 x i32> %x, <3 x i32> %replacement_low, <3 x i32> %replacement_high) {342; CHECK-LABEL: @t19_ult_slt_vec_poison0(343; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt <3 x i32> [[X:%.*]], zeroinitializer344; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <3 x i32> [[X]], splat (i32 65535)345; CHECK-NEXT:    [[TMP3:%.*]] = select <3 x i1> [[TMP1]], <3 x i32> [[REPLACEMENT_LOW:%.*]], <3 x i32> [[X]]346; CHECK-NEXT:    [[R:%.*]] = select <3 x i1> [[TMP2]], <3 x i32> [[REPLACEMENT_HIGH:%.*]], <3 x i32> [[TMP3]]347; CHECK-NEXT:    ret <3 x i32> [[R]]348;349  %t0 = icmp slt <3 x i32> %x, <i32 65536, i32 poison, i32 65536>350  %t1 = select <3 x i1> %t0, <3 x i32> %replacement_low, <3 x i32> %replacement_high351  %t2 = icmp ult <3 x i32> %x, <i32 65536, i32 65536, i32 65536>352  %r = select <3 x i1> %t2, <3 x i32> %x, <3 x i32> %t1353  ret <3 x i32> %r354}355define <3 x i32> @t20_ult_slt_vec_poison1(<3 x i32> %x, <3 x i32> %replacement_low, <3 x i32> %replacement_high) {356; CHECK-LABEL: @t20_ult_slt_vec_poison1(357; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt <3 x i32> [[X:%.*]], zeroinitializer358; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <3 x i32> [[X]], splat (i32 65535)359; CHECK-NEXT:    [[TMP3:%.*]] = select <3 x i1> [[TMP1]], <3 x i32> [[REPLACEMENT_LOW:%.*]], <3 x i32> [[X]]360; CHECK-NEXT:    [[R:%.*]] = select <3 x i1> [[TMP2]], <3 x i32> [[REPLACEMENT_HIGH:%.*]], <3 x i32> [[TMP3]]361; CHECK-NEXT:    ret <3 x i32> [[R]]362;363  %t0 = icmp slt <3 x i32> %x, <i32 65536, i32 65537, i32 65536>364  %t1 = select <3 x i1> %t0, <3 x i32> %replacement_low, <3 x i32> %replacement_high365  %t2 = icmp ult <3 x i32> %x, <i32 65536, i32 poison, i32 65536>366  %r = select <3 x i1> %t2, <3 x i32> %x, <3 x i32> %t1367  ret <3 x i32> %r368}369define <3 x i32> @t21_ult_slt_vec_poison2(<3 x i32> %x, <3 x i32> %replacement_low, <3 x i32> %replacement_high) {370; CHECK-LABEL: @t21_ult_slt_vec_poison2(371; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt <3 x i32> [[X:%.*]], zeroinitializer372; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <3 x i32> [[X]], splat (i32 65535)373; CHECK-NEXT:    [[TMP3:%.*]] = select <3 x i1> [[TMP1]], <3 x i32> [[REPLACEMENT_LOW:%.*]], <3 x i32> [[X]]374; CHECK-NEXT:    [[R:%.*]] = select <3 x i1> [[TMP2]], <3 x i32> [[REPLACEMENT_HIGH:%.*]], <3 x i32> [[TMP3]]375; CHECK-NEXT:    ret <3 x i32> [[R]]376;377  %t0 = icmp slt <3 x i32> %x, <i32 65536, i32 poison, i32 65536>378  %t1 = select <3 x i1> %t0, <3 x i32> %replacement_low, <3 x i32> %replacement_high379  %t2 = icmp ult <3 x i32> %x, <i32 65536, i32 poison, i32 65536>380  %r = select <3 x i1> %t2, <3 x i32> %x, <3 x i32> %t1381  ret <3 x i32> %r382}383 384;-------------------------------------------------------------------------------385 386define ptr @t22_pointers(ptr %x, ptr %replacement_low, ptr %replacement_high) {387; CHECK-LABEL: @t22_pointers(388; CHECK-NEXT:    [[T0:%.*]] = icmp slt ptr [[X:%.*]], inttoptr (i64 65536 to ptr)389; CHECK-NEXT:    [[T1:%.*]] = select i1 [[T0]], ptr [[REPLACEMENT_LOW:%.*]], ptr [[REPLACEMENT_HIGH:%.*]]390; CHECK-NEXT:    [[T2:%.*]] = icmp ult ptr [[X]], inttoptr (i64 65536 to ptr)391; CHECK-NEXT:    [[R:%.*]] = select i1 [[T2]], ptr [[X]], ptr [[T1]]392; CHECK-NEXT:    ret ptr [[R]]393;394  %t0 = icmp slt ptr %x, inttoptr (i64 65536 to ptr)395  %t1 = select i1 %t0, ptr %replacement_low, ptr %replacement_high396  %t2 = icmp ult ptr %x, inttoptr (i64 65536 to ptr)397  %r = select i1 %t2, ptr %x, ptr %t1398  ret ptr %r399}400