1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=slp-vectorizer -S %s | FileCheck %s 3; RUN: opt -aa-pipeline=basic-aa -passes='slp-vectorizer' -S %s | FileCheck %s 4 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 vector 11; 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 2 16; CHECK-NEXT: [[CMP_0:%.*]] = icmp ult i16 [[L_0]], 16383 17; CHECK-NEXT: [[S_0:%.*]] = select i1 [[CMP_0]], i16 [[L_0]], i16 [[X:%.*]] 18; CHECK-NEXT: store i16 [[S_0]], ptr [[PTR]], align 2 19; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 1 20; CHECK-NEXT: [[L_1:%.*]] = load i16, ptr [[GEP_1]], align 2 21; CHECK-NEXT: [[CMP_1:%.*]] = icmp sgt i16 [[L_1]], 16383 22; CHECK-NEXT: [[S_1:%.*]] = select i1 [[CMP_1]], i16 [[L_1]], i16 [[X]] 23; CHECK-NEXT: store i16 [[S_1]], ptr [[GEP_1]], align 2 24; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 2 25; CHECK-NEXT: [[L_2:%.*]] = load i16, ptr [[GEP_2]], align 2 26; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i16 [[L_2]], 16383 27; CHECK-NEXT: [[S_2:%.*]] = select i1 [[CMP_2]], i16 [[L_2]], i16 [[X]] 28; CHECK-NEXT: store i16 [[S_2]], ptr [[GEP_2]], align 2 29; CHECK-NEXT: [[GEP_3:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 3 30; CHECK-NEXT: [[L_3:%.*]] = load i16, ptr [[GEP_3]], align 2 31; CHECK-NEXT: [[CMP_3:%.*]] = icmp ne i16 [[L_3]], 16383 32; CHECK-NEXT: [[S_3:%.*]] = select i1 [[CMP_3]], i16 [[L_3]], i16 [[X]] 33; CHECK-NEXT: store i16 [[S_3]], ptr [[GEP_3]], align 2 34; CHECK-NEXT: [[GEP_4:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 4 35; CHECK-NEXT: [[L_4:%.*]] = load i16, ptr [[GEP_4]], align 2 36; CHECK-NEXT: [[CMP_4:%.*]] = icmp eq i16 [[L_4]], 16383 37; CHECK-NEXT: [[S_4:%.*]] = select i1 [[CMP_4]], i16 [[L_4]], i16 [[X]] 38; CHECK-NEXT: store i16 [[S_4]], ptr [[GEP_4]], align 2 39; CHECK-NEXT: [[GEP_5:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 5 40; CHECK-NEXT: [[L_5:%.*]] = load i16, ptr [[GEP_5]], align 2 41; CHECK-NEXT: [[CMP_5:%.*]] = icmp ule i16 [[L_5]], 16383 42; CHECK-NEXT: [[S_5:%.*]] = select i1 [[CMP_5]], i16 [[L_5]], i16 [[X]] 43; CHECK-NEXT: store i16 [[S_5]], ptr [[GEP_5]], align 2 44; CHECK-NEXT: [[GEP_6:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 6 45; CHECK-NEXT: [[L_6:%.*]] = load i16, ptr [[GEP_6]], align 2 46; CHECK-NEXT: [[CMP_6:%.*]] = icmp ult i16 [[L_6]], 16383 47; CHECK-NEXT: [[S_6:%.*]] = select i1 [[CMP_6]], i16 [[L_6]], i16 [[X]] 48; CHECK-NEXT: store i16 [[S_6]], ptr [[GEP_6]], align 2 49; CHECK-NEXT: [[GEP_7:%.*]] = getelementptr inbounds i16, ptr [[PTR]], i16 7 50; CHECK-NEXT: [[L_7:%.*]] = load i16, ptr [[GEP_7]], align 2 51; CHECK-NEXT: [[CMP_7:%.*]] = icmp ult i16 [[L_7]], 16383 52; CHECK-NEXT: [[S_7:%.*]] = select i1 [[CMP_7]], i16 [[L_7]], i16 [[X]] 53; CHECK-NEXT: store i16 [[S_7]], ptr [[GEP_7]], align 2 54; CHECK-NEXT: ret void 55; 56entry: 57 %l.0 = load i16, ptr %ptr 58 %cmp.0 = icmp ult i16 %l.0, 16383 59 %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x 60 store i16 %s.0, ptr %ptr, align 2 61 62 %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1 63 %l.1 = load i16, ptr %gep.1 64 %cmp.1 = icmp sgt i16 %l.1, 16383 65 %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x 66 store i16 %s.1, ptr %gep.1, align 2 67 68 %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2 69 %l.2 = load i16, ptr %gep.2 70 %cmp.2 = icmp eq i16 %l.2, 16383 71 %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x 72 store i16 %s.2, ptr %gep.2, align 2 73 74 %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3 75 %l.3 = load i16, ptr %gep.3 76 %cmp.3 = icmp ne i16 %l.3, 16383 77 %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x 78 store i16 %s.3, ptr %gep.3, align 2 79 80 %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4 81 %l.4 = load i16, ptr %gep.4 82 %cmp.4 = icmp eq i16 %l.4, 16383 83 %s.4 = select i1 %cmp.4, i16 %l.4, i16 %x 84 store i16 %s.4, ptr %gep.4, align 2 85 86 %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5 87 %l.5 = load i16, ptr %gep.5 88 %cmp.5 = icmp ule i16 %l.5, 16383 89 %s.5 = select i1 %cmp.5, i16 %l.5, i16 %x 90 store i16 %s.5, ptr %gep.5, align 2 91 92 %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6 93 %l.6 = load i16, ptr %gep.6 94 %cmp.6 = icmp ult i16 %l.6, 16383 95 %s.6 = select i1 %cmp.6, i16 %l.6, i16 %x 96 store i16 %s.6, ptr %gep.6, align 2 97 98 %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7 99 %l.7 = load i16, ptr %gep.7 100 %cmp.7 = icmp ult i16 %l.7, 16383 101 %s.7 = select i1 %cmp.7, i16 %l.7, i16 %x 102 store i16 %s.7, ptr %gep.7, align 2 103 ret void 104} 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 1 110; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <4 x i8> [[TMP0]], splat (i8 -1) 111; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i8> poison, i8 [[X:%.*]], i32 0 112; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <4 x i32> zeroinitializer 113; 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 2 115; CHECK-NEXT: [[GEP_4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 4 116; CHECK-NEXT: [[L_4:%.*]] = load i8, ptr [[GEP_4]], align 1 117; CHECK-NEXT: [[CMP_4:%.*]] = icmp ugt i8 [[L_4]], -1 118; CHECK-NEXT: [[S_4:%.*]] = select i1 [[CMP_4]], i8 [[L_4]], i8 [[X]] 119; CHECK-NEXT: store i8 [[S_4]], ptr [[GEP_4]], align 2 120; CHECK-NEXT: [[GEP_5:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 5 121; CHECK-NEXT: [[L_5:%.*]] = load i8, ptr [[GEP_5]], align 1 122; CHECK-NEXT: [[CMP_5:%.*]] = icmp ugt i8 [[L_5]], -1 123; CHECK-NEXT: [[S_5:%.*]] = select i1 [[CMP_5]], i8 [[L_5]], i8 [[X]] 124; CHECK-NEXT: store i8 [[S_5]], ptr [[GEP_5]], align 2 125; CHECK-NEXT: [[GEP_6:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 6 126; CHECK-NEXT: [[L_6:%.*]] = load i8, ptr [[GEP_6]], align 1 127; CHECK-NEXT: [[CMP_6:%.*]] = icmp ugt i8 [[L_6]], -1 128; CHECK-NEXT: [[S_6:%.*]] = select i1 [[CMP_6]], i8 [[L_6]], i8 [[X]] 129; CHECK-NEXT: store i8 [[S_6]], ptr [[GEP_6]], align 2 130; CHECK-NEXT: ret void 131; 132entry: 133 %l.0 = load i8, ptr %ptr 134 %cmp.0 = icmp ugt i8 %l.0, 16383 135 %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x 136 store i8 %s.0, ptr %ptr, align 2 137 138 %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1 139 %l.1 = load i8, ptr %gep.1 140 %cmp.1 = icmp ugt i8 %l.1, 16383 141 %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x 142 store i8 %s.1, ptr %gep.1, align 2 143 144 %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2 145 %l.2 = load i8, ptr %gep.2 146 %cmp.2 = icmp ugt i8 %l.2, 16383 147 %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x 148 store i8 %s.2, ptr %gep.2, align 2 149 150 %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3 151 %l.3 = load i8, ptr %gep.3 152 %cmp.3 = icmp ugt i8 %l.3, 16383 153 %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x 154 store i8 %s.3, ptr %gep.3, align 2 155 156 %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4 157 %l.4 = load i8, ptr %gep.4 158 %cmp.4 = icmp ugt i8 %l.4, 16383 159 %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x 160 store i8 %s.4, ptr %gep.4, align 2 161 162 %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5 163 %l.5 = load i8, ptr %gep.5 164 %cmp.5 = icmp ugt i8 %l.5, 16383 165 %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x 166 store i8 %s.5, ptr %gep.5, align 2 167 168 %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6 169 %l.6 = load i8, ptr %gep.6 170 %cmp.6 = icmp ugt i8 %l.6, 16383 171 %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x 172 store i8 %s.6, ptr %gep.6, align 2 173 174 ret void 175} 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 1 184; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <8 x i8> [[TMP0]], splat (i8 -1) 185; CHECK-NEXT: [[TMP2:%.*]] = insertelement <8 x i8> poison, i8 [[X:%.*]], i32 0 186; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <8 x i32> zeroinitializer 187; 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 2 189; CHECK-NEXT: ret void 190; 191entry: 192 %l.0 = load i8, ptr %ptr 193 %cmp.0 = icmp ugt i8 %l.0, 16383 194 %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x 195 store i8 %s.0, ptr %ptr, align 2 196 197 %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1 198 %l.1 = load i8, ptr %gep.1 199 %cmp.1 = icmp ugt i8 %l.1, 16383 200 %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x 201 store i8 %s.1, ptr %gep.1, align 2 202 203 %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2 204 %l.2 = load i8, ptr %gep.2 205 %cmp.2 = icmp ugt i8 %l.2, 16383 206 %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x 207 store i8 %s.2, ptr %gep.2, align 2 208 209 %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3 210 %l.3 = load i8, ptr %gep.3 211 %cmp.3 = icmp ugt i8 %l.3, 16383 212 %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x 213 store i8 %s.3, ptr %gep.3, align 2 214 215 %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4 216 %l.4 = load i8, ptr %gep.4 217 %cmp.4 = icmp ugt i8 %l.4, 16383 218 %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x 219 store i8 %s.4, ptr %gep.4, align 2 220 221 %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5 222 %l.5 = load i8, ptr %gep.5 223 %cmp.5 = icmp ugt i8 %l.5, 16383 224 %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x 225 store i8 %s.5, ptr %gep.5, align 2 226 227 %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6 228 %l.6 = load i8, ptr %gep.6 229 %cmp.6 = icmp ugt i8 %l.6, 16383 230 %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x 231 store i8 %s.6, ptr %gep.6, align 2 232 233 %gep.7 = getelementptr inbounds i8, ptr %ptr, i8 7 234 %l.7 = load i8, ptr %gep.7 235 %cmp.7 = icmp ugt i8 %l.7, 16383 236 %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x 237 store i8 %s.7, ptr %gep.7, align 2 238 ret void 239} 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 8 245; CHECK-NEXT: [[L_8:%.*]] = load i8, ptr [[GEP_8]], align 1 246; CHECK-NEXT: [[CMP_8:%.*]] = icmp ugt i8 [[L_8]], -1 247; CHECK-NEXT: [[GEP_9:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 9 248; CHECK-NEXT: [[GEP_11:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 11 249; CHECK-NEXT: [[L_11:%.*]] = load i8, ptr [[GEP_11]], align 1 250; CHECK-NEXT: [[GEP_12:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i8 12 251; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[PTR]], align 1 252; CHECK-NEXT: [[TMP1:%.*]] = extractelement <8 x i8> [[TMP0]], i32 0 253; CHECK-NEXT: [[S_8:%.*]] = select i1 [[CMP_8]], i8 [[TMP1]], i8 [[X:%.*]] 254; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i8>, ptr [[GEP_9]], align 1 255; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i8>, ptr [[GEP_12]], align 1 256; 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> 257; 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> 258; CHECK-NEXT: [[TMP6:%.*]] = insertelement <16 x i8> [[TMP5]], i8 [[L_11]], i32 11 259; CHECK-NEXT: [[TMP7:%.*]] = call <16 x i8> @llvm.vector.insert.v16i8.v8i8(<16 x i8> [[TMP6]], <8 x i8> [[TMP0]], i64 0) 260; CHECK-NEXT: [[TMP8:%.*]] = call <16 x i8> @llvm.vector.insert.v16i8.v4i8(<16 x i8> [[TMP7]], <4 x i8> [[TMP3]], i64 12) 261; CHECK-NEXT: [[TMP9:%.*]] = icmp ugt <16 x i8> [[TMP8]], splat (i8 -1) 262; CHECK-NEXT: [[TMP12:%.*]] = insertelement <16 x i8> poison, i8 [[X]], i32 0 263; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <16 x i8> [[TMP12]], <16 x i8> poison, <16 x i32> zeroinitializer 264; CHECK-NEXT: [[TMP14:%.*]] = select <16 x i1> [[TMP9]], <16 x i8> [[TMP8]], <16 x i8> [[TMP13]] 265; CHECK-NEXT: store <16 x i8> [[TMP14]], ptr [[PTR]], align 2 266; CHECK-NEXT: ret void 267; 268entry: 269 %l.0 = load i8, ptr %ptr 270 %cmp.0 = icmp ugt i8 %l.0, 16383 271 %s.0 = select i1 %cmp.0, i8 %l.0, i8 %x 272 store i8 %s.0, ptr %ptr, align 2 273 274 %gep.1 = getelementptr inbounds i8, ptr %ptr, i8 1 275 %l.1 = load i8, ptr %gep.1 276 %cmp.1 = icmp ugt i8 %l.1, 16383 277 %s.1 = select i1 %cmp.1, i8 %l.1, i8 %x 278 store i8 %s.1, ptr %gep.1, align 2 279 280 %gep.2 = getelementptr inbounds i8, ptr %ptr, i8 2 281 %l.2 = load i8, ptr %gep.2 282 %cmp.2 = icmp ugt i8 %l.2, 16383 283 %s.2 = select i1 %cmp.2, i8 %l.2, i8 %x 284 store i8 %s.2, ptr %gep.2, align 2 285 286 %gep.3 = getelementptr inbounds i8, ptr %ptr, i8 3 287 %l.3 = load i8, ptr %gep.3 288 %cmp.3 = icmp ugt i8 %l.3, 16383 289 %s.3 = select i1 %cmp.3, i8 %l.3, i8 %x 290 store i8 %s.3, ptr %gep.3, align 2 291 292 %gep.4 = getelementptr inbounds i8, ptr %ptr, i8 4 293 %l.4 = load i8, ptr %gep.4 294 %cmp.4 = icmp ugt i8 %l.4, 16383 295 %s.4 = select i1 %cmp.4, i8 %l.4, i8 %x 296 store i8 %s.4, ptr %gep.4, align 2 297 298 %gep.5 = getelementptr inbounds i8, ptr %ptr, i8 5 299 %l.5 = load i8, ptr %gep.5 300 %cmp.5 = icmp ugt i8 %l.5, 16383 301 %s.5 = select i1 %cmp.5, i8 %l.5, i8 %x 302 store i8 %s.5, ptr %gep.5, align 2 303 304 %gep.6 = getelementptr inbounds i8, ptr %ptr, i8 6 305 %l.6 = load i8, ptr %gep.6 306 %cmp.6 = icmp ugt i8 %l.6, 16383 307 %s.6 = select i1 %cmp.6, i8 %l.6, i8 %x 308 store i8 %s.6, ptr %gep.6, align 2 309 310 %gep.7 = getelementptr inbounds i8, ptr %ptr, i8 7 311 %l.7 = load i8, ptr %gep.7 312 %cmp.7 = icmp ugt i8 %l.7, 16383 313 %s.7 = select i1 %cmp.7, i8 %l.7, i8 %x 314 store i8 %s.7, ptr %gep.7, align 2 315 316 %gep.8 = getelementptr inbounds i8, ptr %ptr, i8 8 317 %l.8 = load i8, ptr %gep.8 318 %cmp.8 = icmp ugt i8 %l.8, 16383 319 %s.8 = select i1 %cmp.8, i8 %l.0, i8 %x 320 store i8 %s.0, ptr %gep.8, align 2 321 322 %gep.9 = getelementptr inbounds i8, ptr %ptr, i8 9 323 %l.9 = load i8, ptr %gep.9 324 %cmp.9 = icmp ugt i8 %l.9, 16383 325 %s.9 = select i1 %cmp.9, i8 %l.9, i8 %x 326 store i8 %s.9, ptr %gep.9, align 2 327 328 %gep.10 = getelementptr inbounds i8, ptr %ptr, i8 10 329 %l.10 = load i8, ptr %gep.10 330 %cmp.10 = icmp ugt i8 %l.10, 16383 331 %s.10 = select i1 %cmp.10, i8 %l.10, i8 %x 332 store i8 %s.10, ptr %gep.10, align 2 333 334 %gep.11 = getelementptr inbounds i8, ptr %ptr, i8 11 335 %l.11 = load i8, ptr %gep.11 336 %cmp.11 = icmp ugt i8 %l.11, 16383 337 %s.11 = select i1 %cmp.11, i8 %l.11, i8 %x 338 store i8 %s.11, ptr %gep.11, align 2 339 340 %gep.12 = getelementptr inbounds i8, ptr %ptr, i8 12 341 %l.12 = load i8, ptr %gep.12 342 %cmp.12 = icmp ugt i8 %l.12, 16383 343 %s.12 = select i1 %cmp.12, i8 %l.12, i8 %x 344 store i8 %s.12, ptr %gep.12, align 2 345 346 %gep.13 = getelementptr inbounds i8, ptr %ptr, i8 13 347 %l.13 = load i8, ptr %gep.13 348 %cmp.13 = icmp ugt i8 %l.13, 16383 349 %s.13 = select i1 %cmp.13, i8 %l.13, i8 %x 350 store i8 %s.13, ptr %gep.13, align 2 351 352 %gep.14 = getelementptr inbounds i8, ptr %ptr, i8 14 353 %l.14 = load i8, ptr %gep.14 354 %cmp.14 = icmp ugt i8 %l.14, 16383 355 %s.14 = select i1 %cmp.14, i8 %l.14, i8 %x 356 store i8 %s.14, ptr %gep.14, align 2 357 358 %gep.15 = getelementptr inbounds i8, ptr %ptr, i8 15 359 %l.15 = load i8, ptr %gep.15 360 %cmp.15 = icmp ugt i8 %l.15, 16383 361 %s.15 = select i1 %cmp.15, i8 %l.15, i8 %x 362 store i8 %s.15, ptr %gep.15, align 2 363 364 ret void 365} 366 367 368define void @select_uniform_ugt_4xi16(ptr %ptr, i16 %x) { 369; CHECK-LABEL: @select_uniform_ugt_4xi16( 370; CHECK-NEXT: entry: 371; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i16>, ptr [[PTR:%.*]], align 2 372; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <4 x i16> [[TMP0]], splat (i16 16383) 373; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i16> poison, i16 [[X:%.*]], i32 0 374; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i16> [[TMP2]], <4 x i16> poison, <4 x i32> zeroinitializer 375; CHECK-NEXT: [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i16> [[TMP0]], <4 x i16> [[TMP3]] 376; CHECK-NEXT: store <4 x i16> [[TMP4]], ptr [[PTR]], align 2 377; CHECK-NEXT: ret void 378; 379entry: 380 %l.0 = load i16, ptr %ptr 381 %cmp.0 = icmp ugt i16 %l.0, 16383 382 %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x 383 store i16 %s.0, ptr %ptr, align 2 384 385 %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1 386 %l.1 = load i16, ptr %gep.1 387 %cmp.1 = icmp ugt i16 %l.1, 16383 388 %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x 389 store i16 %s.1, ptr %gep.1, align 2 390 391 %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2 392 %l.2 = load i16, ptr %gep.2 393 %cmp.2 = icmp ugt i16 %l.2, 16383 394 %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x 395 store i16 %s.2, ptr %gep.2, align 2 396 397 %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3 398 %l.3 = load i16, ptr %gep.3 399 %cmp.3 = icmp ugt i16 %l.3, 16383 400 %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x 401 store i16 %s.3, ptr %gep.3, align 2 402 403 ret void 404} 405 406define void @select_uniform_ult_8xi16(ptr %ptr, i16 %x) { 407; CHECK-LABEL: @select_uniform_ult_8xi16( 408; CHECK-NEXT: entry: 409; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[PTR:%.*]], align 2 410; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <8 x i16> [[TMP0]], splat (i16 16383) 411; CHECK-NEXT: [[TMP2:%.*]] = insertelement <8 x i16> poison, i16 [[X:%.*]], i32 0 412; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i16> [[TMP2]], <8 x i16> poison, <8 x i32> zeroinitializer 413; CHECK-NEXT: [[TMP4:%.*]] = select <8 x i1> [[TMP1]], <8 x i16> [[TMP0]], <8 x i16> [[TMP3]] 414; CHECK-NEXT: store <8 x i16> [[TMP4]], ptr [[PTR]], align 2 415; CHECK-NEXT: ret void 416; 417entry: 418 %l.0 = load i16, ptr %ptr 419 %cmp.0 = icmp ult i16 %l.0, 16383 420 %s.0 = select i1 %cmp.0, i16 %l.0, i16 %x 421 store i16 %s.0, ptr %ptr, align 2 422 423 %gep.1 = getelementptr inbounds i16, ptr %ptr, i16 1 424 %l.1 = load i16, ptr %gep.1 425 %cmp.1 = icmp ult i16 %l.1, 16383 426 %s.1 = select i1 %cmp.1, i16 %l.1, i16 %x 427 store i16 %s.1, ptr %gep.1, align 2 428 429 %gep.2 = getelementptr inbounds i16, ptr %ptr, i16 2 430 %l.2 = load i16, ptr %gep.2 431 %cmp.2 = icmp ult i16 %l.2, 16383 432 %s.2 = select i1 %cmp.2, i16 %l.2, i16 %x 433 store i16 %s.2, ptr %gep.2, align 2 434 435 %gep.3 = getelementptr inbounds i16, ptr %ptr, i16 3 436 %l.3 = load i16, ptr %gep.3 437 %cmp.3 = icmp ult i16 %l.3, 16383 438 %s.3 = select i1 %cmp.3, i16 %l.3, i16 %x 439 store i16 %s.3, ptr %gep.3, align 2 440 441 %gep.4 = getelementptr inbounds i16, ptr %ptr, i16 4 442 %l.4 = load i16, ptr %gep.4 443 %cmp.4 = icmp ult i16 %l.4, 16383 444 %s.4 = select i1 %cmp.4, i16 %l.4, i16 %x 445 store i16 %s.4, ptr %gep.4, align 2 446 447 %gep.5 = getelementptr inbounds i16, ptr %ptr, i16 5 448 %l.5 = load i16, ptr %gep.5 449 %cmp.5 = icmp ult i16 %l.5, 16383 450 %s.5 = select i1 %cmp.5, i16 %l.5, i16 %x 451 store i16 %s.5, ptr %gep.5, align 2 452 453 %gep.6 = getelementptr inbounds i16, ptr %ptr, i16 6 454 %l.6 = load i16, ptr %gep.6 455 %cmp.6 = icmp ult i16 %l.6, 16383 456 %s.6 = select i1 %cmp.6, i16 %l.6, i16 %x 457 store i16 %s.6, ptr %gep.6, align 2 458 459 %gep.7 = getelementptr inbounds i16, ptr %ptr, i16 7 460 %l.7 = load i16, ptr %gep.7 461 %cmp.7 = icmp ult i16 %l.7, 16383 462 %s.7 = select i1 %cmp.7, i16 %l.7, i16 %x 463 store i16 %s.7, ptr %gep.7, align 2 464 ret void 465} 466 467define void @select_uniform_eq_2xi32(ptr %ptr, i32 %x) { 468; CHECK-LABEL: @select_uniform_eq_2xi32( 469; CHECK-NEXT: entry: 470; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr [[PTR:%.*]], align 4 471; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <2 x i32> [[TMP0]], splat (i32 16383) 472; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i32 0 473; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x i32> [[TMP2]], <2 x i32> poison, <2 x i32> zeroinitializer 474; CHECK-NEXT: [[TMP4:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[TMP0]], <2 x i32> [[TMP3]] 475; CHECK-NEXT: store <2 x i32> [[TMP4]], ptr [[PTR]], align 2 476; CHECK-NEXT: ret void 477; 478entry: 479 %l.0 = load i32, ptr %ptr 480 %cmp.0 = icmp eq i32 %l.0, 16383 481 %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x 482 store i32 %s.0, ptr %ptr, align 2 483 484 %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1 485 %l.1 = load i32, ptr %gep.1 486 %cmp.1 = icmp eq i32 %l.1, 16383 487 %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x 488 store i32 %s.1, ptr %gep.1, align 2 489 490 ret void 491} 492 493define void @select_uniform_eq_4xi32(ptr %ptr, i32 %x) { 494; CHECK-LABEL: @select_uniform_eq_4xi32( 495; CHECK-NEXT: entry: 496; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr [[PTR:%.*]], align 4 497; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <4 x i32> [[TMP0]], splat (i32 16383) 498; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[X:%.*]], i32 0 499; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <4 x i32> zeroinitializer 500; CHECK-NEXT: [[TMP4:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> [[TMP0]], <4 x i32> [[TMP3]] 501; CHECK-NEXT: store <4 x i32> [[TMP4]], ptr [[PTR]], align 2 502; CHECK-NEXT: ret void 503; 504entry: 505 %l.0 = load i32, ptr %ptr 506 %cmp.0 = icmp eq i32 %l.0, 16383 507 %s.0 = select i1 %cmp.0, i32 %l.0, i32 %x 508 store i32 %s.0, ptr %ptr, align 2 509 510 %gep.1 = getelementptr inbounds i32, ptr %ptr, i32 1 511 %l.1 = load i32, ptr %gep.1 512 %cmp.1 = icmp eq i32 %l.1, 16383 513 %s.1 = select i1 %cmp.1, i32 %l.1, i32 %x 514 store i32 %s.1, ptr %gep.1, align 2 515 516 %gep.2 = getelementptr inbounds i32, ptr %ptr, i32 2 517 %l.2 = load i32, ptr %gep.2 518 %cmp.2 = icmp eq i32 %l.2, 16383 519 %s.2 = select i1 %cmp.2, i32 %l.2, i32 %x 520 store i32 %s.2, ptr %gep.2, align 2 521 522 %gep.3 = getelementptr inbounds i32, ptr %ptr, i32 3 523 %l.3 = load i32, ptr %gep.3 524 %cmp.3 = icmp eq i32 %l.3, 16383 525 %s.3 = select i1 %cmp.3, i32 %l.3, i32 %x 526 store i32 %s.3, ptr %gep.3, align 2 527 ret void 528} 529 530define void @select_uniform_ne_2xi64(ptr %ptr, i64 %x) { 531; CHECK-LABEL: @select_uniform_ne_2xi64( 532; CHECK-NEXT: entry: 533; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[PTR:%.*]], align 8 534; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i64> [[TMP0]], splat (i64 16383) 535; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[X:%.*]], i32 0 536; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x i64> [[TMP2]], <2 x i64> poison, <2 x i32> zeroinitializer 537; CHECK-NEXT: [[TMP4:%.*]] = select <2 x i1> [[TMP1]], <2 x i64> [[TMP0]], <2 x i64> [[TMP3]] 538; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[PTR]], align 2 539; CHECK-NEXT: ret void 540; 541entry: 542 %l.0 = load i64, ptr %ptr 543 %cmp.0 = icmp ne i64 %l.0, 16383 544 %s.0 = select i1 %cmp.0, i64 %l.0, i64 %x 545 store i64 %s.0, ptr %ptr, align 2 546 547 %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 1 548 %l.1 = load i64, ptr %gep.1 549 %cmp.1 = icmp ne i64 %l.1, 16383 550 %s.1 = select i1 %cmp.1, i64 %l.1, i64 %x 551 store i64 %s.1, ptr %gep.1, align 2 552 553 ret void 554} 555