117 bool LogicalShift =
false;
118 bool ShiftLeft =
false;
121 switch (
II.getIntrinsicID()) {
124 case Intrinsic::x86_sse2_psrai_d:
125 case Intrinsic::x86_sse2_psrai_w:
126 case Intrinsic::x86_avx2_psrai_d:
127 case Intrinsic::x86_avx2_psrai_w:
128 case Intrinsic::x86_avx512_psrai_q_128:
129 case Intrinsic::x86_avx512_psrai_q_256:
130 case Intrinsic::x86_avx512_psrai_d_512:
131 case Intrinsic::x86_avx512_psrai_q_512:
132 case Intrinsic::x86_avx512_psrai_w_512:
135 case Intrinsic::x86_sse2_psra_d:
136 case Intrinsic::x86_sse2_psra_w:
137 case Intrinsic::x86_avx2_psra_d:
138 case Intrinsic::x86_avx2_psra_w:
139 case Intrinsic::x86_avx512_psra_q_128:
140 case Intrinsic::x86_avx512_psra_q_256:
141 case Intrinsic::x86_avx512_psra_d_512:
142 case Intrinsic::x86_avx512_psra_q_512:
143 case Intrinsic::x86_avx512_psra_w_512:
144 LogicalShift =
false;
147 case Intrinsic::x86_sse2_psrli_d:
148 case Intrinsic::x86_sse2_psrli_q:
149 case Intrinsic::x86_sse2_psrli_w:
150 case Intrinsic::x86_avx2_psrli_d:
151 case Intrinsic::x86_avx2_psrli_q:
152 case Intrinsic::x86_avx2_psrli_w:
153 case Intrinsic::x86_avx512_psrli_d_512:
154 case Intrinsic::x86_avx512_psrli_q_512:
155 case Intrinsic::x86_avx512_psrli_w_512:
158 case Intrinsic::x86_sse2_psrl_d:
159 case Intrinsic::x86_sse2_psrl_q:
160 case Intrinsic::x86_sse2_psrl_w:
161 case Intrinsic::x86_avx2_psrl_d:
162 case Intrinsic::x86_avx2_psrl_q:
163 case Intrinsic::x86_avx2_psrl_w:
164 case Intrinsic::x86_avx512_psrl_d_512:
165 case Intrinsic::x86_avx512_psrl_q_512:
166 case Intrinsic::x86_avx512_psrl_w_512:
170 case Intrinsic::x86_sse2_pslli_d:
171 case Intrinsic::x86_sse2_pslli_q:
172 case Intrinsic::x86_sse2_pslli_w:
173 case Intrinsic::x86_avx2_pslli_d:
174 case Intrinsic::x86_avx2_pslli_q:
175 case Intrinsic::x86_avx2_pslli_w:
176 case Intrinsic::x86_avx512_pslli_d_512:
177 case Intrinsic::x86_avx512_pslli_q_512:
178 case Intrinsic::x86_avx512_pslli_w_512:
181 case Intrinsic::x86_sse2_psll_d:
182 case Intrinsic::x86_sse2_psll_q:
183 case Intrinsic::x86_sse2_psll_w:
184 case Intrinsic::x86_avx2_psll_d:
185 case Intrinsic::x86_avx2_psll_q:
186 case Intrinsic::x86_avx2_psll_w:
187 case Intrinsic::x86_avx512_psll_d_512:
188 case Intrinsic::x86_avx512_psll_q_512:
189 case Intrinsic::x86_avx512_psll_w_512:
194 assert((LogicalShift || !ShiftLeft) &&
"Only logical shifts can shift left");
196 Value *Vec =
II.getArgOperand(0);
197 Value *Amt =
II.getArgOperand(1);
199 Type *SVT = VT->getElementType();
201 unsigned VWidth = VT->getNumElements();
212 Amt = Builder.CreateZExtOrTrunc(Amt, SVT);
213 Amt = Builder.CreateVectorSplat(VWidth, Amt);
214 return (LogicalShift ? (ShiftLeft ? Builder.CreateShl(Vec, Amt)
215 : Builder.CreateLShr(Vec, Amt))
216 : Builder.CreateAShr(Vec, Amt));
221 Amt = ConstantInt::get(SVT,
BitWidth - 1);
222 return Builder.CreateAShr(Vec, Builder.CreateVectorSplat(VWidth, Amt));
229 "Unexpected shift-by-scalar type");
234 Amt, DemandedLower,
II.getDataLayout());
236 Amt, DemandedUpper,
II.getDataLayout());
240 Amt = Builder.CreateShuffleVector(Amt, ZeroSplat);
241 return (LogicalShift ? (ShiftLeft ? Builder.CreateShl(Vec, Amt)
242 : Builder.CreateLShr(Vec, Amt))
243 : Builder.CreateAShr(Vec, Amt));
256 "Unexpected shift-by-scalar type");
260 for (
unsigned i = 0, NumSubElts = 64 /
BitWidth; i != NumSubElts; ++i) {
261 unsigned SubEltIdx = (NumSubElts - 1) - i;
264 Count |= SubElt->getValue().zextOrTrunc(64);
282 auto ShiftAmt = ConstantInt::get(SVT,
Count.zextOrTrunc(
BitWidth));
283 auto ShiftVec = Builder.CreateVectorSplat(VWidth, ShiftAmt);
286 return Builder.CreateShl(Vec, ShiftVec);
289 return Builder.CreateLShr(Vec, ShiftVec);
291 return Builder.CreateAShr(Vec, ShiftVec);
2183 auto SimplifyDemandedVectorEltsLow = [&IC](
Value *
Op,
unsigned Width,
2184 unsigned DemandedWidth) {
2185 APInt UndefElts(Width, 0);
2192 case Intrinsic::x86_bmi_bextr_32:
2193 case Intrinsic::x86_bmi_bextr_64:
2194 case Intrinsic::x86_tbm_bextri_u32:
2195 case Intrinsic::x86_tbm_bextri_u64:
2198 uint64_t Shift =
C->getZExtValue();
2199 uint64_t
Length = (Shift >> 8) & 0xff;
2201 unsigned BitWidth =
II.getType()->getIntegerBitWidth();
2208 uint64_t Result = InC->getZExtValue() >> Shift;
2213 ConstantInt::get(
II.getType(), Result));
2220 case Intrinsic::x86_bmi_bzhi_32:
2221 case Intrinsic::x86_bmi_bzhi_64:
2224 uint64_t Index =
C->getZExtValue() & 0xff;
2225 unsigned BitWidth =
II.getType()->getIntegerBitWidth();
2234 uint64_t Result = InC->getZExtValue();
2237 ConstantInt::get(
II.getType(), Result));
2243 case Intrinsic::x86_sse_cvtss2si:
2244 case Intrinsic::x86_sse_cvtss2si64:
2245 case Intrinsic::x86_sse_cvttss2si:
2246 case Intrinsic::x86_sse_cvttss2si64:
2247 case Intrinsic::x86_sse2_cvtsd2si:
2248 case Intrinsic::x86_sse2_cvtsd2si64:
2249 case Intrinsic::x86_sse2_cvttsd2si:
2250 case Intrinsic::x86_sse2_cvttsd2si64:
2251 case Intrinsic::x86_avx512_vcvtss2si32:
2252 case Intrinsic::x86_avx512_vcvtss2si64:
2253 case Intrinsic::x86_avx512_vcvtss2usi32:
2254 case Intrinsic::x86_avx512_vcvtss2usi64:
2255 case Intrinsic::x86_avx512_vcvtsd2si32:
2256 case Intrinsic::x86_avx512_vcvtsd2si64:
2257 case Intrinsic::x86_avx512_vcvtsd2usi32:
2258 case Intrinsic::x86_avx512_vcvtsd2usi64:
2259 case Intrinsic::x86_avx512_cvttss2si:
2260 case Intrinsic::x86_avx512_cvttss2si64:
2261 case Intrinsic::x86_avx512_cvttss2usi:
2262 case Intrinsic::x86_avx512_cvttss2usi64:
2263 case Intrinsic::x86_avx512_cvttsd2si:
2264 case Intrinsic::x86_avx512_cvttsd2si64:
2265 case Intrinsic::x86_avx512_cvttsd2usi:
2266 case Intrinsic::x86_avx512_cvttsd2usi64: {
2269 Value *Arg =
II.getArgOperand(0);
2271 if (
Value *V = SimplifyDemandedVectorEltsLow(Arg, VWidth, 1)) {
2277 case Intrinsic::x86_mmx_pmovmskb:
2278 case Intrinsic::x86_sse_movmsk_ps:
2279 case Intrinsic::x86_sse2_movmsk_pd:
2280 case Intrinsic::x86_sse2_pmovmskb_128:
2281 case Intrinsic::x86_avx_movmsk_pd_256:
2282 case Intrinsic::x86_avx_movmsk_ps_256:
2283 case Intrinsic::x86_avx2_pmovmskb:
2289 case Intrinsic::x86_sse_comieq_ss:
2290 case Intrinsic::x86_sse_comige_ss:
2291 case Intrinsic::x86_sse_comigt_ss:
2292 case Intrinsic::x86_sse_comile_ss:
2293 case Intrinsic::x86_sse_comilt_ss:
2294 case Intrinsic::x86_sse_comineq_ss:
2295 case Intrinsic::x86_sse_ucomieq_ss:
2296 case Intrinsic::x86_sse_ucomige_ss:
2297 case Intrinsic::x86_sse_ucomigt_ss:
2298 case Intrinsic::x86_sse_ucomile_ss:
2299 case Intrinsic::x86_sse_ucomilt_ss:
2300 case Intrinsic::x86_sse_ucomineq_ss:
2301 case Intrinsic::x86_sse2_comieq_sd:
2302 case Intrinsic::x86_sse2_comige_sd:
2303 case Intrinsic::x86_sse2_comigt_sd:
2304 case Intrinsic::x86_sse2_comile_sd:
2305 case Intrinsic::x86_sse2_comilt_sd:
2306 case Intrinsic::x86_sse2_comineq_sd:
2307 case Intrinsic::x86_sse2_ucomieq_sd:
2308 case Intrinsic::x86_sse2_ucomige_sd:
2309 case Intrinsic::x86_sse2_ucomigt_sd:
2310 case Intrinsic::x86_sse2_ucomile_sd:
2311 case Intrinsic::x86_sse2_ucomilt_sd:
2312 case Intrinsic::x86_sse2_ucomineq_sd:
2313 case Intrinsic::x86_avx512_vcomi_ss:
2314 case Intrinsic::x86_avx512_vcomi_sd:
2315 case Intrinsic::x86_avx512_mask_cmp_ss:
2316 case Intrinsic::x86_avx512_mask_cmp_sd: {
2319 bool MadeChange =
false;
2320 Value *Arg0 =
II.getArgOperand(0);
2321 Value *Arg1 =
II.getArgOperand(1);
2323 if (
Value *V = SimplifyDemandedVectorEltsLow(Arg0, VWidth, 1)) {
2327 if (
Value *V = SimplifyDemandedVectorEltsLow(Arg1, VWidth, 1)) {
2337 case Intrinsic::x86_avx512_add_ps_512:
2338 case Intrinsic::x86_avx512_div_ps_512:
2339 case Intrinsic::x86_avx512_mul_ps_512:
2340 case Intrinsic::x86_avx512_sub_ps_512:
2341 case Intrinsic::x86_avx512_add_pd_512:
2342 case Intrinsic::x86_avx512_div_pd_512:
2343 case Intrinsic::x86_avx512_mul_pd_512:
2344 case Intrinsic::x86_avx512_sub_pd_512:
2348 if (R->getValue() == 4) {
2349 Value *Arg0 =
II.getArgOperand(0);
2350 Value *Arg1 =
II.getArgOperand(1);
2356 case Intrinsic::x86_avx512_add_ps_512:
2357 case Intrinsic::x86_avx512_add_pd_512:
2360 case Intrinsic::x86_avx512_sub_ps_512:
2361 case Intrinsic::x86_avx512_sub_pd_512:
2364 case Intrinsic::x86_avx512_mul_ps_512:
2365 case Intrinsic::x86_avx512_mul_pd_512:
2368 case Intrinsic::x86_avx512_div_ps_512:
2369 case Intrinsic::x86_avx512_div_pd_512:
2379 case Intrinsic::x86_avx512_mask_add_ss_round:
2380 case Intrinsic::x86_avx512_mask_div_ss_round:
2381 case Intrinsic::x86_avx512_mask_mul_ss_round:
2382 case Intrinsic::x86_avx512_mask_sub_ss_round:
2383 case Intrinsic::x86_avx512_mask_add_sd_round:
2384 case Intrinsic::x86_avx512_mask_div_sd_round:
2385 case Intrinsic::x86_avx512_mask_mul_sd_round:
2386 case Intrinsic::x86_avx512_mask_sub_sd_round:
2390 if (R->getValue() == 4) {
2392 Value *Arg0 =
II.getArgOperand(0);
2393 Value *Arg1 =
II.getArgOperand(1);
2401 case Intrinsic::x86_avx512_mask_add_ss_round:
2402 case Intrinsic::x86_avx512_mask_add_sd_round:
2405 case Intrinsic::x86_avx512_mask_sub_ss_round:
2406 case Intrinsic::x86_avx512_mask_sub_sd_round:
2409 case Intrinsic::x86_avx512_mask_mul_ss_round:
2410 case Intrinsic::x86_avx512_mask_mul_sd_round:
2413 case Intrinsic::x86_avx512_mask_div_ss_round:
2414 case Intrinsic::x86_avx512_mask_div_sd_round:
2420 Value *Mask =
II.getArgOperand(3);
2423 if (!
C || !
C->getValue()[0]) {
2448 case Intrinsic::x86_sse_max_ps:
2449 case Intrinsic::x86_sse2_max_pd:
2450 case Intrinsic::x86_avx_max_pd_256:
2451 case Intrinsic::x86_avx_max_ps_256:
2452 case Intrinsic::x86_avx512_max_pd_512:
2453 case Intrinsic::x86_avx512_max_ps_512:
2454 case Intrinsic::x86_avx512fp16_max_ph_128:
2455 case Intrinsic::x86_avx512fp16_max_ph_256:
2456 case Intrinsic::x86_avx512fp16_max_ph_512:
2460 case Intrinsic::x86_sse_max_ss:
2461 case Intrinsic::x86_sse2_max_sd: {
2467 case Intrinsic::x86_sse_min_ps:
2468 case Intrinsic::x86_sse2_min_pd:
2469 case Intrinsic::x86_avx_min_pd_256:
2470 case Intrinsic::x86_avx_min_ps_256:
2471 case Intrinsic::x86_avx512_min_pd_512:
2472 case Intrinsic::x86_avx512_min_ps_512:
2473 case Intrinsic::x86_avx512fp16_min_ph_128:
2474 case Intrinsic::x86_avx512fp16_min_ph_256:
2475 case Intrinsic::x86_avx512fp16_min_ph_512:
2480 case Intrinsic::x86_sse_min_ss:
2481 case Intrinsic::x86_sse2_min_sd: {
2490 case Intrinsic::x86_sse2_psrai_d:
2491 case Intrinsic::x86_sse2_psrai_w:
2492 case Intrinsic::x86_avx2_psrai_d:
2493 case Intrinsic::x86_avx2_psrai_w:
2494 case Intrinsic::x86_avx512_psrai_q_128:
2495 case Intrinsic::x86_avx512_psrai_q_256:
2496 case Intrinsic::x86_avx512_psrai_d_512:
2497 case Intrinsic::x86_avx512_psrai_q_512:
2498 case Intrinsic::x86_avx512_psrai_w_512:
2499 case Intrinsic::x86_sse2_psrli_d:
2500 case Intrinsic::x86_sse2_psrli_q:
2501 case Intrinsic::x86_sse2_psrli_w:
2502 case Intrinsic::x86_avx2_psrli_d:
2503 case Intrinsic::x86_avx2_psrli_q:
2504 case Intrinsic::x86_avx2_psrli_w:
2505 case Intrinsic::x86_avx512_psrli_d_512:
2506 case Intrinsic::x86_avx512_psrli_q_512:
2507 case Intrinsic::x86_avx512_psrli_w_512:
2508 case Intrinsic::x86_sse2_pslli_d:
2509 case Intrinsic::x86_sse2_pslli_q:
2510 case Intrinsic::x86_sse2_pslli_w:
2511 case Intrinsic::x86_avx2_pslli_d:
2512 case Intrinsic::x86_avx2_pslli_q:
2513 case Intrinsic::x86_avx2_pslli_w:
2514 case Intrinsic::x86_avx512_pslli_d_512:
2515 case Intrinsic::x86_avx512_pslli_q_512:
2516 case Intrinsic::x86_avx512_pslli_w_512:
2522 case Intrinsic::x86_sse2_psra_d:
2523 case Intrinsic::x86_sse2_psra_w:
2524 case Intrinsic::x86_avx2_psra_d:
2525 case Intrinsic::x86_avx2_psra_w:
2526 case Intrinsic::x86_avx512_psra_q_128:
2527 case Intrinsic::x86_avx512_psra_q_256:
2528 case Intrinsic::x86_avx512_psra_d_512:
2529 case Intrinsic::x86_avx512_psra_q_512:
2530 case Intrinsic::x86_avx512_psra_w_512:
2531 case Intrinsic::x86_sse2_psrl_d:
2532 case Intrinsic::x86_sse2_psrl_q:
2533 case Intrinsic::x86_sse2_psrl_w:
2534 case Intrinsic::x86_avx2_psrl_d:
2535 case Intrinsic::x86_avx2_psrl_q:
2536 case Intrinsic::x86_avx2_psrl_w:
2537 case Intrinsic::x86_avx512_psrl_d_512:
2538 case Intrinsic::x86_avx512_psrl_q_512:
2539 case Intrinsic::x86_avx512_psrl_w_512:
2540 case Intrinsic::x86_sse2_psll_d:
2541 case Intrinsic::x86_sse2_psll_q:
2542 case Intrinsic::x86_sse2_psll_w:
2543 case Intrinsic::x86_avx2_psll_d:
2544 case Intrinsic::x86_avx2_psll_q:
2545 case Intrinsic::x86_avx2_psll_w:
2546 case Intrinsic::x86_avx512_psll_d_512:
2547 case Intrinsic::x86_avx512_psll_q_512:
2548 case Intrinsic::x86_avx512_psll_w_512: {
2555 Value *Arg1 =
II.getArgOperand(1);
2557 "Unexpected packed shift size");
2560 if (
Value *V = SimplifyDemandedVectorEltsLow(Arg1, VWidth, VWidth / 2)) {
2566 case Intrinsic::x86_avx2_psllv_d:
2567 case Intrinsic::x86_avx2_psllv_d_256:
2568 case Intrinsic::x86_avx2_psllv_q:
2569 case Intrinsic::x86_avx2_psllv_q_256:
2570 case Intrinsic::x86_avx512_psllv_d_512:
2571 case Intrinsic::x86_avx512_psllv_q_512:
2572 case Intrinsic::x86_avx512_psllv_w_128:
2573 case Intrinsic::x86_avx512_psllv_w_256:
2574 case Intrinsic::x86_avx512_psllv_w_512:
2575 case Intrinsic::x86_avx2_psrav_d:
2576 case Intrinsic::x86_avx2_psrav_d_256:
2577 case Intrinsic::x86_avx512_psrav_q_128:
2578 case Intrinsic::x86_avx512_psrav_q_256:
2579 case Intrinsic::x86_avx512_psrav_d_512:
2580 case Intrinsic::x86_avx512_psrav_q_512:
2581 case Intrinsic::x86_avx512_psrav_w_128:
2582 case Intrinsic::x86_avx512_psrav_w_256:
2583 case Intrinsic::x86_avx512_psrav_w_512:
2584 case Intrinsic::x86_avx2_psrlv_d:
2585 case Intrinsic::x86_avx2_psrlv_d_256:
2586 case Intrinsic::x86_avx2_psrlv_q:
2587 case Intrinsic::x86_avx2_psrlv_q_256:
2588 case Intrinsic::x86_avx512_psrlv_d_512:
2589 case Intrinsic::x86_avx512_psrlv_q_512:
2590 case Intrinsic::x86_avx512_psrlv_w_128:
2591 case Intrinsic::x86_avx512_psrlv_w_256:
2592 case Intrinsic::x86_avx512_psrlv_w_512:
2598 case Intrinsic::x86_sse2_packssdw_128:
2599 case Intrinsic::x86_sse2_packsswb_128:
2600 case Intrinsic::x86_avx2_packssdw:
2601 case Intrinsic::x86_avx2_packsswb:
2602 case Intrinsic::x86_avx512_packssdw_512:
2603 case Intrinsic::x86_avx512_packsswb_512:
2609 case Intrinsic::x86_sse2_packuswb_128:
2610 case Intrinsic::x86_sse41_packusdw:
2611 case Intrinsic::x86_avx2_packusdw:
2612 case Intrinsic::x86_avx2_packuswb:
2613 case Intrinsic::x86_avx512_packusdw_512:
2614 case Intrinsic::x86_avx512_packuswb_512:
2620 case Intrinsic::x86_ssse3_pmul_hr_sw_128:
2621 case Intrinsic::x86_avx2_pmul_hr_sw:
2622 case Intrinsic::x86_avx512_pmul_hr_sw_512:
2628 case Intrinsic::x86_sse2_pmadd_wd:
2629 case Intrinsic::x86_avx2_pmadd_wd:
2630 case Intrinsic::x86_avx512_pmaddw_d_512:
2636 case Intrinsic::x86_ssse3_pmadd_ub_sw_128:
2637 case Intrinsic::x86_avx2_pmadd_ub_sw:
2638 case Intrinsic::x86_avx512_pmaddubs_w_512:
2644 case Intrinsic::x86_pclmulqdq:
2645 case Intrinsic::x86_pclmulqdq_256:
2646 case Intrinsic::x86_pclmulqdq_512: {
2648 unsigned Imm =
C->getZExtValue();
2650 bool MadeChange =
false;
2651 Value *Arg0 =
II.getArgOperand(0);
2652 Value *Arg1 =
II.getArgOperand(1);
2656 APInt UndefElts1(VWidth, 0);
2657 APInt DemandedElts1 =
2665 APInt UndefElts2(VWidth, 0);
2666 APInt DemandedElts2 =
2688 case Intrinsic::x86_sse41_insertps:
2694 case Intrinsic::x86_sse4a_extrq: {
2695 Value *Op0 =
II.getArgOperand(0);
2696 Value *Op1 =
II.getArgOperand(1);
2701 VWidth1 == 16 &&
"Unexpected operand sizes");
2719 bool MadeChange =
false;
2720 if (
Value *V = SimplifyDemandedVectorEltsLow(Op0, VWidth0, 1)) {
2724 if (
Value *V = SimplifyDemandedVectorEltsLow(Op1, VWidth1, 2)) {
2734 case Intrinsic::x86_sse4a_extrqi: {
2737 Value *Op0 =
II.getArgOperand(0);
2740 "Unexpected operand size");
2753 if (
Value *V = SimplifyDemandedVectorEltsLow(Op0, VWidth, 1)) {
2759 case Intrinsic::x86_sse4a_insertq: {
2760 Value *Op0 =
II.getArgOperand(0);
2761 Value *Op1 =
II.getArgOperand(1);
2766 "Unexpected operand size");
2776 const APInt &V11 = CI11->getValue();
2786 if (
Value *V = SimplifyDemandedVectorEltsLow(Op0, VWidth, 1)) {
2792 case Intrinsic::x86_sse4a_insertqi: {
2796 Value *Op0 =
II.getArgOperand(0);
2797 Value *Op1 =
II.getArgOperand(1);
2802 VWidth1 == 2 &&
"Unexpected operand sizes");
2809 if (CILength && CIIndex) {
2810 APInt Len = CILength->getValue().zextOrTrunc(6);
2819 bool MadeChange =
false;
2820 if (
Value *V = SimplifyDemandedVectorEltsLow(Op0, VWidth0, 1)) {
2824 if (
Value *V = SimplifyDemandedVectorEltsLow(Op1, VWidth1, 1)) {
2834 case Intrinsic::x86_sse41_pblendvb:
2835 case Intrinsic::x86_sse41_blendvps:
2836 case Intrinsic::x86_sse41_blendvpd:
2837 case Intrinsic::x86_avx_blendv_ps_256:
2838 case Intrinsic::x86_avx_blendv_pd_256:
2839 case Intrinsic::x86_avx2_pblendvb: {
2842 Value *Op0 =
II.getArgOperand(0);
2843 Value *Op1 =
II.getArgOperand(1);
2844 Value *Mask =
II.getArgOperand(2);
2860 unsigned BitWidth = Mask->getType()->getScalarSizeInBits();
2862 if (Mask->getType()->isIntOrIntVectorTy()) {
2867 if (BC->hasOneUse()) {
2868 Value *Src = BC->getOperand(0);
2869 if (Src->getType()->isIntOrIntVectorTy()) {
2870 unsigned SrcBitWidth = Src->getType()->getScalarSizeInBits();
2886 if (MaskTy->getScalarSizeInBits() ==
OpTy->getScalarSizeInBits()) {
2898 Value *MaskSrc =
nullptr;
2901 m_Mask(ShuffleMask))))) {
2904 if (NumElts < (
int)ShuffleMask.size() || !
isPowerOf2_32(NumElts) ||
2906 [NumElts](
int M) {
return M < 0 || M >= NumElts; }))
2918 unsigned NumMaskElts = MaskTy->getNumElements();
2919 unsigned NumOperandElts =
OpTy->getNumElements();
2923 unsigned NumMaskSrcElts =
2925 NumMaskElts = (ShuffleMask.size() * NumMaskElts) / NumMaskSrcElts;
2927 if (NumMaskElts > NumOperandElts)
2935 assert(MaskTy->getPrimitiveSizeInBits() ==
2936 OpTy->getPrimitiveSizeInBits() &&
2937 "Not expecting mask and operands with different sizes");
2939 if (NumMaskElts == NumOperandElts) {
2945 if (NumMaskElts < NumOperandElts) {
2956 case Intrinsic::x86_ssse3_pshuf_b_128:
2957 case Intrinsic::x86_avx2_pshuf_b:
2958 case Intrinsic::x86_avx512_pshuf_b_512: {
2969 case Intrinsic::x86_avx_vpermilvar_ps:
2970 case Intrinsic::x86_avx_vpermilvar_ps_256:
2971 case Intrinsic::x86_avx512_vpermilvar_ps_512: {
2982 case Intrinsic::x86_avx_vpermilvar_pd:
2983 case Intrinsic::x86_avx_vpermilvar_pd_256:
2984 case Intrinsic::x86_avx512_vpermilvar_pd_512: {
2995 case Intrinsic::x86_avx2_permd:
2996 case Intrinsic::x86_avx2_permps:
2997 case Intrinsic::x86_avx512_permvar_df_256:
2998 case Intrinsic::x86_avx512_permvar_df_512:
2999 case Intrinsic::x86_avx512_permvar_di_256:
3000 case Intrinsic::x86_avx512_permvar_di_512:
3001 case Intrinsic::x86_avx512_permvar_hi_128:
3002 case Intrinsic::x86_avx512_permvar_hi_256:
3003 case Intrinsic::x86_avx512_permvar_hi_512:
3004 case Intrinsic::x86_avx512_permvar_qi_128:
3005 case Intrinsic::x86_avx512_permvar_qi_256:
3006 case Intrinsic::x86_avx512_permvar_qi_512:
3007 case Intrinsic::x86_avx512_permvar_sf_512:
3008 case Intrinsic::x86_avx512_permvar_si_512:
3016 case Intrinsic::x86_avx512_vpermi2var_d_128:
3017 case Intrinsic::x86_avx512_vpermi2var_d_256:
3018 case Intrinsic::x86_avx512_vpermi2var_d_512:
3019 case Intrinsic::x86_avx512_vpermi2var_hi_128:
3020 case Intrinsic::x86_avx512_vpermi2var_hi_256:
3021 case Intrinsic::x86_avx512_vpermi2var_hi_512:
3022 case Intrinsic::x86_avx512_vpermi2var_pd_128:
3023 case Intrinsic::x86_avx512_vpermi2var_pd_256:
3024 case Intrinsic::x86_avx512_vpermi2var_pd_512:
3025 case Intrinsic::x86_avx512_vpermi2var_ps_128:
3026 case Intrinsic::x86_avx512_vpermi2var_ps_256:
3027 case Intrinsic::x86_avx512_vpermi2var_ps_512:
3028 case Intrinsic::x86_avx512_vpermi2var_q_128:
3029 case Intrinsic::x86_avx512_vpermi2var_q_256:
3030 case Intrinsic::x86_avx512_vpermi2var_q_512:
3031 case Intrinsic::x86_avx512_vpermi2var_qi_128:
3032 case Intrinsic::x86_avx512_vpermi2var_qi_256:
3033 case Intrinsic::x86_avx512_vpermi2var_qi_512:
3041 case Intrinsic::x86_avx_maskload_ps:
3042 case Intrinsic::x86_avx_maskload_pd:
3043 case Intrinsic::x86_avx_maskload_ps_256:
3044 case Intrinsic::x86_avx_maskload_pd_256:
3045 case Intrinsic::x86_avx2_maskload_d:
3046 case Intrinsic::x86_avx2_maskload_q:
3047 case Intrinsic::x86_avx2_maskload_d_256:
3048 case Intrinsic::x86_avx2_maskload_q_256:
3054 case Intrinsic::x86_sse2_maskmov_dqu:
3055 case Intrinsic::x86_avx_maskstore_ps:
3056 case Intrinsic::x86_avx_maskstore_pd:
3057 case Intrinsic::x86_avx_maskstore_ps_256:
3058 case Intrinsic::x86_avx_maskstore_pd_256:
3059 case Intrinsic::x86_avx2_maskstore_d:
3060 case Intrinsic::x86_avx2_maskstore_q:
3061 case Intrinsic::x86_avx2_maskstore_d_256:
3062 case Intrinsic::x86_avx2_maskstore_q_256:
3068 case Intrinsic::x86_addcarry_32:
3069 case Intrinsic::x86_addcarry_64:
3075 case Intrinsic::x86_avx512_pternlog_d_128:
3076 case Intrinsic::x86_avx512_pternlog_d_256:
3077 case Intrinsic::x86_avx512_pternlog_d_512:
3078 case Intrinsic::x86_avx512_pternlog_q_128:
3079 case Intrinsic::x86_avx512_pternlog_q_256:
3080 case Intrinsic::x86_avx512_pternlog_q_512:
3086 case Intrinsic::x86_avx512_vpmadd52h_uq_128:
3087 case Intrinsic::x86_avx512_vpmadd52l_uq_128:
3088 case Intrinsic::x86_avx512_vpmadd52h_uq_256:
3089 case Intrinsic::x86_avx512_vpmadd52l_uq_256:
3090 case Intrinsic::x86_avx512_vpmadd52h_uq_512:
3091 case Intrinsic::x86_avx512_vpmadd52l_uq_512: {
3093 Value *Acc =
II.getArgOperand(0);
3104 IID, {}, {
X,
II.getArgOperand(1),
II.getArgOperand(2)});
3114 return std::nullopt;
3161 simplifyAndSetOp)
const {
3163 switch (
II.getIntrinsicID()) {
3166 case Intrinsic::x86_xop_vfrcz_ss:
3167 case Intrinsic::x86_xop_vfrcz_sd:
3172 if (!DemandedElts[0]) {
3179 simplifyAndSetOp(&
II, 0, DemandedElts, UndefElts);
3182 UndefElts = UndefElts[0];
3186 case Intrinsic::x86_sse_rcp_ss:
3187 case Intrinsic::x86_sse_rsqrt_ss:
3188 simplifyAndSetOp(&
II, 0, DemandedElts, UndefElts);
3191 if (!DemandedElts[0]) {
3193 return II.getArgOperand(0);
3202 case Intrinsic::x86_sse_min_ss:
3203 case Intrinsic::x86_sse_max_ss:
3204 case Intrinsic::x86_sse_cmp_ss:
3205 case Intrinsic::x86_sse2_min_sd:
3206 case Intrinsic::x86_sse2_max_sd:
3207 case Intrinsic::x86_sse2_cmp_sd: {
3208 simplifyAndSetOp(&
II, 0, DemandedElts, UndefElts);
3211 if (!DemandedElts[0]) {
3213 return II.getArgOperand(0);
3218 simplifyAndSetOp(&
II, 1, DemandedElts, UndefElts2);
3230 case Intrinsic::x86_sse41_round_ss:
3231 case Intrinsic::x86_sse41_round_sd: {
3233 APInt DemandedElts2 = DemandedElts;
3235 simplifyAndSetOp(&
II, 0, DemandedElts2, UndefElts);
3238 if (!DemandedElts[0]) {
3240 return II.getArgOperand(0);
3245 simplifyAndSetOp(&
II, 1, DemandedElts, UndefElts2);
3250 UndefElts |= UndefElts2[0];
3257 case Intrinsic::x86_avx512_mask_add_ss_round:
3258 case Intrinsic::x86_avx512_mask_div_ss_round:
3259 case Intrinsic::x86_avx512_mask_mul_ss_round:
3260 case Intrinsic::x86_avx512_mask_sub_ss_round:
3261 case Intrinsic::x86_avx512_mask_max_ss_round:
3262 case Intrinsic::x86_avx512_mask_min_ss_round:
3263 case Intrinsic::x86_avx512_mask_add_sd_round:
3264 case Intrinsic::x86_avx512_mask_div_sd_round:
3265 case Intrinsic::x86_avx512_mask_mul_sd_round:
3266 case Intrinsic::x86_avx512_mask_sub_sd_round:
3267 case Intrinsic::x86_avx512_mask_max_sd_round:
3268 case Intrinsic::x86_avx512_mask_min_sd_round:
3269 simplifyAndSetOp(&
II, 0, DemandedElts, UndefElts);
3272 if (!DemandedElts[0]) {
3274 return II.getArgOperand(0);
3279 simplifyAndSetOp(&
II, 1, DemandedElts, UndefElts2);
3280 simplifyAndSetOp(&
II, 2, DemandedElts, UndefElts3);
3284 if (!UndefElts2[0] || !UndefElts3[0])
3289 case Intrinsic::x86_sse3_addsub_pd:
3290 case Intrinsic::x86_sse3_addsub_ps:
3291 case Intrinsic::x86_avx_addsub_pd_256:
3292 case Intrinsic::x86_avx_addsub_ps_256: {
3297 bool IsSubOnly = DemandedElts.
isSubsetOf(SubMask);
3298 bool IsAddOnly = DemandedElts.
isSubsetOf(AddMask);
3299 if (IsSubOnly || IsAddOnly) {
3300 assert((IsSubOnly ^ IsAddOnly) &&
"Can't be both add-only and sub-only");
3303 Value *Arg0 =
II.getArgOperand(0), *Arg1 =
II.getArgOperand(1);
3305 IsSubOnly ? Instruction::FSub : Instruction::FAdd, Arg0, Arg1);
3308 simplifyAndSetOp(&
II, 0, DemandedElts, UndefElts);
3309 simplifyAndSetOp(&
II, 1, DemandedElts, UndefElts2);
3310 UndefElts &= UndefElts2;
3315 case Intrinsic::x86_avx2_psllv_d:
3316 case Intrinsic::x86_avx2_psllv_d_256:
3317 case Intrinsic::x86_avx2_psllv_q:
3318 case Intrinsic::x86_avx2_psllv_q_256:
3319 case Intrinsic::x86_avx2_psrlv_d:
3320 case Intrinsic::x86_avx2_psrlv_d_256:
3321 case Intrinsic::x86_avx2_psrlv_q:
3322 case Intrinsic::x86_avx2_psrlv_q_256:
3323 case Intrinsic::x86_avx2_psrav_d:
3324 case Intrinsic::x86_avx2_psrav_d_256: {
3325 simplifyAndSetOp(&
II, 0, DemandedElts, UndefElts);
3326 simplifyAndSetOp(&
II, 1, DemandedElts, UndefElts2);
3327 UndefElts &= UndefElts2;
3331 case Intrinsic::x86_ssse3_pmul_hr_sw_128:
3332 case Intrinsic::x86_avx2_pmul_hr_sw:
3333 case Intrinsic::x86_avx512_pmul_hr_sw_512: {
3334 simplifyAndSetOp(&
II, 0, DemandedElts, UndefElts);
3335 simplifyAndSetOp(&
II, 1, DemandedElts, UndefElts2);
3340 case Intrinsic::x86_sse2_packssdw_128:
3341 case Intrinsic::x86_sse2_packsswb_128:
3342 case Intrinsic::x86_sse2_packuswb_128:
3343 case Intrinsic::x86_sse41_packusdw:
3344 case Intrinsic::x86_avx2_packssdw:
3345 case Intrinsic::x86_avx2_packsswb:
3346 case Intrinsic::x86_avx2_packusdw:
3347 case Intrinsic::x86_avx2_packuswb:
3348 case Intrinsic::x86_avx512_packssdw_512:
3349 case Intrinsic::x86_avx512_packsswb_512:
3350 case Intrinsic::x86_avx512_packusdw_512:
3351 case Intrinsic::x86_avx512_packuswb_512: {
3352 auto *Ty0 =
II.getArgOperand(0)->getType();
3354 assert(VWidth == (InnerVWidth * 2) &&
"Unexpected input size");
3356 unsigned NumLanes = Ty0->getPrimitiveSizeInBits() / 128;
3357 unsigned VWidthPerLane = VWidth / NumLanes;
3358 unsigned InnerVWidthPerLane = InnerVWidth / NumLanes;
3364 for (
int OpNum = 0; OpNum != 2; ++OpNum) {
3365 APInt OpDemandedElts(InnerVWidth, 0);
3366 for (
unsigned Lane = 0; Lane != NumLanes; ++Lane) {
3367 unsigned LaneIdx = Lane * VWidthPerLane;
3368 for (
unsigned Elt = 0; Elt != InnerVWidthPerLane; ++Elt) {
3369 unsigned Idx = LaneIdx + Elt + InnerVWidthPerLane * OpNum;
3370 if (DemandedElts[Idx])
3371 OpDemandedElts.
setBit((Lane * InnerVWidthPerLane) + Elt);
3376 APInt OpUndefElts(InnerVWidth, 0);
3377 simplifyAndSetOp(&
II, OpNum, OpDemandedElts, OpUndefElts);
3380 OpUndefElts = OpUndefElts.
zext(VWidth);
3381 for (
unsigned Lane = 0; Lane != NumLanes; ++Lane) {
3382 APInt LaneElts = OpUndefElts.
lshr(InnerVWidthPerLane * Lane);
3383 LaneElts = LaneElts.
getLoBits(InnerVWidthPerLane);
3384 LaneElts <<= InnerVWidthPerLane * (2 * Lane + OpNum);
3385 UndefElts |= LaneElts;
3391 case Intrinsic::x86_sse2_pmadd_wd:
3392 case Intrinsic::x86_avx2_pmadd_wd:
3393 case Intrinsic::x86_avx512_pmaddw_d_512:
3394 case Intrinsic::x86_ssse3_pmadd_ub_sw_128:
3395 case Intrinsic::x86_avx2_pmadd_ub_sw:
3396 case Intrinsic::x86_avx512_pmaddubs_w_512: {
3398 auto *ArgTy =
II.getArgOperand(0)->getType();
3400 assert((VWidth * 2) == InnerVWidth &&
"Unexpected input size");
3402 APInt Op0UndefElts(InnerVWidth, 0);
3403 APInt Op1UndefElts(InnerVWidth, 0);
3404 simplifyAndSetOp(&
II, 0, OpDemandedElts, Op0UndefElts);
3405 simplifyAndSetOp(&
II, 1, OpDemandedElts, Op1UndefElts);
3411 case Intrinsic::x86_ssse3_pshuf_b_128:
3412 case Intrinsic::x86_avx2_pshuf_b:
3413 case Intrinsic::x86_avx512_pshuf_b_512:
3415 case Intrinsic::x86_avx_vpermilvar_ps:
3416 case Intrinsic::x86_avx_vpermilvar_ps_256:
3417 case Intrinsic::x86_avx512_vpermilvar_ps_512:
3418 case Intrinsic::x86_avx_vpermilvar_pd:
3419 case Intrinsic::x86_avx_vpermilvar_pd_256:
3420 case Intrinsic::x86_avx512_vpermilvar_pd_512:
3422 case Intrinsic::x86_avx2_permd:
3423 case Intrinsic::x86_avx2_permps: {
3424 simplifyAndSetOp(&
II, 1, DemandedElts, UndefElts);
3430 case Intrinsic::x86_sse4a_extrq:
3431 case Intrinsic::x86_sse4a_extrqi:
3432 case Intrinsic::x86_sse4a_insertq:
3433 case Intrinsic::x86_sse4a_insertqi:
3437 return std::nullopt;