558 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 8; Some negative tests first.9 10; We need selects with a uniform predicate to lower effectively to vector11; instructions.12define void @select_mixed_predicates_8xi16(ptr %ptr, i16 %x) {13; CHECK-LABEL: @select_mixed_predicates_8xi16(14; CHECK-NEXT: entry:15; CHECK-NEXT: [[L_0:%.*]] = load i16, ptr [[PTR:%.*]], align 216; CHECK-NEXT: [[CMP_0:%.*]] = icmp ult i16 [[L_0]], 1638317; CHECK-NEXT: [[S_0:%.*]] = select i1 [[CMP_0]], i16 [[L_0]], i16 [[X:%.*]]18; CHECK-NEXT: store i16 [[S_0]], ptr [[PTR]], align 219; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 120; CHECK-NEXT: [[L_1:%.*]] = load i16, ptr [[GEP_1]], align 221; CHECK-NEXT: [[CMP_1:%.*]] = icmp sgt i16 [[L_1]], 1638322; CHECK-NEXT: [[S_1:%.*]] = select i1 [[CMP_1]], i16 [[L_1]], i16 [[X]]23; CHECK-NEXT: store i16 [[S_1]], ptr [[GEP_1]], align 224; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 225; CHECK-NEXT: [[L_2:%.*]] = load i16, ptr [[GEP_2]], align 226; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i16 [[L_2]], 1638327; CHECK-NEXT: [[S_2:%.*]] = select i1 [[CMP_2]], i16 [[L_2]], i16 [[X]]28; CHECK-NEXT: store i16 [[S_2]], ptr [[GEP_2]], align 229; CHECK-NEXT: [[GEP_3:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 330; CHECK-NEXT: [[L_3:%.*]] = load i16, ptr [[GEP_3]], align 231; CHECK-NEXT: [[CMP_3:%.*]] = icmp ne i16 [[L_3]], 1638332; CHECK-NEXT: [[S_3:%.*]] = select i1 [[CMP_3]], i16 [[L_3]], i16 [[X]]33; CHECK-NEXT: store i16 [[S_3]], ptr [[GEP_3]], align 234; CHECK-NEXT: [[GEP_4:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 435; CHECK-NEXT: [[L_4:%.*]] = load i16, ptr [[GEP_4]], align 236; CHECK-NEXT: [[CMP_4:%.*]] = icmp eq i16 [[L_4]], 1638337; CHECK-NEXT: [[S_4:%.*]] = select i1 [[CMP_4]], i16 [[L_4]], i16 [[X]]38; CHECK-NEXT: store i16 [[S_4]], ptr [[GEP_4]], align 239; CHECK-NEXT: [[GEP_5:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 540; CHECK-NEXT: [[L_5:%.*]] = load i16, ptr [[GEP_5]], align 241; CHECK-NEXT: [[CMP_5:%.*]] = icmp ule i16 [[L_5]], 1638342; CHECK-NEXT: [[S_5:%.*]] = select i1 [[CMP_5]], i16 [[L_5]], i16 [[X]]43; CHECK-NEXT: store i16 [[S_5]], ptr [[GEP_5]], align 244; CHECK-NEXT: [[GEP_6:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 645; CHECK-NEXT: [[L_6:%.*]] = load i16, ptr [[GEP_6]], align 246; CHECK-NEXT: [[CMP_6:%.*]] = icmp ult i16 [[L_6]], 1638347; CHECK-NEXT: [[S_6:%.*]] = select i1 [[CMP_6]], i16 [[L_6]], i16 [[X]]48; CHECK-NEXT: store i16 [[S_6]], ptr [[GEP_6]], align 249; CHECK-NEXT: [[GEP_7:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 750; CHECK-NEXT: [[L_7:%.*]] = load i16, ptr [[GEP_7]], align 251; CHECK-NEXT: [[CMP_7:%.*]] = icmp ult i16 [[L_7]], 1638352; CHECK-NEXT: [[S_7:%.*]] = select i1 [[CMP_7]], i16 [[L_7]], i16 [[X]]53; CHECK-NEXT: store i16 [[S_7]], ptr [[GEP_7]], align 254; CHECK-NEXT: ret void55;56entry:57 %l.0 = load i16, ptr %ptr58 %cmp.0 = icmp ult i16 %l.0, 1638359 %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x60 store i16 %s.0, ptr %ptr, align 261 62 %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 163 %l.1 = load i16, ptr %gep.164 %cmp.1 = icmp sgt i16 %l.1, 1638365 %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x66 store i16 %s.1, ptr %gep.1, align 267 68 %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 269 %l.2 = load i16, ptr %gep.270 %cmp.2 = icmp eq i16 %l.2, 1638371 %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x72 store i16 %s.2, ptr %gep.2, align 273 74 %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 375 %l.3 = load i16, ptr %gep.376 %cmp.3 = icmp ne i16 %l.3, 1638377 %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x78 store i16 %s.3, ptr %gep.3, align 279 80 %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 481 %l.4 = load i16, ptr %gep.482 %cmp.4 = icmp eq i16 %l.4, 1638383 %s.4 = select i1 %cmp.4, i16 %l.4, i16 %x84 store i16 %s.4, ptr %gep.4, align 285 86 %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 587 %l.5 = load i16, ptr %gep.588 %cmp.5 = icmp ule i16 %l.5, 1638389 %s.5 = select i1 %cmp.5, i16 %l.5, i16 %x90 store i16 %s.5, ptr %gep.5, align 291 92 %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 693 %l.6 = load i16, ptr %gep.694 %cmp.6 = icmp ult i16 %l.6, 1638395 %s.6 = select i1 %cmp.6, i16 %l.6, i16 %x96 store i16 %s.6, ptr %gep.6, align 297 98 %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 799 %l.7 = load i16, ptr %gep.7100 %cmp.7 = icmp ult i16 %l.7, 16383101 %s.7 = select i1 %cmp.7, i16 %l.7, i16 %x102 store i16 %s.7, ptr %gep.7, align 2103 ret void104}105 106define void @select_uniform_ugt_7xi8(ptr %ptr, i8 %x) {107; CHECK-LABEL: @select_uniform_ugt_7xi8(108; CHECK-NEXT: entry:109; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i8>, ptr [[PTR:%.*]], align 1110; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <4 x i8> [[TMP0]], splat (i8 -1)111; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i8> poison, i8 [[X:%.*]], i32 0112; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <4 x i32> zeroinitializer113; CHECK-NEXT: [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i8> [[TMP0]], <4 x i8> [[TMP3]]114; CHECK-NEXT: store <4 x i8> [[TMP4]], ptr [[PTR]], align 2115; CHECK-NEXT: [[GEP_4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 4116; CHECK-NEXT: [[L_4:%.*]] = load i8, ptr [[GEP_4]], align 1117; CHECK-NEXT: [[CMP_4:%.*]] = icmp ugt i8 [[L_4]], -1118; CHECK-NEXT: [[S_4:%.*]] = select i1 [[CMP_4]], i8 [[L_4]], i8 [[X]]119; CHECK-NEXT: store i8 [[S_4]], ptr [[GEP_4]], align 2120; CHECK-NEXT: [[GEP_5:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 5121; CHECK-NEXT: [[L_5:%.*]] = load i8, ptr [[GEP_5]], align 1122; CHECK-NEXT: [[CMP_5:%.*]] = icmp ugt i8 [[L_5]], -1123; CHECK-NEXT: [[S_5:%.*]] = select i1 [[CMP_5]], i8 [[L_5]], i8 [[X]]124; CHECK-NEXT: store i8 [[S_5]], ptr [[GEP_5]], align 2125; CHECK-NEXT: [[GEP_6:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 6126; CHECK-NEXT: [[L_6:%.*]] = load i8, ptr [[GEP_6]], align 1127; CHECK-NEXT: [[CMP_6:%.*]] = icmp ugt i8 [[L_6]], -1128; CHECK-NEXT: [[S_6:%.*]] = select i1 [[CMP_6]], i8 [[L_6]], i8 [[X]]129; CHECK-NEXT: store i8 [[S_6]], ptr [[GEP_6]], align 2130; CHECK-NEXT: ret void131;132entry:133 %l.0 = load i8, ptr %ptr134 %cmp.0 = icmp ugt i8 %l.0, 16383135 %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x136 store i8 %s.0, ptr %ptr, align 2137 138 %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1139 %l.1 = load i8, ptr %gep.1140 %cmp.1 = icmp ugt i8 %l.1, 16383141 %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x142 store i8 %s.1, ptr %gep.1, align 2143 144 %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2145 %l.2 = load i8, ptr %gep.2146 %cmp.2 = icmp ugt i8 %l.2, 16383147 %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x148 store i8 %s.2, ptr %gep.2, align 2149 150 %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3151 %l.3 = load i8, ptr %gep.3152 %cmp.3 = icmp ugt i8 %l.3, 16383153 %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x154 store i8 %s.3, ptr %gep.3, align 2155 156 %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4157 %l.4 = load i8, ptr %gep.4158 %cmp.4 = icmp ugt i8 %l.4, 16383159 %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x160 store i8 %s.4, ptr %gep.4, align 2161 162 %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5163 %l.5 = load i8, ptr %gep.5164 %cmp.5 = icmp ugt i8 %l.5, 16383165 %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x166 store i8 %s.5, ptr %gep.5, align 2167 168 %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6169 %l.6 = load i8, ptr %gep.6170 %cmp.6 = icmp ugt i8 %l.6, 16383171 %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x172 store i8 %s.6, ptr %gep.6, align 2173 174 ret void175}176 177 178; Positive tests.179 180define void @select_uniform_ugt_8xi8(ptr %ptr, i8 %x) {181; CHECK-LABEL: @select_uniform_ugt_8xi8(182; CHECK-NEXT: entry:183; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[PTR:%.*]], align 1184; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <8 x i8> [[TMP0]], splat (i8 -1)185; CHECK-NEXT: [[TMP2:%.*]] = insertelement <8 x i8> poison, i8 [[X:%.*]], i32 0186; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <8 x i32> zeroinitializer187; CHECK-NEXT: [[TMP4:%.*]] = select <8 x i1> [[TMP1]], <8 x i8> [[TMP0]], <8 x i8> [[TMP3]]188; CHECK-NEXT: store <8 x i8> [[TMP4]], ptr [[PTR]], align 2189; CHECK-NEXT: ret void190;191entry:192 %l.0 = load i8, ptr %ptr193 %cmp.0 = icmp ugt i8 %l.0, 16383194 %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x195 store i8 %s.0, ptr %ptr, align 2196 197 %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1198 %l.1 = load i8, ptr %gep.1199 %cmp.1 = icmp ugt i8 %l.1, 16383200 %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x201 store i8 %s.1, ptr %gep.1, align 2202 203 %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2204 %l.2 = load i8, ptr %gep.2205 %cmp.2 = icmp ugt i8 %l.2, 16383206 %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x207 store i8 %s.2, ptr %gep.2, align 2208 209 %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3210 %l.3 = load i8, ptr %gep.3211 %cmp.3 = icmp ugt i8 %l.3, 16383212 %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x213 store i8 %s.3, ptr %gep.3, align 2214 215 %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4216 %l.4 = load i8, ptr %gep.4217 %cmp.4 = icmp ugt i8 %l.4, 16383218 %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x219 store i8 %s.4, ptr %gep.4, align 2220 221 %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5222 %l.5 = load i8, ptr %gep.5223 %cmp.5 = icmp ugt i8 %l.5, 16383224 %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x225 store i8 %s.5, ptr %gep.5, align 2226 227 %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6228 %l.6 = load i8, ptr %gep.6229 %cmp.6 = icmp ugt i8 %l.6, 16383230 %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x231 store i8 %s.6, ptr %gep.6, align 2232 233 %gep.7 = getelementptr inbounds i8, ptr %ptr, i8 7234 %l.7 = load i8, ptr %gep.7235 %cmp.7 = icmp ugt i8 %l.7, 16383236 %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x237 store i8 %s.7, ptr %gep.7, align 2238 ret void239}240 241define void @select_uniform_ugt_16xi8(ptr %ptr, i8 %x) {242; CHECK-LABEL: @select_uniform_ugt_16xi8(243; CHECK-NEXT: entry:244; CHECK-NEXT: [[GEP_8:%.*]] = getelementptr inbounds i8, ptr [[PTR:%.*]], i8 8245; CHECK-NEXT: [[L_8:%.*]] = load i8, ptr [[GEP_8]], align 1246; CHECK-NEXT: [[CMP_8:%.*]] = icmp ugt i8 [[L_8]], -1247; CHECK-NEXT: [[GEP_9:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 9248; CHECK-NEXT: [[GEP_11:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 11249; CHECK-NEXT: [[L_11:%.*]] = load i8, ptr [[GEP_11]], align 1250; CHECK-NEXT: [[GEP_12:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 12251; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[PTR]], align 1252; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[PTR]], align 1253; CHECK-NEXT: [[S_8:%.*]] = select i1 [[CMP_8]], i8 [[TMP1]], i8 [[X:%.*]]254; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i8>, ptr [[GEP_9]], align 1255; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i8>, ptr [[GEP_12]], align 1256; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i8> [[TMP0]], <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>257; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>258; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>259; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <8 x i8> [[TMP0]], <8 x i8> [[TMP4]], <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 8, i32 9, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>260; CHECK-NEXT: [[TMP6:%.*]] = insertelement <16 x i8> [[TMP5]], i8 [[L_11]], i32 11261; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <16 x i8> [[TMP6]], <16 x i8> [[TMP7]], <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>262; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <4 x i8> [[TMP3]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>263; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i8> [[TMP15]], <16 x i8> [[TMP10]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>264; CHECK-NEXT: [[TMP9:%.*]] = icmp ugt <16 x i8> [[TMP8]], splat (i8 -1)265; CHECK-NEXT: [[TMP12:%.*]] = insertelement <16 x i8> poison, i8 [[X]], i32 0266; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <16 x i8> [[TMP12]], <16 x i8> poison, <16 x i32> zeroinitializer267; CHECK-NEXT: [[TMP14:%.*]] = select <16 x i1> [[TMP9]], <16 x i8> [[TMP8]], <16 x i8> [[TMP13]]268; CHECK-NEXT: store <16 x i8> [[TMP14]], ptr [[PTR]], align 2269; CHECK-NEXT: ret void270;271entry:272 %l.0 = load i8, ptr %ptr273 %cmp.0 = icmp ugt i8 %l.0, 16383274 %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x275 store i8 %s.0, ptr %ptr, align 2276 277 %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1278 %l.1 = load i8, ptr %gep.1279 %cmp.1 = icmp ugt i8 %l.1, 16383280 %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x281 store i8 %s.1, ptr %gep.1, align 2282 283 %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2284 %l.2 = load i8, ptr %gep.2285 %cmp.2 = icmp ugt i8 %l.2, 16383286 %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x287 store i8 %s.2, ptr %gep.2, align 2288 289 %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3290 %l.3 = load i8, ptr %gep.3291 %cmp.3 = icmp ugt i8 %l.3, 16383292 %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x293 store i8 %s.3, ptr %gep.3, align 2294 295 %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4296 %l.4 = load i8, ptr %gep.4297 %cmp.4 = icmp ugt i8 %l.4, 16383298 %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x299 store i8 %s.4, ptr %gep.4, align 2300 301 %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5302 %l.5 = load i8, ptr %gep.5303 %cmp.5 = icmp ugt i8 %l.5, 16383304 %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x305 store i8 %s.5, ptr %gep.5, align 2306 307 %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6308 %l.6 = load i8, ptr %gep.6309 %cmp.6 = icmp ugt i8 %l.6, 16383310 %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x311 store i8 %s.6, ptr %gep.6, align 2312 313 %gep.7 = getelementptr inbounds i8, ptr %ptr, i8 7314 %l.7 = load i8, ptr %gep.7315 %cmp.7 = icmp ugt i8 %l.7, 16383316 %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x317 store i8 %s.7, ptr %gep.7, align 2318 319 %gep.8 = getelementptr inbounds i8, ptr %ptr, i8 8320 %l.8 = load i8, ptr %gep.8321 %cmp.8 = icmp ugt i8 %l.8, 16383322 %s.8 = select i1 %cmp.8, i8 %l.0, i8 %x323 store i8 %s.0, ptr %gep.8, align 2324 325 %gep.9 = getelementptr inbounds i8, ptr %ptr, i8 9326 %l.9 = load i8, ptr %gep.9327 %cmp.9 = icmp ugt i8 %l.9, 16383328 %s.9 = select i1 %cmp.9, i8 %l.9, i8 %x329 store i8 %s.9, ptr %gep.9, align 2330 331 %gep.10 = getelementptr inbounds i8, ptr %ptr, i8 10332 %l.10 = load i8, ptr %gep.10333 %cmp.10 = icmp ugt i8 %l.10, 16383334 %s.10 = select i1 %cmp.10, i8 %l.10, i8 %x335 store i8 %s.10, ptr %gep.10, align 2336 337 %gep.11 = getelementptr inbounds i8, ptr %ptr, i8 11338 %l.11 = load i8, ptr %gep.11339 %cmp.11 = icmp ugt i8 %l.11, 16383340 %s.11 = select i1 %cmp.11, i8 %l.11, i8 %x341 store i8 %s.11, ptr %gep.11, align 2342 343 %gep.12 = getelementptr inbounds i8, ptr %ptr, i8 12344 %l.12 = load i8, ptr %gep.12345 %cmp.12 = icmp ugt i8 %l.12, 16383346 %s.12 = select i1 %cmp.12, i8 %l.12, i8 %x347 store i8 %s.12, ptr %gep.12, align 2348 349 %gep.13 = getelementptr inbounds i8, ptr %ptr, i8 13350 %l.13 = load i8, ptr %gep.13351 %cmp.13 = icmp ugt i8 %l.13, 16383352 %s.13 = select i1 %cmp.13, i8 %l.13, i8 %x353 store i8 %s.13, ptr %gep.13, align 2354 355 %gep.14 = getelementptr inbounds i8, ptr %ptr, i8 14356 %l.14 = load i8, ptr %gep.14357 %cmp.14 = icmp ugt i8 %l.14, 16383358 %s.14 = select i1 %cmp.14, i8 %l.14, i8 %x359 store i8 %s.14, ptr %gep.14, align 2360 361 %gep.15 = getelementptr inbounds i8, ptr %ptr, i8 15362 %l.15 = load i8, ptr %gep.15363 %cmp.15 = icmp ugt i8 %l.15, 16383364 %s.15 = select i1 %cmp.15, i8 %l.15, i8 %x365 store i8 %s.15, ptr %gep.15, align 2366 367 ret void368}369 370 371define void @select_uniform_ugt_4xi16(ptr %ptr, i16 %x) {372; CHECK-LABEL: @select_uniform_ugt_4xi16(373; CHECK-NEXT: entry:374; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i16>, ptr [[PTR:%.*]], align 2375; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <4 x i16> [[TMP0]], splat (i16 16383)376; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i16> poison, i16 [[X:%.*]], i32 0377; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i16> [[TMP2]], <4 x i16> poison, <4 x i32> zeroinitializer378; CHECK-NEXT: [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i16> [[TMP0]], <4 x i16> [[TMP3]]379; CHECK-NEXT: store <4 x i16> [[TMP4]], ptr [[PTR]], align 2380; CHECK-NEXT: ret void381;382entry:383 %l.0 = load i16, ptr %ptr384 %cmp.0 = icmp ugt i16 %l.0, 16383385 %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x386 store i16 %s.0, ptr %ptr, align 2387 388 %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1389 %l.1 = load i16, ptr %gep.1390 %cmp.1 = icmp ugt i16 %l.1, 16383391 %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x392 store i16 %s.1, ptr %gep.1, align 2393 394 %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2395 %l.2 = load i16, ptr %gep.2396 %cmp.2 = icmp ugt i16 %l.2, 16383397 %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x398 store i16 %s.2, ptr %gep.2, align 2399 400 %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3401 %l.3 = load i16, ptr %gep.3402 %cmp.3 = icmp ugt i16 %l.3, 16383403 %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x404 store i16 %s.3, ptr %gep.3, align 2405 406 ret void407}408 409define void @select_uniform_ult_8xi16(ptr %ptr, i16 %x) {410; CHECK-LABEL: @select_uniform_ult_8xi16(411; CHECK-NEXT: entry:412; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2413; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <8 x i16> [[TMP0]], splat (i16 16383)414; CHECK-NEXT: [[TMP2:%.*]] = insertelement <8 x i16> poison, i16 [[X:%.*]], i32 0415; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i16> [[TMP2]], <8 x i16> poison, <8 x i32> zeroinitializer416; CHECK-NEXT: [[TMP4:%.*]] = select <8 x i1> [[TMP1]], <8 x i16> [[TMP0]], <8 x i16> [[TMP3]]417; CHECK-NEXT: store <8 x i16> [[TMP4]], ptr [[PTR]], align 2418; CHECK-NEXT: ret void419;420entry:421 %l.0 = load i16, ptr %ptr422 %cmp.0 = icmp ult i16 %l.0, 16383423 %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x424 store i16 %s.0, ptr %ptr, align 2425 426 %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1427 %l.1 = load i16, ptr %gep.1428 %cmp.1 = icmp ult i16 %l.1, 16383429 %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x430 store i16 %s.1, ptr %gep.1, align 2431 432 %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2433 %l.2 = load i16, ptr %gep.2434 %cmp.2 = icmp ult i16 %l.2, 16383435 %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x436 store i16 %s.2, ptr %gep.2, align 2437 438 %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3439 %l.3 = load i16, ptr %gep.3440 %cmp.3 = icmp ult i16 %l.3, 16383441 %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x442 store i16 %s.3, ptr %gep.3, align 2443 444 %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4445 %l.4 = load i16, ptr %gep.4446 %cmp.4 = icmp ult i16 %l.4, 16383447 %s.4 = select i1 %cmp.4, i16 %l.4, i16 %x448 store i16 %s.4, ptr %gep.4, align 2449 450 %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5451 %l.5 = load i16, ptr %gep.5452 %cmp.5 = icmp ult i16 %l.5, 16383453 %s.5 = select i1 %cmp.5, i16 %l.5, i16 %x454 store i16 %s.5, ptr %gep.5, align 2455 456 %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6457 %l.6 = load i16, ptr %gep.6458 %cmp.6 = icmp ult i16 %l.6, 16383459 %s.6 = select i1 %cmp.6, i16 %l.6, i16 %x460 store i16 %s.6, ptr %gep.6, align 2461 462 %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7463 %l.7 = load i16, ptr %gep.7464 %cmp.7 = icmp ult i16 %l.7, 16383465 %s.7 = select i1 %cmp.7, i16 %l.7, i16 %x466 store i16 %s.7, ptr %gep.7, align 2467 ret void468}469 470define void @select_uniform_eq_2xi32(ptr %ptr, i32 %x) {471; CHECK-LABEL: @select_uniform_eq_2xi32(472; CHECK-NEXT: entry:473; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr [[PTR:%.*]], align 4474; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <2 x i32> [[TMP0]], splat (i32 16383)475; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i32 0476; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x i32> [[TMP2]], <2 x i32> poison, <2 x i32> zeroinitializer477; CHECK-NEXT: [[TMP4:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[TMP0]], <2 x i32> [[TMP3]]478; CHECK-NEXT: store <2 x i32> [[TMP4]], ptr [[PTR]], align 2479; CHECK-NEXT: ret void480;481entry:482 %l.0 = load i32, ptr %ptr483 %cmp.0 = icmp eq i32 %l.0, 16383484 %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x485 store i32 %s.0, ptr %ptr, align 2486 487 %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1488 %l.1 = load i32, ptr %gep.1489 %cmp.1 = icmp eq i32 %l.1, 16383490 %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x491 store i32 %s.1, ptr %gep.1, align 2492 493 ret void494}495 496define void @select_uniform_eq_4xi32(ptr %ptr, i32 %x) {497; CHECK-LABEL: @select_uniform_eq_4xi32(498; CHECK-NEXT: entry:499; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4500; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <4 x i32> [[TMP0]], splat (i32 16383)501; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[X:%.*]], i32 0502; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <4 x i32> zeroinitializer503; CHECK-NEXT: [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> [[TMP0]], <4 x i32> [[TMP3]]504; CHECK-NEXT: store <4 x i32> [[TMP4]], ptr [[PTR]], align 2505; CHECK-NEXT: ret void506;507entry:508 %l.0 = load i32, ptr %ptr509 %cmp.0 = icmp eq i32 %l.0, 16383510 %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x511 store i32 %s.0, ptr %ptr, align 2512 513 %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1514 %l.1 = load i32, ptr %gep.1515 %cmp.1 = icmp eq i32 %l.1, 16383516 %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x517 store i32 %s.1, ptr %gep.1, align 2518 519 %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2520 %l.2 = load i32, ptr %gep.2521 %cmp.2 = icmp eq i32 %l.2, 16383522 %s.2 = select i1 %cmp.2, i32 %l.2, i32 %x523 store i32 %s.2, ptr %gep.2, align 2524 525 %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3526 %l.3 = load i32, ptr %gep.3527 %cmp.3 = icmp eq i32 %l.3, 16383528 %s.3 = select i1 %cmp.3, i32 %l.3, i32 %x529 store i32 %s.3, ptr %gep.3, align 2530 ret void531}532 533define void @select_uniform_ne_2xi64(ptr %ptr, i64 %x) {534; CHECK-LABEL: @select_uniform_ne_2xi64(535; CHECK-NEXT: entry:536; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8537; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i64> [[TMP0]], splat (i64 16383)538; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[X:%.*]], i32 0539; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x i64> [[TMP2]], <2 x i64> poison, <2 x i32> zeroinitializer540; CHECK-NEXT: [[TMP4:%.*]] = select <2 x i1> [[TMP1]], <2 x i64> [[TMP0]], <2 x i64> [[TMP3]]541; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[PTR]], align 2542; CHECK-NEXT: ret void543;544entry:545 %l.0 = load i64, ptr %ptr546 %cmp.0 = icmp ne i64 %l.0, 16383547 %s.0 = select i1 %cmp.0, i64 %l.0, i64 %x548 store i64 %s.0, ptr %ptr, align 2549 550 %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1551 %l.1 = load i64, ptr %gep.1552 %cmp.1 = icmp ne i64 %l.1, 16383553 %s.1 = select i1 %cmp.1, i64 %l.1, i64 %x554 store i64 %s.1, ptr %gep.1, align 2555 556 ret void557}558