37#define DEBUG_TYPE "x86-fixup-inst-tuning"
39STATISTIC(NumInstChanges,
"Number of instructions changes");
42class X86FixupInstTuningImpl {
60 X86FixupInstTuningLegacy() : MachineFunctionPass(ID) {}
62 StringRef getPassName()
const override {
return "X86 Fixup Inst Tuning"; }
69 MachineFunctionProperties getRequiredProperties()
const override {
70 return MachineFunctionProperties().setNoVRegs();
75char X86FixupInstTuningLegacy ::ID = 0;
80 return new X86FixupInstTuningLegacy();
85 if (NewVal.has_value() && CurVal.has_value() && *NewVal != *CurVal)
86 return *NewVal < *CurVal;
91bool X86FixupInstTuningImpl::processInstruction(
94 MachineInstr &
MI = *
I;
95 unsigned Opc =
MI.getOpcode();
96 unsigned NumOperands =
MI.getDesc().getNumOperands();
99 auto GetInstTput = [&](
unsigned Opcode) -> std::optional<double> {
105 auto GetInstLat = [&](
unsigned Opcode) -> std::optional<double> {
111 auto GetInstSize = [&](
unsigned Opcode) -> std::optional<unsigned> {
118 auto NewOpcPreferable = [&](
unsigned NewOpc,
119 bool ReplaceInTie =
true) ->
bool {
120 std::optional<bool> Res;
145 auto ProcessVPERMILPDri = [&](
unsigned NewOpc) ->
bool {
146 if (!NewOpcPreferable(NewOpc))
150 unsigned MaskImm =
MI.getOperand(NumOperands - 1).getImm();
151 MI.removeOperand(NumOperands - 1);
152 MI.addOperand(
MI.getOperand(NumOperands - 2));
153 MI.setDesc(
TII->get(NewOpc));
164 auto ProcessVPERMILPSri = [&](
unsigned NewOpc) ->
bool {
165 if (!NewOpcPreferable(NewOpc))
169 unsigned MaskImm =
MI.getOperand(NumOperands - 1).getImm();
170 MI.removeOperand(NumOperands - 1);
171 MI.addOperand(
MI.getOperand(NumOperands - 2));
172 MI.setDesc(
TII->get(NewOpc));
182 auto ProcessVPERMILPSmi = [&](
unsigned NewOpc) ->
bool {
186 !NewOpcPreferable(NewOpc,
false))
190 MI.setDesc(
TII->get(NewOpc));
210 auto ProcessUNPCK = [&](
unsigned NewOpc,
unsigned MaskImm) ->
bool {
211 if (!NewOpcPreferable(NewOpc,
false))
215 MI.setDesc(
TII->get(NewOpc));
222 auto ProcessUNPCKToIntDomain = [&](
unsigned NewOpc) ->
bool {
227 !NewOpcPreferable(NewOpc,
false))
231 MI.setDesc(
TII->get(NewOpc));
237 auto ProcessUNPCKLPDrr = [&](
unsigned NewOpcIntDomain,
238 unsigned NewOpc) ->
bool {
239 if (ProcessUNPCKToIntDomain(NewOpcIntDomain))
241 return ProcessUNPCK(NewOpc, 0x00);
243 auto ProcessUNPCKHPDrr = [&](
unsigned NewOpcIntDomain,
244 unsigned NewOpc) ->
bool {
245 if (ProcessUNPCKToIntDomain(NewOpcIntDomain))
247 return ProcessUNPCK(NewOpc, 0xff);
250 auto ProcessUNPCKPDrm = [&](
unsigned NewOpcIntDomain) ->
bool {
251 return ProcessUNPCKToIntDomain(NewOpcIntDomain);
254 auto ProcessUNPCKPS = [&](
unsigned NewOpc) ->
bool {
255 return ProcessUNPCKToIntDomain(NewOpc);
260 auto ProcessMOVPDToMOVPS = [&](
unsigned NewOpc) ->
bool {
261 assert(NewOpcPreferable(NewOpc) &&
262 "MOVUPS/MOVAPS should be preferred over MOVUPD/MOVAPD");
266 MI.setDesc(
TII->get(NewOpc));
273 auto ProcessVPERM2x128ToVINSERT128 = [&](
unsigned InsertOpc) ->
bool {
274 unsigned PermImm =
MI.getOperand(NumOperands - 1).getImm();
276 if (PermImm != 0x20 || !NewOpcPreferable(InsertOpc))
278 Register RHSRegYMM =
MI.getOperand(NumOperands - 2).getReg();
279 Register RHSRegXMM =
TRI->getSubReg(RHSRegYMM, X86::sub_xmm);
282 MI.setDesc(
TII->get(InsertOpc));
283 MI.removeOperand(NumOperands - 1);
284 MI.removeOperand(NumOperands - 2);
296 auto ProcessBLENDWToBLENDD = [&](
unsigned MovOpc,
unsigned NumElts) ->
bool {
297 if (!ST->
hasAVX2() || !NewOpcPreferable(MovOpc))
301 APInt(8,
MI.getOperand(NumOperands - 1).getImm(),
false,
309 MI.setDesc(
TII->get(MovOpc));
310 MI.removeOperand(NumOperands - 1);
317 auto ProcessBLENDToMOV = [&](
unsigned MovOpc,
unsigned Mask,
318 unsigned MovImm) ->
bool {
319 if ((
MI.getOperand(NumOperands - 1).getImm() & Mask) != MovImm)
321 if (!OptSize && !NewOpcPreferable(MovOpc))
325 MI.setDesc(
TII->get(MovOpc));
326 MI.removeOperand(NumOperands - 1);
333 auto ProcessShiftLeftToAdd = [&](
unsigned AddOpc) ->
bool {
334 if (
MI.getOperand(NumOperands - 1).getImm() != 1)
336 if (!NewOpcPreferable(AddOpc,
true))
340 MI.setDesc(
TII->get(AddOpc));
341 MI.removeOperand(NumOperands - 1);
342 MI.addOperand(
MI.getOperand(NumOperands - 2));
354 auto ProcessVPERMQToVINSERT128 = [&](
unsigned NewOpc) ->
bool {
355 if (
MI.getOperand(NumOperands - 1).getImm() != 0x44)
357 if (!NewOpcPreferable(NewOpc,
false))
362 Register XmmReg =
TRI->getSubReg(SrcReg, X86::sub_xmm);
368 MI.setDesc(
TII->get(NewOpc));
370 MI.removeOperand(NumOperands - 1);
383 case X86::BLENDPDrri:
384 return ProcessBLENDToMOV(X86::MOVSDrr, 0x3, 0x1);
385 case X86::VBLENDPDrri:
386 return ProcessBLENDToMOV(X86::VMOVSDrr, 0x3, 0x1);
388 case X86::BLENDPSrri:
389 return ProcessBLENDToMOV(X86::MOVSSrr, 0xF, 0x1) ||
390 ProcessBLENDToMOV(X86::MOVSDrr, 0xF, 0x3);
391 case X86::VBLENDPSrri:
392 return ProcessBLENDToMOV(X86::VMOVSSrr, 0xF, 0x1) ||
393 ProcessBLENDToMOV(X86::VMOVSDrr, 0xF, 0x3);
395 case X86::VPBLENDWrri:
399 return ProcessBLENDWToBLENDD(X86::VPBLENDDrri, 4);
401 case X86::VPERM2F128rri:
402 return ProcessVPERM2x128ToVINSERT128(X86::VINSERTF128rri);
403 case X86::VPERM2I128rri:
404 return ProcessVPERM2x128ToVINSERT128(X86::VINSERTI128rri);
406 case X86::VPERMILPDri:
407 return ProcessVPERMILPDri(X86::VSHUFPDrri);
408 case X86::VPERMILPDYri:
409 return ProcessVPERMILPDri(X86::VSHUFPDYrri);
410 case X86::VPERMILPDZ128ri:
411 return ProcessVPERMILPDri(X86::VSHUFPDZ128rri);
412 case X86::VPERMILPDZ256ri:
413 return ProcessVPERMILPDri(X86::VSHUFPDZ256rri);
414 case X86::VPERMILPDZri:
415 return ProcessVPERMILPDri(X86::VSHUFPDZrri);
416 case X86::VPERMILPDZ128rikz:
417 return ProcessVPERMILPDri(X86::VSHUFPDZ128rrikz);
418 case X86::VPERMILPDZ256rikz:
419 return ProcessVPERMILPDri(X86::VSHUFPDZ256rrikz);
420 case X86::VPERMILPDZrikz:
421 return ProcessVPERMILPDri(X86::VSHUFPDZrrikz);
422 case X86::VPERMILPDZ128rik:
423 return ProcessVPERMILPDri(X86::VSHUFPDZ128rrik);
424 case X86::VPERMILPDZ256rik:
425 return ProcessVPERMILPDri(X86::VSHUFPDZ256rrik);
426 case X86::VPERMILPDZrik:
427 return ProcessVPERMILPDri(X86::VSHUFPDZrrik);
429 case X86::VPERMILPSri:
430 return ProcessVPERMILPSri(X86::VSHUFPSrri);
431 case X86::VPERMILPSYri:
432 return ProcessVPERMILPSri(X86::VSHUFPSYrri);
433 case X86::VPERMILPSZ128ri:
434 return ProcessVPERMILPSri(X86::VSHUFPSZ128rri);
435 case X86::VPERMILPSZ256ri:
436 return ProcessVPERMILPSri(X86::VSHUFPSZ256rri);
437 case X86::VPERMILPSZri:
438 return ProcessVPERMILPSri(X86::VSHUFPSZrri);
439 case X86::VPERMILPSZ128rikz:
440 return ProcessVPERMILPSri(X86::VSHUFPSZ128rrikz);
441 case X86::VPERMILPSZ256rikz:
442 return ProcessVPERMILPSri(X86::VSHUFPSZ256rrikz);
443 case X86::VPERMILPSZrikz:
444 return ProcessVPERMILPSri(X86::VSHUFPSZrrikz);
445 case X86::VPERMILPSZ128rik:
446 return ProcessVPERMILPSri(X86::VSHUFPSZ128rrik);
447 case X86::VPERMILPSZ256rik:
448 return ProcessVPERMILPSri(X86::VSHUFPSZ256rrik);
449 case X86::VPERMILPSZrik:
450 return ProcessVPERMILPSri(X86::VSHUFPSZrrik);
451 case X86::VPERMILPSmi:
452 return ProcessVPERMILPSmi(X86::VPSHUFDmi);
453 case X86::VPERMILPSYmi:
456 return ST->
hasAVX2() ? ProcessVPERMILPSmi(X86::VPSHUFDYmi) :
false;
457 case X86::VPERMILPSZ128mi:
458 return ProcessVPERMILPSmi(X86::VPSHUFDZ128mi);
459 case X86::VPERMILPSZ256mi:
460 return ProcessVPERMILPSmi(X86::VPSHUFDZ256mi);
461 case X86::VPERMILPSZmi:
462 return ProcessVPERMILPSmi(X86::VPSHUFDZmi);
463 case X86::VPERMILPSZ128mikz:
464 return ProcessVPERMILPSmi(X86::VPSHUFDZ128mikz);
465 case X86::VPERMILPSZ256mikz:
466 return ProcessVPERMILPSmi(X86::VPSHUFDZ256mikz);
467 case X86::VPERMILPSZmikz:
468 return ProcessVPERMILPSmi(X86::VPSHUFDZmikz);
469 case X86::VPERMILPSZ128mik:
470 return ProcessVPERMILPSmi(X86::VPSHUFDZ128mik);
471 case X86::VPERMILPSZ256mik:
472 return ProcessVPERMILPSmi(X86::VPSHUFDZ256mik);
473 case X86::VPERMILPSZmik:
474 return ProcessVPERMILPSmi(X86::VPSHUFDZmik);
476 return ProcessVPERMQToVINSERT128(X86::VINSERTI128rri);
477 case X86::VPERMPDYri:
478 return ProcessVPERMQToVINSERT128(X86::VINSERTF128rri);
480 case X86::UNPCKLPDrr:
481 return ProcessUNPCKLPDrr(X86::PUNPCKLQDQrr, X86::SHUFPDrri);
482 case X86::VMOVLHPSrr:
483 case X86::VUNPCKLPDrr:
484 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQrr, X86::VSHUFPDrri);
485 case X86::VUNPCKLPDYrr:
486 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQYrr, X86::VSHUFPDYrri);
488 case X86::VMOVLHPSZrr:
489 case X86::VUNPCKLPDZ128rr:
490 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZ128rr, X86::VSHUFPDZ128rri);
491 case X86::VUNPCKLPDZ256rr:
492 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZ256rr, X86::VSHUFPDZ256rri);
493 case X86::VUNPCKLPDZrr:
494 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZrr, X86::VSHUFPDZrri);
495 case X86::VUNPCKLPDZ128rrk:
496 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZ128rrk, X86::VSHUFPDZ128rrik);
497 case X86::VUNPCKLPDZ256rrk:
498 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZ256rrk, X86::VSHUFPDZ256rrik);
499 case X86::VUNPCKLPDZrrk:
500 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZrrk, X86::VSHUFPDZrrik);
501 case X86::VUNPCKLPDZ128rrkz:
502 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZ128rrkz, X86::VSHUFPDZ128rrikz);
503 case X86::VUNPCKLPDZ256rrkz:
504 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZ256rrkz, X86::VSHUFPDZ256rrikz);
505 case X86::VUNPCKLPDZrrkz:
506 return ProcessUNPCKLPDrr(X86::VPUNPCKLQDQZrrkz, X86::VSHUFPDZrrikz);
507 case X86::UNPCKHPDrr:
508 return ProcessUNPCKHPDrr(X86::PUNPCKHQDQrr, X86::SHUFPDrri);
509 case X86::VUNPCKHPDrr:
510 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQrr, X86::VSHUFPDrri);
511 case X86::VUNPCKHPDYrr:
512 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQYrr, X86::VSHUFPDYrri);
513 case X86::VUNPCKHPDZ128rr:
514 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZ128rr, X86::VSHUFPDZ128rri);
515 case X86::VUNPCKHPDZ256rr:
516 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZ256rr, X86::VSHUFPDZ256rri);
517 case X86::VUNPCKHPDZrr:
518 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZrr, X86::VSHUFPDZrri);
519 case X86::VUNPCKHPDZ128rrk:
520 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZ128rrk, X86::VSHUFPDZ128rrik);
521 case X86::VUNPCKHPDZ256rrk:
522 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZ256rrk, X86::VSHUFPDZ256rrik);
523 case X86::VUNPCKHPDZrrk:
524 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZrrk, X86::VSHUFPDZrrik);
525 case X86::VUNPCKHPDZ128rrkz:
526 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZ128rrkz, X86::VSHUFPDZ128rrikz);
527 case X86::VUNPCKHPDZ256rrkz:
528 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZ256rrkz, X86::VSHUFPDZ256rrikz);
529 case X86::VUNPCKHPDZrrkz:
530 return ProcessUNPCKHPDrr(X86::VPUNPCKHQDQZrrkz, X86::VSHUFPDZrrikz);
531 case X86::UNPCKLPDrm:
532 return ProcessUNPCKPDrm(X86::PUNPCKLQDQrm);
533 case X86::VUNPCKLPDrm:
534 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQrm);
535 case X86::VUNPCKLPDYrm:
536 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQYrm);
537 case X86::VUNPCKLPDZ128rm:
538 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZ128rm);
539 case X86::VUNPCKLPDZ256rm:
540 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZ256rm);
541 case X86::VUNPCKLPDZrm:
542 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZrm);
543 case X86::VUNPCKLPDZ128rmk:
544 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZ128rmk);
545 case X86::VUNPCKLPDZ256rmk:
546 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZ256rmk);
547 case X86::VUNPCKLPDZrmk:
548 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZrmk);
549 case X86::VUNPCKLPDZ128rmkz:
550 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZ128rmkz);
551 case X86::VUNPCKLPDZ256rmkz:
552 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZ256rmkz);
553 case X86::VUNPCKLPDZrmkz:
554 return ProcessUNPCKPDrm(X86::VPUNPCKLQDQZrmkz);
555 case X86::UNPCKHPDrm:
556 return ProcessUNPCKPDrm(X86::PUNPCKHQDQrm);
557 case X86::VUNPCKHPDrm:
558 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQrm);
559 case X86::VUNPCKHPDYrm:
560 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQYrm);
561 case X86::VUNPCKHPDZ128rm:
562 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZ128rm);
563 case X86::VUNPCKHPDZ256rm:
564 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZ256rm);
565 case X86::VUNPCKHPDZrm:
566 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZrm);
567 case X86::VUNPCKHPDZ128rmk:
568 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZ128rmk);
569 case X86::VUNPCKHPDZ256rmk:
570 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZ256rmk);
571 case X86::VUNPCKHPDZrmk:
572 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZrmk);
573 case X86::VUNPCKHPDZ128rmkz:
574 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZ128rmkz);
575 case X86::VUNPCKHPDZ256rmkz:
576 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZ256rmkz);
577 case X86::VUNPCKHPDZrmkz:
578 return ProcessUNPCKPDrm(X86::VPUNPCKHQDQZrmkz);
580 case X86::UNPCKLPSrr:
581 return ProcessUNPCKPS(X86::PUNPCKLDQrr);
582 case X86::VUNPCKLPSrr:
583 return ProcessUNPCKPS(X86::VPUNPCKLDQrr);
584 case X86::VUNPCKLPSYrr:
585 return ProcessUNPCKPS(X86::VPUNPCKLDQYrr);
586 case X86::VUNPCKLPSZ128rr:
587 return ProcessUNPCKPS(X86::VPUNPCKLDQZ128rr);
588 case X86::VUNPCKLPSZ256rr:
589 return ProcessUNPCKPS(X86::VPUNPCKLDQZ256rr);
590 case X86::VUNPCKLPSZrr:
591 return ProcessUNPCKPS(X86::VPUNPCKLDQZrr);
592 case X86::VUNPCKLPSZ128rrk:
593 return ProcessUNPCKPS(X86::VPUNPCKLDQZ128rrk);
594 case X86::VUNPCKLPSZ256rrk:
595 return ProcessUNPCKPS(X86::VPUNPCKLDQZ256rrk);
596 case X86::VUNPCKLPSZrrk:
597 return ProcessUNPCKPS(X86::VPUNPCKLDQZrrk);
598 case X86::VUNPCKLPSZ128rrkz:
599 return ProcessUNPCKPS(X86::VPUNPCKLDQZ128rrkz);
600 case X86::VUNPCKLPSZ256rrkz:
601 return ProcessUNPCKPS(X86::VPUNPCKLDQZ256rrkz);
602 case X86::VUNPCKLPSZrrkz:
603 return ProcessUNPCKPS(X86::VPUNPCKLDQZrrkz);
604 case X86::UNPCKHPSrr:
605 return ProcessUNPCKPS(X86::PUNPCKHDQrr);
606 case X86::VUNPCKHPSrr:
607 return ProcessUNPCKPS(X86::VPUNPCKHDQrr);
608 case X86::VUNPCKHPSYrr:
609 return ProcessUNPCKPS(X86::VPUNPCKHDQYrr);
610 case X86::VUNPCKHPSZ128rr:
611 return ProcessUNPCKPS(X86::VPUNPCKHDQZ128rr);
612 case X86::VUNPCKHPSZ256rr:
613 return ProcessUNPCKPS(X86::VPUNPCKHDQZ256rr);
614 case X86::VUNPCKHPSZrr:
615 return ProcessUNPCKPS(X86::VPUNPCKHDQZrr);
616 case X86::VUNPCKHPSZ128rrk:
617 return ProcessUNPCKPS(X86::VPUNPCKHDQZ128rrk);
618 case X86::VUNPCKHPSZ256rrk:
619 return ProcessUNPCKPS(X86::VPUNPCKHDQZ256rrk);
620 case X86::VUNPCKHPSZrrk:
621 return ProcessUNPCKPS(X86::VPUNPCKHDQZrrk);
622 case X86::VUNPCKHPSZ128rrkz:
623 return ProcessUNPCKPS(X86::VPUNPCKHDQZ128rrkz);
624 case X86::VUNPCKHPSZ256rrkz:
625 return ProcessUNPCKPS(X86::VPUNPCKHDQZ256rrkz);
626 case X86::VUNPCKHPSZrrkz:
627 return ProcessUNPCKPS(X86::VPUNPCKHDQZrrkz);
628 case X86::UNPCKLPSrm:
629 return ProcessUNPCKPS(X86::PUNPCKLDQrm);
630 case X86::VUNPCKLPSrm:
631 return ProcessUNPCKPS(X86::VPUNPCKLDQrm);
632 case X86::VUNPCKLPSYrm:
633 return ProcessUNPCKPS(X86::VPUNPCKLDQYrm);
634 case X86::VUNPCKLPSZ128rm:
635 return ProcessUNPCKPS(X86::VPUNPCKLDQZ128rm);
636 case X86::VUNPCKLPSZ256rm:
637 return ProcessUNPCKPS(X86::VPUNPCKLDQZ256rm);
638 case X86::VUNPCKLPSZrm:
639 return ProcessUNPCKPS(X86::VPUNPCKLDQZrm);
640 case X86::VUNPCKLPSZ128rmk:
641 return ProcessUNPCKPS(X86::VPUNPCKLDQZ128rmk);
642 case X86::VUNPCKLPSZ256rmk:
643 return ProcessUNPCKPS(X86::VPUNPCKLDQZ256rmk);
644 case X86::VUNPCKLPSZrmk:
645 return ProcessUNPCKPS(X86::VPUNPCKLDQZrmk);
646 case X86::VUNPCKLPSZ128rmkz:
647 return ProcessUNPCKPS(X86::VPUNPCKLDQZ128rmkz);
648 case X86::VUNPCKLPSZ256rmkz:
649 return ProcessUNPCKPS(X86::VPUNPCKLDQZ256rmkz);
650 case X86::VUNPCKLPSZrmkz:
651 return ProcessUNPCKPS(X86::VPUNPCKLDQZrmkz);
652 case X86::UNPCKHPSrm:
653 return ProcessUNPCKPS(X86::PUNPCKHDQrm);
654 case X86::VUNPCKHPSrm:
655 return ProcessUNPCKPS(X86::VPUNPCKHDQrm);
656 case X86::VUNPCKHPSYrm:
657 return ProcessUNPCKPS(X86::VPUNPCKHDQYrm);
658 case X86::VUNPCKHPSZ128rm:
659 return ProcessUNPCKPS(X86::VPUNPCKHDQZ128rm);
660 case X86::VUNPCKHPSZ256rm:
661 return ProcessUNPCKPS(X86::VPUNPCKHDQZ256rm);
662 case X86::VUNPCKHPSZrm:
663 return ProcessUNPCKPS(X86::VPUNPCKHDQZrm);
664 case X86::VUNPCKHPSZ128rmk:
665 return ProcessUNPCKPS(X86::VPUNPCKHDQZ128rmk);
666 case X86::VUNPCKHPSZ256rmk:
667 return ProcessUNPCKPS(X86::VPUNPCKHDQZ256rmk);
668 case X86::VUNPCKHPSZrmk:
669 return ProcessUNPCKPS(X86::VPUNPCKHDQZrmk);
670 case X86::VUNPCKHPSZ128rmkz:
671 return ProcessUNPCKPS(X86::VPUNPCKHDQZ128rmkz);
672 case X86::VUNPCKHPSZ256rmkz:
673 return ProcessUNPCKPS(X86::VPUNPCKHDQZ256rmkz);
674 case X86::VUNPCKHPSZrmkz:
675 return ProcessUNPCKPS(X86::VPUNPCKHDQZrmkz);
678 return ProcessShiftLeftToAdd(X86::PADDWrr);
680 return ProcessShiftLeftToAdd(X86::VPADDWrr);
682 return ProcessShiftLeftToAdd(X86::VPADDWYrr);
683 case X86::VPSLLWZ128ri:
684 return ProcessShiftLeftToAdd(X86::VPADDWZ128rr);
685 case X86::VPSLLWZ256ri:
686 return ProcessShiftLeftToAdd(X86::VPADDWZ256rr);
688 return ProcessShiftLeftToAdd(X86::VPADDWZrr);
690 return ProcessShiftLeftToAdd(X86::PADDDrr);
692 return ProcessShiftLeftToAdd(X86::VPADDDrr);
694 return ProcessShiftLeftToAdd(X86::VPADDDYrr);
695 case X86::VPSLLDZ128ri:
696 return ProcessShiftLeftToAdd(X86::VPADDDZ128rr);
697 case X86::VPSLLDZ256ri:
698 return ProcessShiftLeftToAdd(X86::VPADDDZ256rr);
700 return ProcessShiftLeftToAdd(X86::VPADDDZrr);
702 return ProcessShiftLeftToAdd(X86::PADDQrr);
704 return ProcessShiftLeftToAdd(X86::VPADDQrr);
706 return ProcessShiftLeftToAdd(X86::VPADDQYrr);
707 case X86::VPSLLQZ128ri:
708 return ProcessShiftLeftToAdd(X86::VPADDQZ128rr);
709 case X86::VPSLLQZ256ri:
710 return ProcessShiftLeftToAdd(X86::VPADDQZ256rr);
712 return ProcessShiftLeftToAdd(X86::VPADDQZrr);
714 return ProcessMOVPDToMOVPS(X86::MOVUPSrr);
716 return ProcessMOVPDToMOVPS(X86::MOVUPSrm);
718 return ProcessMOVPDToMOVPS(X86::MOVUPSmr);
720 return ProcessMOVPDToMOVPS(X86::MOVAPSrr);
722 return ProcessMOVPDToMOVPS(X86::MOVAPSrm);
724 return ProcessMOVPDToMOVPS(X86::MOVAPSmr);
731bool X86FixupInstTuningImpl::runOnMachineFunction(
MachineFunction &MF) {
737 SM = &ST->getSchedModel();
739 for (MachineBasicBlock &
MBB : MF) {
741 if (processInstruction(MF,
MBB,
I)) {
751bool X86FixupInstTuningLegacy::runOnMachineFunction(
MachineFunction &MF) {
752 X86FixupInstTuningImpl Impl;
753 return Impl.runOnMachineFunction(MF);
759 X86FixupInstTuningImpl Impl;
760 return Impl.runOnMachineFunction(MF)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Function Alias Analysis false
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static std::optional< bool > CmpOptionals(T NewVal, T CurVal)
uint64_t getZExtValue() const
Get zero extended value.
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Represents analyses that only rely on functions' control flow.
FunctionPass class - This class is used to implement most global optimizations.
bool hasOptSize() const
Optimize this function for size (-Os) or minimum size (-Oz).
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
unsigned getSize(const MachineInstr &MI) const
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
static MachineOperand CreateImm(int64_t Val)
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
bool hasNoDomainDelayShuffle() const
const X86InstrInfo * getInstrInfo() const override
bool hasNoDomainDelayMov() const
const X86RegisterInfo * getRegisterInfo() const override
Pass manager infrastructure for declaring and invalidating analyses.
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
This is an optimization pass for GlobalISel generic memory operations.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionPass * createX86FixupInstTuningLegacyPass()
Machine model for scheduling, bundling, and heuristics.
const MCSchedClassDesc * getSchedClassDesc(unsigned SchedClassIdx) const
bool hasInstrSchedModel() const
Does this machine model include instruction-level scheduling.
static LLVM_ABI int computeInstrLatency(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the latency value for the scheduling class.
static LLVM_ABI double getReciprocalThroughput(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)