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