brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.2 KiB · c0b882b Raw
1014 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=slp-vectorizer -S %s | FileCheck %s3; RUN: opt -aa-pipeline=basic-aa -passes=slp-vectorizer -S %s | FileCheck %s4 5target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"6target triple = "arm64-apple-ios5.0.0"7 8define void @select_umin_8xi16(ptr %ptr, i16 %x) {9; CHECK-LABEL: @select_umin_8xi16(10; CHECK-NEXT:  entry:11; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 212; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult <8 x i16> [[TMP1]], splat (i16 16383)13; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)14; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 215; CHECK-NEXT:    ret void16;17entry:18  %l.0 = load i16, ptr %ptr19  %cmp.0 = icmp ult i16 %l.0, 1638320  %s.0 = select i1 %cmp.0, i16 %l.0, i16 1638321  store i16 %s.0, ptr %ptr, align 222 23  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 124  %l.1 = load i16, ptr %gep.125  %cmp.1 = icmp ult i16 %l.1, 1638326  %s.1 = select i1 %cmp.1, i16 %l.1, i16 1638327  store i16 %s.1, ptr %gep.1, align 228 29  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 230  %l.2 = load i16, ptr %gep.231  %cmp.2 = icmp ult i16 %l.2, 1638332  %s.2 = select i1 %cmp.2, i16 %l.2, i16 1638333  store i16 %s.2, ptr %gep.2, align 234 35  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 336  %l.3 = load i16, ptr %gep.337  %cmp.3 = icmp ult i16 %l.3, 1638338  %s.3 = select i1 %cmp.3, i16 %l.3, i16 1638339  store i16 %s.3, ptr %gep.3, align 240 41  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 442  %l.4 = load i16, ptr %gep.443  %cmp.4 = icmp ult i16 %l.4, 1638344  %s.4 = select i1 %cmp.4, i16 %l.4, i16 1638345  store i16 %s.4, ptr %gep.4, align 246 47  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 548  %l.5 = load i16, ptr %gep.549  %cmp.5 = icmp ult i16 %l.5, 1638350  %s.5 = select i1 %cmp.5, i16 %l.5, i16 1638351  store i16 %s.5, ptr %gep.5, align 252 53  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 654  %l.6 = load i16, ptr %gep.655  %cmp.6 = icmp ult i16 %l.6, 1638356  %s.6 = select i1 %cmp.6, i16 %l.6, i16 1638357  store i16 %s.6, ptr %gep.6, align 258 59  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 760  %l.7 = load i16, ptr %gep.761  %cmp.7 = icmp ult i16 %l.7, 1638362  %s.7 = select i1 %cmp.7, i16 %l.7, i16 1638363  store i16 %s.7, ptr %gep.7, align 264  ret void65}66 67define void @select_umin_4xi32(ptr %ptr, i32 %x) {68; CHECK-LABEL: @select_umin_4xi32(69; CHECK-NEXT:  entry:70; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 471; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult <4 x i32> [[TMP1]], splat (i32 16383)72; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)73; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 474; CHECK-NEXT:    ret void75;76entry:77  %l.0 = load i32, ptr %ptr78  %cmp.0 = icmp ult i32 %l.0, 1638379  %s.0 = select i1 %cmp.0, i32 %l.0, i32 1638380  store i32 %s.0, ptr %ptr, align 481 82  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 183  %l.1 = load i32, ptr %gep.184  %cmp.1 = icmp ult i32 %l.1, 1638385  %s.1 = select i1 %cmp.1, i32 %l.1, i32 1638386  store i32 %s.1, ptr %gep.1, align 487 88  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 289  %l.2 = load i32, ptr %gep.290  %cmp.2 = icmp ult i32 %l.2, 1638391  %s.2 = select i1 %cmp.2, i32 %l.2, i32 1638392  store i32 %s.2, ptr %gep.2, align 493 94  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 395  %l.3 = load i32, ptr %gep.396  %cmp.3 = icmp ult i32 %l.3, 1638397  %s.3 = select i1 %cmp.3, i32 %l.3, i32 1638398  store i32 %s.3, ptr %gep.3, align 499 100  ret void101}102 103define void @select_ule_ugt_mix_4xi32(ptr %ptr, i32 %x) {104; CHECK-LABEL: @select_ule_ugt_mix_4xi32(105; CHECK-NEXT:  entry:106; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4107; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult <4 x i32> [[TMP1]], splat (i32 16383)108; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt <4 x i32> [[TMP1]], splat (i32 16383)109; CHECK-NEXT:    [[TMP4:%.*]] = shufflevector <4 x i1> [[TMP2]], <4 x i1> [[TMP3]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>110; CHECK-NEXT:    [[TMP5:%.*]] = select <4 x i1> [[TMP4]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)111; CHECK-NEXT:    store <4 x i32> [[TMP5]], ptr [[PTR]], align 4112; CHECK-NEXT:    ret void113;114entry:115  %l.0 = load i32, ptr %ptr116  %cmp.0 = icmp ult i32 %l.0, 16383117  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383118  store i32 %s.0, ptr %ptr, align 4119 120  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1121  %l.1 = load i32, ptr %gep.1122  %cmp.1 = icmp ugt i32 %l.1, 16383123  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383124  store i32 %s.1, ptr %gep.1, align 4125 126  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2127  %l.2 = load i32, ptr %gep.2128  %cmp.2 = icmp ult i32 %l.2, 16383129  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383130  store i32 %s.2, ptr %gep.2, align 4131 132  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3133  %l.3 = load i32, ptr %gep.3134  %cmp.3 = icmp ugt i32 %l.3, 16383135  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383136  store i32 %s.3, ptr %gep.3, align 4137 138  ret void139}140 141; There is no <2 x i64> version of umin, but we can efficiently lower142; compare/select pairs with uniform predicates.143define void @select_umin_2xi64(ptr %ptr, i64 %x) {144; CHECK-LABEL: @select_umin_2xi64(145; CHECK-NEXT:  entry:146; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8147; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult <2 x i64> [[TMP1]], splat (i64 16383)148; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)149; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4150; CHECK-NEXT:    ret void151;152entry:153  %l.0 = load i64, ptr %ptr154  %cmp.0 = icmp ult i64 %l.0, 16383155  %s.0 = select i1 %cmp.0, i64 %l.0, i64 16383156  store i64 %s.0, ptr %ptr, align 4157 158  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1159  %l.1 = load i64, ptr %gep.1160  %cmp.1 = icmp ult i64 %l.1, 16383161  %s.1 = select i1 %cmp.1, i64 %l.1, i64 16383162  store i64 %s.1, ptr %gep.1, align 4163 164  ret void165}166 167 168define void @select_umin_ule_8xi16(ptr %ptr, i16 %x) {169; CHECK-LABEL: @select_umin_ule_8xi16(170; CHECK-NEXT:  entry:171; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2172; CHECK-NEXT:    [[TMP2:%.*]] = icmp ule <8 x i16> [[TMP1]], splat (i16 16383)173; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)174; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 2175; CHECK-NEXT:    ret void176;177entry:178  %l.0 = load i16, ptr %ptr179  %cmp.0 = icmp ule i16 %l.0, 16383180  %s.0 = select i1 %cmp.0, i16 %l.0, i16 16383181  store i16 %s.0, ptr %ptr, align 2182 183  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1184  %l.1 = load i16, ptr %gep.1185  %cmp.1 = icmp ule i16 %l.1, 16383186  %s.1 = select i1 %cmp.1, i16 %l.1, i16 16383187  store i16 %s.1, ptr %gep.1, align 2188 189  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2190  %l.2 = load i16, ptr %gep.2191  %cmp.2 = icmp ule i16 %l.2, 16383192  %s.2 = select i1 %cmp.2, i16 %l.2, i16 16383193  store i16 %s.2, ptr %gep.2, align 2194 195  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3196  %l.3 = load i16, ptr %gep.3197  %cmp.3 = icmp ule i16 %l.3, 16383198  %s.3 = select i1 %cmp.3, i16 %l.3, i16 16383199  store i16 %s.3, ptr %gep.3, align 2200 201  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4202  %l.4 = load i16, ptr %gep.4203  %cmp.4 = icmp ule i16 %l.4, 16383204  %s.4 = select i1 %cmp.4, i16 %l.4, i16 16383205  store i16 %s.4, ptr %gep.4, align 2206 207  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5208  %l.5 = load i16, ptr %gep.5209  %cmp.5 = icmp ule i16 %l.5, 16383210  %s.5 = select i1 %cmp.5, i16 %l.5, i16 16383211  store i16 %s.5, ptr %gep.5, align 2212 213  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6214  %l.6 = load i16, ptr %gep.6215  %cmp.6 = icmp ule i16 %l.6, 16383216  %s.6 = select i1 %cmp.6, i16 %l.6, i16 16383217  store i16 %s.6, ptr %gep.6, align 2218 219  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7220  %l.7 = load i16, ptr %gep.7221  %cmp.7 = icmp ule i16 %l.7, 16383222  %s.7 = select i1 %cmp.7, i16 %l.7, i16 16383223  store i16 %s.7, ptr %gep.7, align 2224  ret void225}226 227define void @select_umin_ule_4xi32(ptr %ptr, i32 %x) {228; CHECK-LABEL: @select_umin_ule_4xi32(229; CHECK-NEXT:  entry:230; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4231; CHECK-NEXT:    [[TMP2:%.*]] = icmp ule <4 x i32> [[TMP1]], splat (i32 16383)232; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)233; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 4234; CHECK-NEXT:    ret void235;236entry:237  %l.0 = load i32, ptr %ptr238  %cmp.0 = icmp ule i32 %l.0, 16383239  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383240  store i32 %s.0, ptr %ptr, align 4241 242  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1243  %l.1 = load i32, ptr %gep.1244  %cmp.1 = icmp ule i32 %l.1, 16383245  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383246  store i32 %s.1, ptr %gep.1, align 4247 248  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2249  %l.2 = load i32, ptr %gep.2250  %cmp.2 = icmp ule i32 %l.2, 16383251  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383252  store i32 %s.2, ptr %gep.2, align 4253 254  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3255  %l.3 = load i32, ptr %gep.3256  %cmp.3 = icmp ule i32 %l.3, 16383257  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383258  store i32 %s.3, ptr %gep.3, align 4259 260  ret void261}262 263; There is no <2 x i64> version of umin, but we can efficiently lower264; compare/select pairs with uniform predicates.265define void @select_umin_ule_2xi64(ptr %ptr, i64 %x) {266; CHECK-LABEL: @select_umin_ule_2xi64(267; CHECK-NEXT:  entry:268; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8269; CHECK-NEXT:    [[TMP2:%.*]] = icmp ule <2 x i64> [[TMP1]], splat (i64 16383)270; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)271; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4272; CHECK-NEXT:    ret void273;274entry:275  %l.0 = load i64, ptr %ptr276  %cmp.0 = icmp ule i64 %l.0, 16383277  %s.0 = select i1 %cmp.0, i64 %l.0, i64 16383278  store i64 %s.0, ptr %ptr, align 4279 280  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1281  %l.1 = load i64, ptr %gep.1282  %cmp.1 = icmp ule i64 %l.1, 16383283  %s.1 = select i1 %cmp.1, i64 %l.1, i64 16383284  store i64 %s.1, ptr %gep.1, align 4285 286  ret void287}288 289define void @select_smin_8xi16(ptr %ptr, i16 %x) {290; CHECK-LABEL: @select_smin_8xi16(291; CHECK-NEXT:  entry:292; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2293; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt <8 x i16> [[TMP1]], splat (i16 16383)294; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)295; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 2296; CHECK-NEXT:    ret void297;298entry:299  %l.0 = load i16, ptr %ptr300  %cmp.0 = icmp slt i16 %l.0, 16383301  %s.0 = select i1 %cmp.0, i16 %l.0, i16 16383302  store i16 %s.0, ptr %ptr, align 2303 304  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1305  %l.1 = load i16, ptr %gep.1306  %cmp.1 = icmp slt i16 %l.1, 16383307  %s.1 = select i1 %cmp.1, i16 %l.1, i16 16383308  store i16 %s.1, ptr %gep.1, align 2309 310  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2311  %l.2 = load i16, ptr %gep.2312  %cmp.2 = icmp slt i16 %l.2, 16383313  %s.2 = select i1 %cmp.2, i16 %l.2, i16 16383314  store i16 %s.2, ptr %gep.2, align 2315 316  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3317  %l.3 = load i16, ptr %gep.3318  %cmp.3 = icmp slt i16 %l.3, 16383319  %s.3 = select i1 %cmp.3, i16 %l.3, i16 16383320  store i16 %s.3, ptr %gep.3, align 2321 322  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4323  %l.4 = load i16, ptr %gep.4324  %cmp.4 = icmp slt i16 %l.4, 16383325  %s.4 = select i1 %cmp.4, i16 %l.4, i16 16383326  store i16 %s.4, ptr %gep.4, align 2327 328  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5329  %l.5 = load i16, ptr %gep.5330  %cmp.5 = icmp slt i16 %l.5, 16383331  %s.5 = select i1 %cmp.5, i16 %l.5, i16 16383332  store i16 %s.5, ptr %gep.5, align 2333 334  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6335  %l.6 = load i16, ptr %gep.6336  %cmp.6 = icmp slt i16 %l.6, 16383337  %s.6 = select i1 %cmp.6, i16 %l.6, i16 16383338  store i16 %s.6, ptr %gep.6, align 2339 340  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7341  %l.7 = load i16, ptr %gep.7342  %cmp.7 = icmp slt i16 %l.7, 16383343  %s.7 = select i1 %cmp.7, i16 %l.7, i16 16383344  store i16 %s.7, ptr %gep.7, align 2345  ret void346}347 348define void @select_smin_4xi32(ptr %ptr, i32 %x) {349; CHECK-LABEL: @select_smin_4xi32(350; CHECK-NEXT:  entry:351; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4352; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt <4 x i32> [[TMP1]], splat (i32 16383)353; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)354; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 4355; CHECK-NEXT:    ret void356;357entry:358  %l.0 = load i32, ptr %ptr359  %cmp.0 = icmp slt i32 %l.0, 16383360  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383361  store i32 %s.0, ptr %ptr, align 4362 363  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1364  %l.1 = load i32, ptr %gep.1365  %cmp.1 = icmp slt i32 %l.1, 16383366  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383367  store i32 %s.1, ptr %gep.1, align 4368 369  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2370  %l.2 = load i32, ptr %gep.2371  %cmp.2 = icmp slt i32 %l.2, 16383372  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383373  store i32 %s.2, ptr %gep.2, align 4374 375  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3376  %l.3 = load i32, ptr %gep.3377  %cmp.3 = icmp slt i32 %l.3, 16383378  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383379  store i32 %s.3, ptr %gep.3, align 4380 381  ret void382}383 384; There is no <2 x i64> version of smin, but we can efficiently lower385; compare/select pairs with uniform predicates.386define void @select_smin_2xi64(ptr %ptr, i64 %x) {387; CHECK-LABEL: @select_smin_2xi64(388; CHECK-NEXT:  entry:389; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8390; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt <2 x i64> [[TMP1]], splat (i64 16383)391; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)392; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4393; CHECK-NEXT:    ret void394;395entry:396  %l.0 = load i64, ptr %ptr397  %cmp.0 = icmp slt i64 %l.0, 16383398  %s.0 = select i1 %cmp.0, i64 %l.0, i64 16383399  store i64 %s.0, ptr %ptr, align 4400 401  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1402  %l.1 = load i64, ptr %gep.1403  %cmp.1 = icmp slt i64 %l.1, 16383404  %s.1 = select i1 %cmp.1, i64 %l.1, i64 16383405  store i64 %s.1, ptr %gep.1, align 4406 407  ret void408}409 410define void @select_smin_sle_8xi16(ptr %ptr, i16 %x) {411; CHECK-LABEL: @select_smin_sle_8xi16(412; CHECK-NEXT:  entry:413; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2414; CHECK-NEXT:    [[TMP2:%.*]] = icmp sle <8 x i16> [[TMP1]], splat (i16 16383)415; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)416; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 2417; CHECK-NEXT:    ret void418;419entry:420  %l.0 = load i16, ptr %ptr421  %cmp.0 = icmp sle i16 %l.0, 16383422  %s.0 = select i1 %cmp.0, i16 %l.0, i16 16383423  store i16 %s.0, ptr %ptr, align 2424 425  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1426  %l.1 = load i16, ptr %gep.1427  %cmp.1 = icmp sle i16 %l.1, 16383428  %s.1 = select i1 %cmp.1, i16 %l.1, i16 16383429  store i16 %s.1, ptr %gep.1, align 2430 431  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2432  %l.2 = load i16, ptr %gep.2433  %cmp.2 = icmp sle i16 %l.2, 16383434  %s.2 = select i1 %cmp.2, i16 %l.2, i16 16383435  store i16 %s.2, ptr %gep.2, align 2436 437  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3438  %l.3 = load i16, ptr %gep.3439  %cmp.3 = icmp sle i16 %l.3, 16383440  %s.3 = select i1 %cmp.3, i16 %l.3, i16 16383441  store i16 %s.3, ptr %gep.3, align 2442 443  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4444  %l.4 = load i16, ptr %gep.4445  %cmp.4 = icmp sle i16 %l.4, 16383446  %s.4 = select i1 %cmp.4, i16 %l.4, i16 16383447  store i16 %s.4, ptr %gep.4, align 2448 449  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5450  %l.5 = load i16, ptr %gep.5451  %cmp.5 = icmp sle i16 %l.5, 16383452  %s.5 = select i1 %cmp.5, i16 %l.5, i16 16383453  store i16 %s.5, ptr %gep.5, align 2454 455  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6456  %l.6 = load i16, ptr %gep.6457  %cmp.6 = icmp sle i16 %l.6, 16383458  %s.6 = select i1 %cmp.6, i16 %l.6, i16 16383459  store i16 %s.6, ptr %gep.6, align 2460 461  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7462  %l.7 = load i16, ptr %gep.7463  %cmp.7 = icmp sle i16 %l.7, 16383464  %s.7 = select i1 %cmp.7, i16 %l.7, i16 16383465  store i16 %s.7, ptr %gep.7, align 2466  ret void467}468 469define void @select_smin_sle_4xi32(ptr %ptr, i32 %x) {470; CHECK-LABEL: @select_smin_sle_4xi32(471; CHECK-NEXT:  entry:472; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4473; CHECK-NEXT:    [[TMP2:%.*]] = icmp sle <4 x i32> [[TMP1]], splat (i32 16383)474; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)475; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 4476; CHECK-NEXT:    ret void477;478entry:479  %l.0 = load i32, ptr %ptr480  %cmp.0 = icmp sle i32 %l.0, 16383481  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383482  store i32 %s.0, ptr %ptr, align 4483 484  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1485  %l.1 = load i32, ptr %gep.1486  %cmp.1 = icmp sle i32 %l.1, 16383487  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383488  store i32 %s.1, ptr %gep.1, align 4489 490  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2491  %l.2 = load i32, ptr %gep.2492  %cmp.2 = icmp sle i32 %l.2, 16383493  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383494  store i32 %s.2, ptr %gep.2, align 4495 496  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3497  %l.3 = load i32, ptr %gep.3498  %cmp.3 = icmp sle i32 %l.3, 16383499  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383500  store i32 %s.3, ptr %gep.3, align 4501 502  ret void503}504 505; There is no <2 x i64> version of smin, but we can efficiently lower506; compare/select pairs with uniform predicates.507define void @select_smin_sle_2xi64(ptr %ptr, i64 %x) {508; CHECK-LABEL: @select_smin_sle_2xi64(509; CHECK-NEXT:  entry:510; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8511; CHECK-NEXT:    [[TMP2:%.*]] = icmp sle <2 x i64> [[TMP1]], splat (i64 16383)512; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)513; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4514; CHECK-NEXT:    ret void515;516entry:517  %l.0 = load i64, ptr %ptr518  %cmp.0 = icmp sle i64 %l.0, 16383519  %s.0 = select i1 %cmp.0, i64 %l.0, i64 16383520  store i64 %s.0, ptr %ptr, align 4521 522  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1523  %l.1 = load i64, ptr %gep.1524  %cmp.1 = icmp sle i64 %l.1, 16383525  %s.1 = select i1 %cmp.1, i64 %l.1, i64 16383526  store i64 %s.1, ptr %gep.1, align 4527 528  ret void529}530define void @select_umax_8xi16(ptr %ptr, i16 %x) {531; CHECK-LABEL: @select_umax_8xi16(532; CHECK-NEXT:  entry:533; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2534; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt <8 x i16> [[TMP1]], splat (i16 16383)535; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)536; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 2537; CHECK-NEXT:    ret void538;539entry:540  %l.0 = load i16, ptr %ptr541  %cmp.0 = icmp ugt i16 %l.0, 16383542  %s.0 = select i1 %cmp.0, i16 %l.0, i16 16383543  store i16 %s.0, ptr %ptr, align 2544 545  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1546  %l.1 = load i16, ptr %gep.1547  %cmp.1 = icmp ugt i16 %l.1, 16383548  %s.1 = select i1 %cmp.1, i16 %l.1, i16 16383549  store i16 %s.1, ptr %gep.1, align 2550 551  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2552  %l.2 = load i16, ptr %gep.2553  %cmp.2 = icmp ugt i16 %l.2, 16383554  %s.2 = select i1 %cmp.2, i16 %l.2, i16 16383555  store i16 %s.2, ptr %gep.2, align 2556 557  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3558  %l.3 = load i16, ptr %gep.3559  %cmp.3 = icmp ugt i16 %l.3, 16383560  %s.3 = select i1 %cmp.3, i16 %l.3, i16 16383561  store i16 %s.3, ptr %gep.3, align 2562 563  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4564  %l.4 = load i16, ptr %gep.4565  %cmp.4 = icmp ugt i16 %l.4, 16383566  %s.4 = select i1 %cmp.4, i16 %l.4, i16 16383567  store i16 %s.4, ptr %gep.4, align 2568 569  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5570  %l.5 = load i16, ptr %gep.5571  %cmp.5 = icmp ugt i16 %l.5, 16383572  %s.5 = select i1 %cmp.5, i16 %l.5, i16 16383573  store i16 %s.5, ptr %gep.5, align 2574 575  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6576  %l.6 = load i16, ptr %gep.6577  %cmp.6 = icmp ugt i16 %l.6, 16383578  %s.6 = select i1 %cmp.6, i16 %l.6, i16 16383579  store i16 %s.6, ptr %gep.6, align 2580 581  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7582  %l.7 = load i16, ptr %gep.7583  %cmp.7 = icmp ugt i16 %l.7, 16383584  %s.7 = select i1 %cmp.7, i16 %l.7, i16 16383585  store i16 %s.7, ptr %gep.7, align 2586  ret void587}588 589define void @select_umax_4xi32(ptr %ptr, i32 %x) {590; CHECK-LABEL: @select_umax_4xi32(591; CHECK-NEXT:  entry:592; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4593; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt <4 x i32> [[TMP1]], splat (i32 16383)594; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)595; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 4596; CHECK-NEXT:    ret void597;598entry:599  %l.0 = load i32, ptr %ptr600  %cmp.0 = icmp ugt i32 %l.0, 16383601  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383602  store i32 %s.0, ptr %ptr, align 4603 604  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1605  %l.1 = load i32, ptr %gep.1606  %cmp.1 = icmp ugt i32 %l.1, 16383607  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383608  store i32 %s.1, ptr %gep.1, align 4609 610  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2611  %l.2 = load i32, ptr %gep.2612  %cmp.2 = icmp ugt i32 %l.2, 16383613  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383614  store i32 %s.2, ptr %gep.2, align 4615 616  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3617  %l.3 = load i32, ptr %gep.3618  %cmp.3 = icmp ugt i32 %l.3, 16383619  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383620  store i32 %s.3, ptr %gep.3, align 4621 622  ret void623}624 625; There is no <2 x i64> version of umax, but we can efficiently lower626; compare/select pairs with uniform predicates.627define void @select_umax_2xi64(ptr %ptr, i64 %x) {628; CHECK-LABEL: @select_umax_2xi64(629; CHECK-NEXT:  entry:630; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8631; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt <2 x i64> [[TMP1]], splat (i64 16383)632; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)633; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4634; CHECK-NEXT:    ret void635;636entry:637  %l.0 = load i64, ptr %ptr638  %cmp.0 = icmp ugt i64 %l.0, 16383639  %s.0 = select i1 %cmp.0, i64 %l.0, i64 16383640  store i64 %s.0, ptr %ptr, align 4641 642  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1643  %l.1 = load i64, ptr %gep.1644  %cmp.1 = icmp ugt i64 %l.1, 16383645  %s.1 = select i1 %cmp.1, i64 %l.1, i64 16383646  store i64 %s.1, ptr %gep.1, align 4647 648  ret void649}650 651define void @select_umax_uge_8xi16(ptr %ptr, i16 %x) {652; CHECK-LABEL: @select_umax_uge_8xi16(653; CHECK-NEXT:  entry:654; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2655; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge <8 x i16> [[TMP1]], splat (i16 16383)656; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)657; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 2658; CHECK-NEXT:    ret void659;660entry:661  %l.0 = load i16, ptr %ptr662  %cmp.0 = icmp uge i16 %l.0, 16383663  %s.0 = select i1 %cmp.0, i16 %l.0, i16 16383664  store i16 %s.0, ptr %ptr, align 2665 666  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1667  %l.1 = load i16, ptr %gep.1668  %cmp.1 = icmp uge i16 %l.1, 16383669  %s.1 = select i1 %cmp.1, i16 %l.1, i16 16383670  store i16 %s.1, ptr %gep.1, align 2671 672  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2673  %l.2 = load i16, ptr %gep.2674  %cmp.2 = icmp uge i16 %l.2, 16383675  %s.2 = select i1 %cmp.2, i16 %l.2, i16 16383676  store i16 %s.2, ptr %gep.2, align 2677 678  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3679  %l.3 = load i16, ptr %gep.3680  %cmp.3 = icmp uge i16 %l.3, 16383681  %s.3 = select i1 %cmp.3, i16 %l.3, i16 16383682  store i16 %s.3, ptr %gep.3, align 2683 684  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4685  %l.4 = load i16, ptr %gep.4686  %cmp.4 = icmp uge i16 %l.4, 16383687  %s.4 = select i1 %cmp.4, i16 %l.4, i16 16383688  store i16 %s.4, ptr %gep.4, align 2689 690  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5691  %l.5 = load i16, ptr %gep.5692  %cmp.5 = icmp uge i16 %l.5, 16383693  %s.5 = select i1 %cmp.5, i16 %l.5, i16 16383694  store i16 %s.5, ptr %gep.5, align 2695 696  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6697  %l.6 = load i16, ptr %gep.6698  %cmp.6 = icmp uge i16 %l.6, 16383699  %s.6 = select i1 %cmp.6, i16 %l.6, i16 16383700  store i16 %s.6, ptr %gep.6, align 2701 702  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7703  %l.7 = load i16, ptr %gep.7704  %cmp.7 = icmp uge i16 %l.7, 16383705  %s.7 = select i1 %cmp.7, i16 %l.7, i16 16383706  store i16 %s.7, ptr %gep.7, align 2707  ret void708}709 710define void @select_umax_uge_4xi32(ptr %ptr, i32 %x) {711; CHECK-LABEL: @select_umax_uge_4xi32(712; CHECK-NEXT:  entry:713; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4714; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge <4 x i32> [[TMP1]], splat (i32 16383)715; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)716; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 4717; CHECK-NEXT:    ret void718;719entry:720  %l.0 = load i32, ptr %ptr721  %cmp.0 = icmp uge i32 %l.0, 16383722  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383723  store i32 %s.0, ptr %ptr, align 4724 725  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1726  %l.1 = load i32, ptr %gep.1727  %cmp.1 = icmp uge i32 %l.1, 16383728  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383729  store i32 %s.1, ptr %gep.1, align 4730 731  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2732  %l.2 = load i32, ptr %gep.2733  %cmp.2 = icmp uge i32 %l.2, 16383734  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383735  store i32 %s.2, ptr %gep.2, align 4736 737  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3738  %l.3 = load i32, ptr %gep.3739  %cmp.3 = icmp uge i32 %l.3, 16383740  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383741  store i32 %s.3, ptr %gep.3, align 4742 743  ret void744}745 746; There is no <2 x i64> version of umax, but we can efficiently lower747; compare/select pairs with uniform predicates.748define void @select_umax_uge_2xi64(ptr %ptr, i64 %x) {749; CHECK-LABEL: @select_umax_uge_2xi64(750; CHECK-NEXT:  entry:751; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8752; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge <2 x i64> [[TMP1]], splat (i64 16383)753; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)754; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4755; CHECK-NEXT:    ret void756;757entry:758  %l.0 = load i64, ptr %ptr759  %cmp.0 = icmp uge i64 %l.0, 16383760  %s.0 = select i1 %cmp.0, i64 %l.0, i64 16383761  store i64 %s.0, ptr %ptr, align 4762 763  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1764  %l.1 = load i64, ptr %gep.1765  %cmp.1 = icmp uge i64 %l.1, 16383766  %s.1 = select i1 %cmp.1, i64 %l.1, i64 16383767  store i64 %s.1, ptr %gep.1, align 4768 769  ret void770}771 772define void @select_smax_8xi16(ptr %ptr, i16 %x) {773; CHECK-LABEL: @select_smax_8xi16(774; CHECK-NEXT:  entry:775; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2776; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <8 x i16> [[TMP1]], splat (i16 16383)777; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)778; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 2779; CHECK-NEXT:    ret void780;781entry:782  %l.0 = load i16, ptr %ptr783  %cmp.0 = icmp sgt i16 %l.0, 16383784  %s.0 = select i1 %cmp.0, i16 %l.0, i16 16383785  store i16 %s.0, ptr %ptr, align 2786 787  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1788  %l.1 = load i16, ptr %gep.1789  %cmp.1 = icmp sgt i16 %l.1, 16383790  %s.1 = select i1 %cmp.1, i16 %l.1, i16 16383791  store i16 %s.1, ptr %gep.1, align 2792 793  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2794  %l.2 = load i16, ptr %gep.2795  %cmp.2 = icmp sgt i16 %l.2, 16383796  %s.2 = select i1 %cmp.2, i16 %l.2, i16 16383797  store i16 %s.2, ptr %gep.2, align 2798 799  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3800  %l.3 = load i16, ptr %gep.3801  %cmp.3 = icmp sgt i16 %l.3, 16383802  %s.3 = select i1 %cmp.3, i16 %l.3, i16 16383803  store i16 %s.3, ptr %gep.3, align 2804 805  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4806  %l.4 = load i16, ptr %gep.4807  %cmp.4 = icmp sgt i16 %l.4, 16383808  %s.4 = select i1 %cmp.4, i16 %l.4, i16 16383809  store i16 %s.4, ptr %gep.4, align 2810 811  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5812  %l.5 = load i16, ptr %gep.5813  %cmp.5 = icmp sgt i16 %l.5, 16383814  %s.5 = select i1 %cmp.5, i16 %l.5, i16 16383815  store i16 %s.5, ptr %gep.5, align 2816 817  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6818  %l.6 = load i16, ptr %gep.6819  %cmp.6 = icmp sgt i16 %l.6, 16383820  %s.6 = select i1 %cmp.6, i16 %l.6, i16 16383821  store i16 %s.6, ptr %gep.6, align 2822 823  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7824  %l.7 = load i16, ptr %gep.7825  %cmp.7 = icmp sgt i16 %l.7, 16383826  %s.7 = select i1 %cmp.7, i16 %l.7, i16 16383827  store i16 %s.7, ptr %gep.7, align 2828  ret void829}830 831define void @select_smax_4xi32(ptr %ptr, i32 %x) {832; CHECK-LABEL: @select_smax_4xi32(833; CHECK-NEXT:  entry:834; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4835; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <4 x i32> [[TMP1]], splat (i32 16383)836; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)837; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 4838; CHECK-NEXT:    ret void839;840entry:841  %l.0 = load i32, ptr %ptr842  %cmp.0 = icmp sgt i32 %l.0, 16383843  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383844  store i32 %s.0, ptr %ptr, align 4845 846  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1847  %l.1 = load i32, ptr %gep.1848  %cmp.1 = icmp sgt i32 %l.1, 16383849  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383850  store i32 %s.1, ptr %gep.1, align 4851 852  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2853  %l.2 = load i32, ptr %gep.2854  %cmp.2 = icmp sgt i32 %l.2, 16383855  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383856  store i32 %s.2, ptr %gep.2, align 4857 858  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3859  %l.3 = load i32, ptr %gep.3860  %cmp.3 = icmp sgt i32 %l.3, 16383861  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383862  store i32 %s.3, ptr %gep.3, align 4863 864  ret void865}866 867; There is no <2 x i64> version of smax, but we can efficiently lower868; compare/select pairs with uniform predicates.869define void @select_smax_2xi64(ptr %ptr, i64 %x) {870; CHECK-LABEL: @select_smax_2xi64(871; CHECK-NEXT:  entry:872; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8873; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <2 x i64> [[TMP1]], splat (i64 16383)874; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)875; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4876; CHECK-NEXT:    ret void877;878entry:879  %l.0 = load i64, ptr %ptr880  %cmp.0 = icmp sgt i64 %l.0, 16383881  %s.0 = select i1 %cmp.0, i64 %l.0, i64 16383882  store i64 %s.0, ptr %ptr, align 4883 884  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1885  %l.1 = load i64, ptr %gep.1886  %cmp.1 = icmp sgt i64 %l.1, 16383887  %s.1 = select i1 %cmp.1, i64 %l.1, i64 16383888  store i64 %s.1, ptr %gep.1, align 4889 890  ret void891}892 893 894define void @select_smax_sge_8xi16(ptr %ptr, i16 %x) {895; CHECK-LABEL: @select_smax_sge_8xi16(896; CHECK-NEXT:  entry:897; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2898; CHECK-NEXT:    [[TMP2:%.*]] = icmp sge <8 x i16> [[TMP1]], splat (i16 16383)899; CHECK-NEXT:    [[TMP3:%.*]] = select <8 x i1> [[TMP2]], <8 x i16> [[TMP1]], <8 x i16> splat (i16 16383)900; CHECK-NEXT:    store <8 x i16> [[TMP3]], ptr [[PTR]], align 2901; CHECK-NEXT:    ret void902;903entry:904  %l.0 = load i16, ptr %ptr905  %cmp.0 = icmp sge i16 %l.0, 16383906  %s.0 = select i1 %cmp.0, i16 %l.0, i16 16383907  store i16 %s.0, ptr %ptr, align 2908 909  %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1910  %l.1 = load i16, ptr %gep.1911  %cmp.1 = icmp sge i16 %l.1, 16383912  %s.1 = select i1 %cmp.1, i16 %l.1, i16 16383913  store i16 %s.1, ptr %gep.1, align 2914 915  %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2916  %l.2 = load i16, ptr %gep.2917  %cmp.2 = icmp sge i16 %l.2, 16383918  %s.2 = select i1 %cmp.2, i16 %l.2, i16 16383919  store i16 %s.2, ptr %gep.2, align 2920 921  %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3922  %l.3 = load i16, ptr %gep.3923  %cmp.3 = icmp sge i16 %l.3, 16383924  %s.3 = select i1 %cmp.3, i16 %l.3, i16 16383925  store i16 %s.3, ptr %gep.3, align 2926 927  %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4928  %l.4 = load i16, ptr %gep.4929  %cmp.4 = icmp sge i16 %l.4, 16383930  %s.4 = select i1 %cmp.4, i16 %l.4, i16 16383931  store i16 %s.4, ptr %gep.4, align 2932 933  %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5934  %l.5 = load i16, ptr %gep.5935  %cmp.5 = icmp sge i16 %l.5, 16383936  %s.5 = select i1 %cmp.5, i16 %l.5, i16 16383937  store i16 %s.5, ptr %gep.5, align 2938 939  %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6940  %l.6 = load i16, ptr %gep.6941  %cmp.6 = icmp sge i16 %l.6, 16383942  %s.6 = select i1 %cmp.6, i16 %l.6, i16 16383943  store i16 %s.6, ptr %gep.6, align 2944 945  %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7946  %l.7 = load i16, ptr %gep.7947  %cmp.7 = icmp sge i16 %l.7, 16383948  %s.7 = select i1 %cmp.7, i16 %l.7, i16 16383949  store i16 %s.7, ptr %gep.7, align 2950  ret void951}952 953define void @select_smax_sge_4xi32(ptr %ptr, i32 %x) {954; CHECK-LABEL: @select_smax_sge_4xi32(955; CHECK-NEXT:  entry:956; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4957; CHECK-NEXT:    [[TMP2:%.*]] = icmp sge <4 x i32> [[TMP1]], splat (i32 16383)958; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP1]], <4 x i32> splat (i32 16383)959; CHECK-NEXT:    store <4 x i32> [[TMP3]], ptr [[PTR]], align 4960; CHECK-NEXT:    ret void961;962entry:963  %l.0 = load i32, ptr %ptr964  %cmp.0 = icmp sge i32 %l.0, 16383965  %s.0 = select i1 %cmp.0, i32 %l.0, i32 16383966  store i32 %s.0, ptr %ptr, align 4967 968  %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1969  %l.1 = load i32, ptr %gep.1970  %cmp.1 = icmp sge i32 %l.1, 16383971  %s.1 = select i1 %cmp.1, i32 %l.1, i32 16383972  store i32 %s.1, ptr %gep.1, align 4973 974  %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2975  %l.2 = load i32, ptr %gep.2976  %cmp.2 = icmp sge i32 %l.2, 16383977  %s.2 = select i1 %cmp.2, i32 %l.2, i32 16383978  store i32 %s.2, ptr %gep.2, align 4979 980  %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3981  %l.3 = load i32, ptr %gep.3982  %cmp.3 = icmp sge i32 %l.3, 16383983  %s.3 = select i1 %cmp.3, i32 %l.3, i32 16383984  store i32 %s.3, ptr %gep.3, align 4985 986  ret void987}988 989; There is no <2 x i64> version of smax, but we can efficiently lower990; compare/select pairs with uniform predicates.991define void @select_smax_sge_2xi64(ptr %ptr, i64 %x) {992; CHECK-LABEL: @select_smax_sge_2xi64(993; CHECK-NEXT:  entry:994; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8995; CHECK-NEXT:    [[TMP2:%.*]] = icmp sge <2 x i64> [[TMP1]], splat (i64 16383)996; CHECK-NEXT:    [[TMP3:%.*]] = select <2 x i1> [[TMP2]], <2 x i64> [[TMP1]], <2 x i64> splat (i64 16383)997; CHECK-NEXT:    store <2 x i64> [[TMP3]], ptr [[PTR]], align 4998; CHECK-NEXT:    ret void999;1000entry:1001  %l.0 = load i64, ptr %ptr1002  %cmp.0 = icmp sge i64 %l.0, 163831003  %s.0 = select i1 %cmp.0, i64 %l.0, i64 163831004  store i64 %s.0, ptr %ptr, align 41005 1006  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 11007  %l.1 = load i64, ptr %gep.11008  %cmp.1 = icmp sge i64 %l.1, 163831009  %s.1 = select i1 %cmp.1, i64 %l.1, i64 163831010  store i64 %s.1, ptr %gep.1, align 41011 1012  ret void1013}1014