1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx2 | FileCheck %s 3 4 define <16 x i8> @BB16(i8* %ptr) nounwind uwtable readnone ssp { 5 ; CHECK-LABEL: BB16: 6 ; CHECK: ## BB#0: ## %entry 7 ; CHECK-NEXT: vpbroadcastb (%rdi), %xmm0 8 ; CHECK-NEXT: retq 9 entry: 10 %q = load i8, i8* %ptr, align 4 11 %q0 = insertelement <16 x i8> undef, i8 %q, i32 0 12 %q1 = insertelement <16 x i8> %q0, i8 %q, i32 1 13 %q2 = insertelement <16 x i8> %q1, i8 %q, i32 2 14 %q3 = insertelement <16 x i8> %q2, i8 %q, i32 3 15 %q4 = insertelement <16 x i8> %q3, i8 %q, i32 4 16 %q5 = insertelement <16 x i8> %q4, i8 %q, i32 5 17 %q6 = insertelement <16 x i8> %q5, i8 %q, i32 6 18 %q7 = insertelement <16 x i8> %q6, i8 %q, i32 7 19 %q8 = insertelement <16 x i8> %q7, i8 %q, i32 8 20 %q9 = insertelement <16 x i8> %q8, i8 %q, i32 9 21 %qa = insertelement <16 x i8> %q9, i8 %q, i32 10 22 %qb = insertelement <16 x i8> %qa, i8 %q, i32 11 23 %qc = insertelement <16 x i8> %qb, i8 %q, i32 12 24 %qd = insertelement <16 x i8> %qc, i8 %q, i32 13 25 %qe = insertelement <16 x i8> %qd, i8 %q, i32 14 26 %qf = insertelement <16 x i8> %qe, i8 %q, i32 15 27 ret <16 x i8> %qf 28 } 29 30 define <32 x i8> @BB32(i8* %ptr) nounwind uwtable readnone ssp { 31 ; CHECK-LABEL: BB32: 32 ; CHECK: ## BB#0: ## %entry 33 ; CHECK-NEXT: vpbroadcastb (%rdi), %ymm0 34 ; CHECK-NEXT: retq 35 entry: 36 %q = load i8, i8* %ptr, align 4 37 %q0 = insertelement <32 x i8> undef, i8 %q, i32 0 38 %q1 = insertelement <32 x i8> %q0, i8 %q, i32 1 39 %q2 = insertelement <32 x i8> %q1, i8 %q, i32 2 40 %q3 = insertelement <32 x i8> %q2, i8 %q, i32 3 41 %q4 = insertelement <32 x i8> %q3, i8 %q, i32 4 42 %q5 = insertelement <32 x i8> %q4, i8 %q, i32 5 43 %q6 = insertelement <32 x i8> %q5, i8 %q, i32 6 44 %q7 = insertelement <32 x i8> %q6, i8 %q, i32 7 45 %q8 = insertelement <32 x i8> %q7, i8 %q, i32 8 46 %q9 = insertelement <32 x i8> %q8, i8 %q, i32 9 47 %qa = insertelement <32 x i8> %q9, i8 %q, i32 10 48 %qb = insertelement <32 x i8> %qa, i8 %q, i32 11 49 %qc = insertelement <32 x i8> %qb, i8 %q, i32 12 50 %qd = insertelement <32 x i8> %qc, i8 %q, i32 13 51 %qe = insertelement <32 x i8> %qd, i8 %q, i32 14 52 %qf = insertelement <32 x i8> %qe, i8 %q, i32 15 53 54 %q20 = insertelement <32 x i8> %qf, i8 %q, i32 16 55 %q21 = insertelement <32 x i8> %q20, i8 %q, i32 17 56 %q22 = insertelement <32 x i8> %q21, i8 %q, i32 18 57 %q23 = insertelement <32 x i8> %q22, i8 %q, i32 19 58 %q24 = insertelement <32 x i8> %q23, i8 %q, i32 20 59 %q25 = insertelement <32 x i8> %q24, i8 %q, i32 21 60 %q26 = insertelement <32 x i8> %q25, i8 %q, i32 22 61 %q27 = insertelement <32 x i8> %q26, i8 %q, i32 23 62 %q28 = insertelement <32 x i8> %q27, i8 %q, i32 24 63 %q29 = insertelement <32 x i8> %q28, i8 %q, i32 25 64 %q2a = insertelement <32 x i8> %q29, i8 %q, i32 26 65 %q2b = insertelement <32 x i8> %q2a, i8 %q, i32 27 66 %q2c = insertelement <32 x i8> %q2b, i8 %q, i32 28 67 %q2d = insertelement <32 x i8> %q2c, i8 %q, i32 29 68 %q2e = insertelement <32 x i8> %q2d, i8 %q, i32 30 69 %q2f = insertelement <32 x i8> %q2e, i8 %q, i32 31 70 ret <32 x i8> %q2f 71 } 72 73 define <8 x i16> @W16(i16* %ptr) nounwind uwtable readnone ssp { 74 ; CHECK-LABEL: W16: 75 ; CHECK: ## BB#0: ## %entry 76 ; CHECK-NEXT: vpbroadcastw (%rdi), %xmm0 77 ; CHECK-NEXT: retq 78 entry: 79 %q = load i16, i16* %ptr, align 4 80 %q0 = insertelement <8 x i16> undef, i16 %q, i32 0 81 %q1 = insertelement <8 x i16> %q0, i16 %q, i32 1 82 %q2 = insertelement <8 x i16> %q1, i16 %q, i32 2 83 %q3 = insertelement <8 x i16> %q2, i16 %q, i32 3 84 %q4 = insertelement <8 x i16> %q3, i16 %q, i32 4 85 %q5 = insertelement <8 x i16> %q4, i16 %q, i32 5 86 %q6 = insertelement <8 x i16> %q5, i16 %q, i32 6 87 %q7 = insertelement <8 x i16> %q6, i16 %q, i32 7 88 ret <8 x i16> %q7 89 } 90 91 define <16 x i16> @WW16(i16* %ptr) nounwind uwtable readnone ssp { 92 ; CHECK-LABEL: WW16: 93 ; CHECK: ## BB#0: ## %entry 94 ; CHECK-NEXT: vpbroadcastw (%rdi), %ymm0 95 ; CHECK-NEXT: retq 96 entry: 97 %q = load i16, i16* %ptr, align 4 98 %q0 = insertelement <16 x i16> undef, i16 %q, i32 0 99 %q1 = insertelement <16 x i16> %q0, i16 %q, i32 1 100 %q2 = insertelement <16 x i16> %q1, i16 %q, i32 2 101 %q3 = insertelement <16 x i16> %q2, i16 %q, i32 3 102 %q4 = insertelement <16 x i16> %q3, i16 %q, i32 4 103 %q5 = insertelement <16 x i16> %q4, i16 %q, i32 5 104 %q6 = insertelement <16 x i16> %q5, i16 %q, i32 6 105 %q7 = insertelement <16 x i16> %q6, i16 %q, i32 7 106 %q8 = insertelement <16 x i16> %q7, i16 %q, i32 8 107 %q9 = insertelement <16 x i16> %q8, i16 %q, i32 9 108 %qa = insertelement <16 x i16> %q9, i16 %q, i32 10 109 %qb = insertelement <16 x i16> %qa, i16 %q, i32 11 110 %qc = insertelement <16 x i16> %qb, i16 %q, i32 12 111 %qd = insertelement <16 x i16> %qc, i16 %q, i32 13 112 %qe = insertelement <16 x i16> %qd, i16 %q, i32 14 113 %qf = insertelement <16 x i16> %qe, i16 %q, i32 15 114 ret <16 x i16> %qf 115 } 116 117 define <4 x i32> @D32(i32* %ptr) nounwind uwtable readnone ssp { 118 ; CHECK-LABEL: D32: 119 ; CHECK: ## BB#0: ## %entry 120 ; CHECK-NEXT: vbroadcastss (%rdi), %xmm0 121 ; CHECK-NEXT: retq 122 entry: 123 %q = load i32, i32* %ptr, align 4 124 %q0 = insertelement <4 x i32> undef, i32 %q, i32 0 125 %q1 = insertelement <4 x i32> %q0, i32 %q, i32 1 126 %q2 = insertelement <4 x i32> %q1, i32 %q, i32 2 127 %q3 = insertelement <4 x i32> %q2, i32 %q, i32 3 128 ret <4 x i32> %q3 129 } 130 131 define <8 x i32> @DD32(i32* %ptr) nounwind uwtable readnone ssp { 132 ; CHECK-LABEL: DD32: 133 ; CHECK: ## BB#0: ## %entry 134 ; CHECK-NEXT: vbroadcastss (%rdi), %ymm0 135 ; CHECK-NEXT: retq 136 entry: 137 %q = load i32, i32* %ptr, align 4 138 %q0 = insertelement <8 x i32> undef, i32 %q, i32 0 139 %q1 = insertelement <8 x i32> %q0, i32 %q, i32 1 140 %q2 = insertelement <8 x i32> %q1, i32 %q, i32 2 141 %q3 = insertelement <8 x i32> %q2, i32 %q, i32 3 142 %q4 = insertelement <8 x i32> %q3, i32 %q, i32 4 143 %q5 = insertelement <8 x i32> %q4, i32 %q, i32 5 144 %q6 = insertelement <8 x i32> %q5, i32 %q, i32 6 145 %q7 = insertelement <8 x i32> %q6, i32 %q, i32 7 146 ret <8 x i32> %q7 147 } 148 149 define <2 x i64> @Q64(i64* %ptr) nounwind uwtable readnone ssp { 150 ; CHECK-LABEL: Q64: 151 ; CHECK: ## BB#0: ## %entry 152 ; CHECK-NEXT: vpbroadcastq (%rdi), %xmm0 153 ; CHECK-NEXT: retq 154 entry: 155 %q = load i64, i64* %ptr, align 4 156 %q0 = insertelement <2 x i64> undef, i64 %q, i32 0 157 %q1 = insertelement <2 x i64> %q0, i64 %q, i32 1 158 ret <2 x i64> %q1 159 } 160 161 define <4 x i64> @QQ64(i64* %ptr) nounwind uwtable readnone ssp { 162 ; CHECK-LABEL: QQ64: 163 ; CHECK: ## BB#0: ## %entry 164 ; CHECK-NEXT: vbroadcastsd (%rdi), %ymm0 165 ; CHECK-NEXT: retq 166 entry: 167 %q = load i64, i64* %ptr, align 4 168 %q0 = insertelement <4 x i64> undef, i64 %q, i32 0 169 %q1 = insertelement <4 x i64> %q0, i64 %q, i32 1 170 %q2 = insertelement <4 x i64> %q1, i64 %q, i32 2 171 %q3 = insertelement <4 x i64> %q2, i64 %q, i32 3 172 ret <4 x i64> %q3 173 } 174 175 ; FIXME: Pointer adjusted broadcasts 176 177 define <16 x i8> @load_splat_16i8_16i8_1111111111111111(<16 x i8>* %ptr) nounwind uwtable readnone ssp { 178 ; CHECK-LABEL: load_splat_16i8_16i8_1111111111111111: 179 ; CHECK: ## BB#0: ## %entry 180 ; CHECK-NEXT: vpbroadcastb 1(%rdi), %xmm0 181 ; CHECK-NEXT: retq 182 entry: 183 %ld = load <16 x i8>, <16 x i8>* %ptr 184 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 185 ret <16 x i8> %ret 186 } 187 188 define <32 x i8> @load_splat_32i8_16i8_11111111111111111111111111111111(<16 x i8>* %ptr) nounwind uwtable readnone ssp { 189 ; CHECK-LABEL: load_splat_32i8_16i8_11111111111111111111111111111111: 190 ; CHECK: ## BB#0: ## %entry 191 ; CHECK-NEXT: vpbroadcastb 1(%rdi), %ymm0 192 ; CHECK-NEXT: retq 193 entry: 194 %ld = load <16 x i8>, <16 x i8>* %ptr 195 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 196 ret <32 x i8> %ret 197 } 198 199 define <32 x i8> @load_splat_32i8_32i8_11111111111111111111111111111111(<32 x i8>* %ptr) nounwind uwtable readnone ssp { 200 ; CHECK-LABEL: load_splat_32i8_32i8_11111111111111111111111111111111: 201 ; CHECK: ## BB#0: ## %entry 202 ; CHECK-NEXT: vpbroadcastb 1(%rdi), %ymm0 203 ; CHECK-NEXT: retq 204 entry: 205 %ld = load <32 x i8>, <32 x i8>* %ptr 206 %ret = shufflevector <32 x i8> %ld, <32 x i8> undef, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 207 ret <32 x i8> %ret 208 } 209 210 define <8 x i16> @load_splat_8i16_8i16_11111111(<8 x i16>* %ptr) nounwind uwtable readnone ssp { 211 ; CHECK-LABEL: load_splat_8i16_8i16_11111111: 212 ; CHECK: ## BB#0: ## %entry 213 ; CHECK-NEXT: vpbroadcastw 2(%rdi), %xmm0 214 ; CHECK-NEXT: retq 215 entry: 216 %ld = load <8 x i16>, <8 x i16>* %ptr 217 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 218 ret <8 x i16> %ret 219 } 220 221 define <16 x i16> @load_splat_16i16_8i16_1111111111111111(<8 x i16>* %ptr) nounwind uwtable readnone ssp { 222 ; CHECK-LABEL: load_splat_16i16_8i16_1111111111111111: 223 ; CHECK: ## BB#0: ## %entry 224 ; CHECK-NEXT: vpbroadcastw 2(%rdi), %ymm0 225 ; CHECK-NEXT: retq 226 entry: 227 %ld = load <8 x i16>, <8 x i16>* %ptr 228 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 229 ret <16 x i16> %ret 230 } 231 232 define <16 x i16> @load_splat_16i16_16i16_1111111111111111(<16 x i16>* %ptr) nounwind uwtable readnone ssp { 233 ; CHECK-LABEL: load_splat_16i16_16i16_1111111111111111: 234 ; CHECK: ## BB#0: ## %entry 235 ; CHECK-NEXT: vpbroadcastw 2(%rdi), %ymm0 236 ; CHECK-NEXT: retq 237 entry: 238 %ld = load <16 x i16>, <16 x i16>* %ptr 239 %ret = shufflevector <16 x i16> %ld, <16 x i16> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 240 ret <16 x i16> %ret 241 } 242 243 define <4 x i32> @load_splat_4i32_4i32_1111(<4 x i32>* %ptr) nounwind uwtable readnone ssp { 244 ; CHECK-LABEL: load_splat_4i32_4i32_1111: 245 ; CHECK: ## BB#0: ## %entry 246 ; CHECK-NEXT: vbroadcastss 4(%rdi), %xmm0 247 ; CHECK-NEXT: retq 248 entry: 249 %ld = load <4 x i32>, <4 x i32>* %ptr 250 %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 251 ret <4 x i32> %ret 252 } 253 254 define <8 x i32> @load_splat_8i32_4i32_33333333(<4 x i32>* %ptr) nounwind uwtable readnone ssp { 255 ; CHECK-LABEL: load_splat_8i32_4i32_33333333: 256 ; CHECK: ## BB#0: ## %entry 257 ; CHECK-NEXT: vbroadcastss 12(%rdi), %ymm0 258 ; CHECK-NEXT: retq 259 entry: 260 %ld = load <4 x i32>, <4 x i32>* %ptr 261 %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> 262 ret <8 x i32> %ret 263 } 264 265 define <8 x i32> @load_splat_8i32_8i32_55555555(<8 x i32>* %ptr) nounwind uwtable readnone ssp { 266 ; CHECK-LABEL: load_splat_8i32_8i32_55555555: 267 ; CHECK: ## BB#0: ## %entry 268 ; CHECK-NEXT: vbroadcastss 20(%rdi), %ymm0 269 ; CHECK-NEXT: retq 270 entry: 271 %ld = load <8 x i32>, <8 x i32>* %ptr 272 %ret = shufflevector <8 x i32> %ld, <8 x i32> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 273 ret <8 x i32> %ret 274 } 275 276 define <4 x float> @load_splat_4f32_4f32_1111(<4 x float>* %ptr) nounwind uwtable readnone ssp { 277 ; CHECK-LABEL: load_splat_4f32_4f32_1111: 278 ; CHECK: ## BB#0: ## %entry 279 ; CHECK-NEXT: vbroadcastss 4(%rdi), %xmm0 280 ; CHECK-NEXT: retq 281 entry: 282 %ld = load <4 x float>, <4 x float>* %ptr 283 %ret = shufflevector <4 x float> %ld, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 284 ret <4 x float> %ret 285 } 286 287 define <8 x float> @load_splat_8f32_4f32_33333333(<4 x float>* %ptr) nounwind uwtable readnone ssp { 288 ; CHECK-LABEL: load_splat_8f32_4f32_33333333: 289 ; CHECK: ## BB#0: ## %entry 290 ; CHECK-NEXT: vbroadcastss 12(%rdi), %ymm0 291 ; CHECK-NEXT: retq 292 entry: 293 %ld = load <4 x float>, <4 x float>* %ptr 294 %ret = shufflevector <4 x float> %ld, <4 x float> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> 295 ret <8 x float> %ret 296 } 297 298 define <8 x float> @load_splat_8f32_8f32_55555555(<8 x float>* %ptr) nounwind uwtable readnone ssp { 299 ; CHECK-LABEL: load_splat_8f32_8f32_55555555: 300 ; CHECK: ## BB#0: ## %entry 301 ; CHECK-NEXT: vbroadcastss 20(%rdi), %ymm0 302 ; CHECK-NEXT: retq 303 entry: 304 %ld = load <8 x float>, <8 x float>* %ptr 305 %ret = shufflevector <8 x float> %ld, <8 x float> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 306 ret <8 x float> %ret 307 } 308 309 define <2 x i64> @load_splat_2i64_2i64_1111(<2 x i64>* %ptr) nounwind uwtable readnone ssp { 310 ; CHECK-LABEL: load_splat_2i64_2i64_1111: 311 ; CHECK: ## BB#0: ## %entry 312 ; CHECK-NEXT: vpbroadcastq 8(%rdi), %xmm0 313 ; CHECK-NEXT: retq 314 entry: 315 %ld = load <2 x i64>, <2 x i64>* %ptr 316 %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <2 x i32> <i32 1, i32 1> 317 ret <2 x i64> %ret 318 } 319 320 define <4 x i64> @load_splat_4i64_2i64_1111(<2 x i64>* %ptr) nounwind uwtable readnone ssp { 321 ; CHECK-LABEL: load_splat_4i64_2i64_1111: 322 ; CHECK: ## BB#0: ## %entry 323 ; CHECK-NEXT: vbroadcastsd 8(%rdi), %ymm0 324 ; CHECK-NEXT: retq 325 entry: 326 %ld = load <2 x i64>, <2 x i64>* %ptr 327 %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 328 ret <4 x i64> %ret 329 } 330 331 define <4 x i64> @load_splat_4i64_4i64_2222(<4 x i64>* %ptr) nounwind uwtable readnone ssp { 332 ; CHECK-LABEL: load_splat_4i64_4i64_2222: 333 ; CHECK: ## BB#0: ## %entry 334 ; CHECK-NEXT: vbroadcastsd 16(%rdi), %ymm0 335 ; CHECK-NEXT: retq 336 entry: 337 %ld = load <4 x i64>, <4 x i64>* %ptr 338 %ret = shufflevector <4 x i64> %ld, <4 x i64> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2> 339 ret <4 x i64> %ret 340 } 341 342 define <2 x double> @load_splat_2f64_2f64_1111(<2 x double>* %ptr) nounwind uwtable readnone ssp { 343 ; CHECK-LABEL: load_splat_2f64_2f64_1111: 344 ; CHECK: ## BB#0: ## %entry 345 ; CHECK-NEXT: vmovaps (%rdi), %xmm0 346 ; CHECK-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 347 ; CHECK-NEXT: retq 348 entry: 349 %ld = load <2 x double>, <2 x double>* %ptr 350 %ret = shufflevector <2 x double> %ld, <2 x double> undef, <2 x i32> <i32 1, i32 1> 351 ret <2 x double> %ret 352 } 353 354 define <4 x double> @load_splat_4f64_2f64_1111(<2 x double>* %ptr) nounwind uwtable readnone ssp { 355 ; CHECK-LABEL: load_splat_4f64_2f64_1111: 356 ; CHECK: ## BB#0: ## %entry 357 ; CHECK-NEXT: vbroadcastsd 8(%rdi), %ymm0 358 ; CHECK-NEXT: retq 359 entry: 360 %ld = load <2 x double>, <2 x double>* %ptr 361 %ret = shufflevector <2 x double> %ld, <2 x double> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 362 ret <4 x double> %ret 363 } 364 365 define <4 x double> @load_splat_4f64_4f64_2222(<4 x double>* %ptr) nounwind uwtable readnone ssp { 366 ; CHECK-LABEL: load_splat_4f64_4f64_2222: 367 ; CHECK: ## BB#0: ## %entry 368 ; CHECK-NEXT: vbroadcastsd 16(%rdi), %ymm0 369 ; CHECK-NEXT: retq 370 entry: 371 %ld = load <4 x double>, <4 x double>* %ptr 372 %ret = shufflevector <4 x double> %ld, <4 x double> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2> 373 ret <4 x double> %ret 374 } 375 376 ; make sure that we still don't support broadcast double into 128-bit vector 377 ; this used to crash 378 define <2 x double> @I(double* %ptr) nounwind uwtable readnone ssp { 379 ; CHECK-LABEL: I: 380 ; CHECK: ## BB#0: ## %entry 381 ; CHECK-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0] 382 ; CHECK-NEXT: retq 383 entry: 384 %q = load double, double* %ptr, align 4 385 %vecinit.i = insertelement <2 x double> undef, double %q, i32 0 386 %vecinit2.i = insertelement <2 x double> %vecinit.i, double %q, i32 1 387 ret <2 x double> %vecinit2.i 388 } 389 390 define <8 x i32> @V111(<8 x i32> %in) nounwind uwtable readnone ssp { 391 ; CHECK-LABEL: V111: 392 ; CHECK: ## BB#0: ## %entry 393 ; CHECK-NEXT: vpbroadcastd {{.*}}(%rip), %ymm1 394 ; CHECK-NEXT: vpaddd %ymm1, %ymm0, %ymm0 395 ; CHECK-NEXT: retq 396 entry: 397 %g = add <8 x i32> %in, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 398 ret <8 x i32> %g 399 } 400 401 define <8 x float> @V113(<8 x float> %in) nounwind uwtable readnone ssp { 402 ; CHECK-LABEL: V113: 403 ; CHECK: ## BB#0: ## %entry 404 ; CHECK-NEXT: vbroadcastss {{.*}}(%rip), %ymm1 405 ; CHECK-NEXT: vaddps %ymm1, %ymm0, %ymm0 406 ; CHECK-NEXT: retq 407 entry: 408 %g = fadd <8 x float> %in, <float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000> 409 ret <8 x float> %g 410 } 411 412 define <4 x float> @_e2(float* %ptr) nounwind uwtable readnone ssp { 413 ; CHECK-LABEL: _e2: 414 ; CHECK: ## BB#0: 415 ; CHECK-NEXT: vbroadcastss {{.*}}(%rip), %xmm0 416 ; CHECK-NEXT: retq 417 %vecinit.i = insertelement <4 x float> undef, float 0xbf80000000000000, i32 0 418 %vecinit2.i = insertelement <4 x float> %vecinit.i, float 0xbf80000000000000, i32 1 419 %vecinit4.i = insertelement <4 x float> %vecinit2.i, float 0xbf80000000000000, i32 2 420 %vecinit6.i = insertelement <4 x float> %vecinit4.i, float 0xbf80000000000000, i32 3 421 ret <4 x float> %vecinit6.i 422 } 423 424 define <8 x i8> @_e4(i8* %ptr) nounwind uwtable readnone ssp { 425 ; CHECK-LABEL: _e4: 426 ; CHECK: ## BB#0: 427 ; CHECK-NEXT: vmovaps {{.*#+}} xmm0 = [52,52,52,52,52,52,52,52] 428 ; CHECK-NEXT: retq 429 %vecinit0.i = insertelement <8 x i8> undef, i8 52, i32 0 430 %vecinit1.i = insertelement <8 x i8> %vecinit0.i, i8 52, i32 1 431 %vecinit2.i = insertelement <8 x i8> %vecinit1.i, i8 52, i32 2 432 %vecinit3.i = insertelement <8 x i8> %vecinit2.i, i8 52, i32 3 433 %vecinit4.i = insertelement <8 x i8> %vecinit3.i, i8 52, i32 4 434 %vecinit5.i = insertelement <8 x i8> %vecinit4.i, i8 52, i32 5 435 %vecinit6.i = insertelement <8 x i8> %vecinit5.i, i8 52, i32 6 436 %vecinit7.i = insertelement <8 x i8> %vecinit6.i, i8 52, i32 7 437 ret <8 x i8> %vecinit7.i 438 } 439 440 441 define void @crash() nounwind alwaysinline { 442 ; CHECK-LABEL: crash: 443 ; CHECK: ## BB#0: ## %WGLoopsEntry 444 ; CHECK-NEXT: xorl %eax, %eax 445 ; CHECK-NEXT: testb %al, %al 446 ; CHECK-NEXT: je LBB31_1 447 ; CHECK-NEXT: ## BB#2: ## %ret 448 ; CHECK-NEXT: retq 449 ; CHECK-NEXT: .align 4, 0x90 450 ; CHECK-NEXT: LBB31_1: ## %footer349VF 451 ; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1 452 ; CHECK-NEXT: jmp LBB31_1 453 WGLoopsEntry: 454 br i1 undef, label %ret, label %footer329VF 455 456 footer329VF: 457 %A.0.inVF = fmul float undef, 6.553600e+04 458 %B.0.in407VF = fmul <8 x float> undef, <float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04> 459 %A.0VF = fptosi float %A.0.inVF to i32 460 %B.0408VF = fptosi <8 x float> %B.0.in407VF to <8 x i32> 461 %0 = and <8 x i32> %B.0408VF, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 462 %1 = and i32 %A.0VF, 65535 463 %temp1098VF = insertelement <8 x i32> undef, i32 %1, i32 0 464 %vector1099VF = shufflevector <8 x i32> %temp1098VF, <8 x i32> undef, <8 x i32> zeroinitializer 465 br i1 undef, label %preload1201VF, label %footer349VF 466 467 preload1201VF: 468 br label %footer349VF 469 470 footer349VF: 471 %2 = mul nsw <8 x i32> undef, %0 472 %3 = mul nsw <8 x i32> undef, %vector1099VF 473 br label %footer329VF 474 475 ret: 476 ret void 477 } 478 479 define <8 x i32> @_inreg0(i32 %scalar) nounwind uwtable readnone ssp { 480 ; CHECK-LABEL: _inreg0: 481 ; CHECK: ## BB#0: 482 ; CHECK-NEXT: vmovd %edi, %xmm0 483 ; CHECK-NEXT: vbroadcastss %xmm0, %ymm0 484 ; CHECK-NEXT: retq 485 %in = insertelement <8 x i32> undef, i32 %scalar, i32 0 486 %wide = shufflevector <8 x i32> %in, <8 x i32> undef, <8 x i32> zeroinitializer 487 ret <8 x i32> %wide 488 } 489 490 define <8 x float> @_inreg1(float %scalar) nounwind uwtable readnone ssp { 491 ; CHECK-LABEL: _inreg1: 492 ; CHECK: ## BB#0: 493 ; CHECK-NEXT: vbroadcastss %xmm0, %ymm0 494 ; CHECK-NEXT: retq 495 %in = insertelement <8 x float> undef, float %scalar, i32 0 496 %wide = shufflevector <8 x float> %in, <8 x float> undef, <8 x i32> zeroinitializer 497 ret <8 x float> %wide 498 } 499 500 define <4 x float> @_inreg2(float %scalar) nounwind uwtable readnone ssp { 501 ; CHECK-LABEL: _inreg2: 502 ; CHECK: ## BB#0: 503 ; CHECK-NEXT: vbroadcastss %xmm0, %xmm0 504 ; CHECK-NEXT: retq 505 %in = insertelement <4 x float> undef, float %scalar, i32 0 506 %wide = shufflevector <4 x float> %in, <4 x float> undef, <4 x i32> zeroinitializer 507 ret <4 x float> %wide 508 } 509 510 define <4 x double> @_inreg3(double %scalar) nounwind uwtable readnone ssp { 511 ; CHECK-LABEL: _inreg3: 512 ; CHECK: ## BB#0: 513 ; CHECK-NEXT: vbroadcastsd %xmm0, %ymm0 514 ; CHECK-NEXT: retq 515 %in = insertelement <4 x double> undef, double %scalar, i32 0 516 %wide = shufflevector <4 x double> %in, <4 x double> undef, <4 x i32> zeroinitializer 517 ret <4 x double> %wide 518 } 519 520 define <8 x float> @_inreg8xfloat(<8 x float> %a) { 521 ; CHECK-LABEL: _inreg8xfloat: 522 ; CHECK: ## BB#0: 523 ; CHECK-NEXT: vbroadcastss %xmm0, %ymm0 524 ; CHECK-NEXT: retq 525 %b = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> zeroinitializer 526 ret <8 x float> %b 527 } 528 529 define <4 x float> @_inreg4xfloat(<4 x float> %a) { 530 ; CHECK-LABEL: _inreg4xfloat: 531 ; CHECK: ## BB#0: 532 ; CHECK-NEXT: vbroadcastss %xmm0, %xmm0 533 ; CHECK-NEXT: retq 534 %b = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> zeroinitializer 535 ret <4 x float> %b 536 } 537 538 define <16 x i16> @_inreg16xi16(<16 x i16> %a) { 539 ; CHECK-LABEL: _inreg16xi16: 540 ; CHECK: ## BB#0: 541 ; CHECK-NEXT: vpbroadcastw %xmm0, %ymm0 542 ; CHECK-NEXT: retq 543 %b = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> zeroinitializer 544 ret <16 x i16> %b 545 } 546 547 define <8 x i16> @_inreg8xi16(<8 x i16> %a) { 548 ; CHECK-LABEL: _inreg8xi16: 549 ; CHECK: ## BB#0: 550 ; CHECK-NEXT: vpbroadcastw %xmm0, %xmm0 551 ; CHECK-NEXT: retq 552 %b = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> zeroinitializer 553 ret <8 x i16> %b 554 } 555 556 define <4 x i64> @_inreg4xi64(<4 x i64> %a) { 557 ; CHECK-LABEL: _inreg4xi64: 558 ; CHECK: ## BB#0: 559 ; CHECK-NEXT: vbroadcastsd %xmm0, %ymm0 560 ; CHECK-NEXT: retq 561 %b = shufflevector <4 x i64> %a, <4 x i64> undef, <4 x i32> zeroinitializer 562 ret <4 x i64> %b 563 } 564 565 define <2 x i64> @_inreg2xi64(<2 x i64> %a) { 566 ; CHECK-LABEL: _inreg2xi64: 567 ; CHECK: ## BB#0: 568 ; CHECK-NEXT: vpbroadcastq %xmm0, %xmm0 569 ; CHECK-NEXT: retq 570 %b = shufflevector <2 x i64> %a, <2 x i64> undef, <2 x i32> zeroinitializer 571 ret <2 x i64> %b 572 } 573 574 define <4 x double> @_inreg4xdouble(<4 x double> %a) { 575 ; CHECK-LABEL: _inreg4xdouble: 576 ; CHECK: ## BB#0: 577 ; CHECK-NEXT: vbroadcastsd %xmm0, %ymm0 578 ; CHECK-NEXT: retq 579 %b = shufflevector <4 x double> %a, <4 x double> undef, <4 x i32> zeroinitializer 580 ret <4 x double> %b 581 } 582 583 define <2 x double> @_inreg2xdouble(<2 x double> %a) { 584 ; CHECK-LABEL: _inreg2xdouble: 585 ; CHECK: ## BB#0: 586 ; CHECK-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 587 ; CHECK-NEXT: retq 588 %b = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> zeroinitializer 589 ret <2 x double> %b 590 } 591 592 define <8 x i32> @_inreg8xi32(<8 x i32> %a) { 593 ; CHECK-LABEL: _inreg8xi32: 594 ; CHECK: ## BB#0: 595 ; CHECK-NEXT: vbroadcastss %xmm0, %ymm0 596 ; CHECK-NEXT: retq 597 %b = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> zeroinitializer 598 ret <8 x i32> %b 599 } 600 601 define <4 x i32> @_inreg4xi32(<4 x i32> %a) { 602 ; CHECK-LABEL: _inreg4xi32: 603 ; CHECK: ## BB#0: 604 ; CHECK-NEXT: vbroadcastss %xmm0, %xmm0 605 ; CHECK-NEXT: retq 606 %b = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> zeroinitializer 607 ret <4 x i32> %b 608 } 609 610 define <32 x i8> @_inreg32xi8(<32 x i8> %a) { 611 ; CHECK-LABEL: _inreg32xi8: 612 ; CHECK: ## BB#0: 613 ; CHECK-NEXT: vpbroadcastb %xmm0, %ymm0 614 ; CHECK-NEXT: retq 615 %b = shufflevector <32 x i8> %a, <32 x i8> undef, <32 x i32> zeroinitializer 616 ret <32 x i8> %b 617 } 618 619 define <16 x i8> @_inreg16xi8(<16 x i8> %a) { 620 ; CHECK-LABEL: _inreg16xi8: 621 ; CHECK: ## BB#0: 622 ; CHECK-NEXT: vpbroadcastb %xmm0, %xmm0 623 ; CHECK-NEXT: retq 624 %b = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> zeroinitializer 625 ret <16 x i8> %b 626 } 627 628 ; These tests check that a vbroadcast instruction is used when we have a splat 629 ; formed from a concat_vectors (via the shufflevector) of two BUILD_VECTORs 630 ; (via the insertelements). 631 632 define <8 x float> @splat_concat1(float %f) { 633 ; CHECK-LABEL: splat_concat1: 634 ; CHECK: ## BB#0: 635 ; CHECK-NEXT: vbroadcastss %xmm0, %ymm0 636 ; CHECK-NEXT: retq 637 %1 = insertelement <4 x float> undef, float %f, i32 0 638 %2 = insertelement <4 x float> %1, float %f, i32 1 639 %3 = insertelement <4 x float> %2, float %f, i32 2 640 %4 = insertelement <4 x float> %3, float %f, i32 3 641 %5 = shufflevector <4 x float> %4, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3> 642 ret <8 x float> %5 643 } 644 645 define <8 x float> @splat_concat2(float %f) { 646 ; CHECK-LABEL: splat_concat2: 647 ; CHECK: ## BB#0: 648 ; CHECK-NEXT: vbroadcastss %xmm0, %ymm0 649 ; CHECK-NEXT: retq 650 %1 = insertelement <4 x float> undef, float %f, i32 0 651 %2 = insertelement <4 x float> %1, float %f, i32 1 652 %3 = insertelement <4 x float> %2, float %f, i32 2 653 %4 = insertelement <4 x float> %3, float %f, i32 3 654 %5 = insertelement <4 x float> undef, float %f, i32 0 655 %6 = insertelement <4 x float> %5, float %f, i32 1 656 %7 = insertelement <4 x float> %6, float %f, i32 2 657 %8 = insertelement <4 x float> %7, float %f, i32 3 658 %9 = shufflevector <4 x float> %4, <4 x float> %8, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 659 ret <8 x float> %9 660 } 661 662 define <4 x double> @splat_concat3(double %d) { 663 ; CHECK-LABEL: splat_concat3: 664 ; CHECK: ## BB#0: 665 ; CHECK-NEXT: vbroadcastsd %xmm0, %ymm0 666 ; CHECK-NEXT: retq 667 %1 = insertelement <2 x double> undef, double %d, i32 0 668 %2 = insertelement <2 x double> %1, double %d, i32 1 669 %3 = shufflevector <2 x double> %2, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1> 670 ret <4 x double> %3 671 } 672 673 define <4 x double> @splat_concat4(double %d) { 674 ; CHECK-LABEL: splat_concat4: 675 ; CHECK: ## BB#0: 676 ; CHECK-NEXT: vbroadcastsd %xmm0, %ymm0 677 ; CHECK-NEXT: retq 678 %1 = insertelement <2 x double> undef, double %d, i32 0 679 %2 = insertelement <2 x double> %1, double %d, i32 1 680 %3 = insertelement <2 x double> undef, double %d, i32 0 681 %4 = insertelement <2 x double> %3, double %d, i32 1 682 %5 = shufflevector <2 x double> %2, <2 x double> %4, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 683 ret <4 x double> %5 684 } 685 686 ; Test cases for <rdar://problem/16074331>. 687 ; Instruction selection for broacast instruction fails if 688 ; the load cannot be folded into the broadcast. 689 ; This happens if the load has initial one use but other uses are 690 ; created later, or if selection DAG cannot prove that folding the 691 ; load will not create a cycle in the DAG. 692 ; Those test cases exerce the latter. 693 694 ; CHECK-LABEL: isel_crash_16b 695 ; CHECK: vpbroadcastb {{[^,]+}}, %xmm{{[0-9]+}} 696 ; CHECK: ret 697 define void @isel_crash_16b(i8* %cV_R.addr) { 698 eintry: 699 %__a.addr.i = alloca <2 x i64>, align 16 700 %__b.addr.i = alloca <2 x i64>, align 16 701 %vCr = alloca <2 x i64>, align 16 702 store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16 703 %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16 704 %tmp2 = load i8, i8* %cV_R.addr, align 4 705 %splat.splatinsert = insertelement <16 x i8> undef, i8 %tmp2, i32 0 706 %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer 707 %tmp3 = bitcast <16 x i8> %splat.splat to <2 x i64> 708 store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16 709 store <2 x i64> %tmp3, <2 x i64>* %__b.addr.i, align 16 710 ret void 711 } 712 713 ; CHECK-LABEL: isel_crash_32b 714 ; CHECK: vpbroadcastb {{[^,]+}}, %ymm{{[0-9]+}} 715 ; CHECK: ret 716 define void @isel_crash_32b(i8* %cV_R.addr) { 717 eintry: 718 %__a.addr.i = alloca <4 x i64>, align 16 719 %__b.addr.i = alloca <4 x i64>, align 16 720 %vCr = alloca <4 x i64>, align 16 721 store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16 722 %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16 723 %tmp2 = load i8, i8* %cV_R.addr, align 4 724 %splat.splatinsert = insertelement <32 x i8> undef, i8 %tmp2, i32 0 725 %splat.splat = shufflevector <32 x i8> %splat.splatinsert, <32 x i8> undef, <32 x i32> zeroinitializer 726 %tmp3 = bitcast <32 x i8> %splat.splat to <4 x i64> 727 store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16 728 store <4 x i64> %tmp3, <4 x i64>* %__b.addr.i, align 16 729 ret void 730 } 731 732 ; CHECK-LABEL: isel_crash_8w 733 ; CHECK: vpbroadcastw {{[^,]+}}, %xmm{{[0-9]+}} 734 ; CHECK: ret 735 define void @isel_crash_8w(i16* %cV_R.addr) { 736 entry: 737 %__a.addr.i = alloca <2 x i64>, align 16 738 %__b.addr.i = alloca <2 x i64>, align 16 739 %vCr = alloca <2 x i64>, align 16 740 store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16 741 %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16 742 %tmp2 = load i16, i16* %cV_R.addr, align 4 743 %splat.splatinsert = insertelement <8 x i16> undef, i16 %tmp2, i32 0 744 %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer 745 %tmp3 = bitcast <8 x i16> %splat.splat to <2 x i64> 746 store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16 747 store <2 x i64> %tmp3, <2 x i64>* %__b.addr.i, align 16 748 ret void 749 } 750 751 ; CHECK-LABEL: isel_crash_16w 752 ; CHECK: vpbroadcastw {{[^,]+}}, %ymm{{[0-9]+}} 753 ; CHECK: ret 754 define void @isel_crash_16w(i16* %cV_R.addr) { 755 eintry: 756 %__a.addr.i = alloca <4 x i64>, align 16 757 %__b.addr.i = alloca <4 x i64>, align 16 758 %vCr = alloca <4 x i64>, align 16 759 store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16 760 %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16 761 %tmp2 = load i16, i16* %cV_R.addr, align 4 762 %splat.splatinsert = insertelement <16 x i16> undef, i16 %tmp2, i32 0 763 %splat.splat = shufflevector <16 x i16> %splat.splatinsert, <16 x i16> undef, <16 x i32> zeroinitializer 764 %tmp3 = bitcast <16 x i16> %splat.splat to <4 x i64> 765 store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16 766 store <4 x i64> %tmp3, <4 x i64>* %__b.addr.i, align 16 767 ret void 768 } 769 770 ; CHECK-LABEL: isel_crash_4d 771 ; CHECK: vbroadcastss {{[^,]+}}, %xmm{{[0-9]+}} 772 ; CHECK: ret 773 define void @isel_crash_4d(i32* %cV_R.addr) { 774 entry: 775 %__a.addr.i = alloca <2 x i64>, align 16 776 %__b.addr.i = alloca <2 x i64>, align 16 777 %vCr = alloca <2 x i64>, align 16 778 store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16 779 %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16 780 %tmp2 = load i32, i32* %cV_R.addr, align 4 781 %splat.splatinsert = insertelement <4 x i32> undef, i32 %tmp2, i32 0 782 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer 783 %tmp3 = bitcast <4 x i32> %splat.splat to <2 x i64> 784 store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16 785 store <2 x i64> %tmp3, <2 x i64>* %__b.addr.i, align 16 786 ret void 787 } 788 789 ; CHECK-LABEL: isel_crash_8d 790 ; CHECK: vbroadcastss {{[^,]+}}, %ymm{{[0-9]+}} 791 ; CHECK: ret 792 define void @isel_crash_8d(i32* %cV_R.addr) { 793 eintry: 794 %__a.addr.i = alloca <4 x i64>, align 16 795 %__b.addr.i = alloca <4 x i64>, align 16 796 %vCr = alloca <4 x i64>, align 16 797 store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16 798 %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16 799 %tmp2 = load i32, i32* %cV_R.addr, align 4 800 %splat.splatinsert = insertelement <8 x i32> undef, i32 %tmp2, i32 0 801 %splat.splat = shufflevector <8 x i32> %splat.splatinsert, <8 x i32> undef, <8 x i32> zeroinitializer 802 %tmp3 = bitcast <8 x i32> %splat.splat to <4 x i64> 803 store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16 804 store <4 x i64> %tmp3, <4 x i64>* %__b.addr.i, align 16 805 ret void 806 } 807 808 ; CHECK-LABEL: isel_crash_2q 809 ; CHECK: vpbroadcastq {{[^,]+}}, %xmm{{[0-9]+}} 810 ; CHECK: ret 811 define void @isel_crash_2q(i64* %cV_R.addr) { 812 entry: 813 %__a.addr.i = alloca <2 x i64>, align 16 814 %__b.addr.i = alloca <2 x i64>, align 16 815 %vCr = alloca <2 x i64>, align 16 816 store <2 x i64> zeroinitializer, <2 x i64>* %vCr, align 16 817 %tmp = load <2 x i64>, <2 x i64>* %vCr, align 16 818 %tmp2 = load i64, i64* %cV_R.addr, align 4 819 %splat.splatinsert = insertelement <2 x i64> undef, i64 %tmp2, i32 0 820 %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer 821 store <2 x i64> %tmp, <2 x i64>* %__a.addr.i, align 16 822 store <2 x i64> %splat.splat, <2 x i64>* %__b.addr.i, align 16 823 ret void 824 } 825 826 ; CHECK-LABEL: isel_crash_4q 827 ; CHECK: vbroadcastsd {{[^,]+}}, %ymm{{[0-9]+}} 828 ; CHECK: ret 829 define void @isel_crash_4q(i64* %cV_R.addr) { 830 eintry: 831 %__a.addr.i = alloca <4 x i64>, align 16 832 %__b.addr.i = alloca <4 x i64>, align 16 833 %vCr = alloca <4 x i64>, align 16 834 store <4 x i64> zeroinitializer, <4 x i64>* %vCr, align 16 835 %tmp = load <4 x i64>, <4 x i64>* %vCr, align 16 836 %tmp2 = load i64, i64* %cV_R.addr, align 4 837 %splat.splatinsert = insertelement <4 x i64> undef, i64 %tmp2, i32 0 838 %splat.splat = shufflevector <4 x i64> %splat.splatinsert, <4 x i64> undef, <4 x i32> zeroinitializer 839 store <4 x i64> %tmp, <4 x i64>* %__a.addr.i, align 16 840 store <4 x i64> %splat.splat, <4 x i64>* %__b.addr.i, align 16 841 ret void 842 } 843