@@ -352,11 +352,12 @@ def GR8 : RegisterClass<"X86", [i8], 8,
352
352
const TargetMachine &TM = MF.getTarget();
353
353
const TargetRegisterInfo *RI = TM.getRegisterInfo();
354
354
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
355
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
355
356
// Does the function dedicate RBP / EBP to being a frame ptr?
356
357
if (!Subtarget.is64Bit())
357
358
// In 32-mode, none of the 8-bit registers aliases EBP or ESP.
358
359
return begin() + 8;
359
- else if (RI->hasFP(MF))
360
+ else if (RI->hasFP(MF) || MFI->getReserveFP() )
360
361
// If so, don't allocate SPL or BPL.
361
362
return array_endof(X86_GR8_AO_64) - 1;
362
363
else
@@ -396,17 +397,18 @@ def GR16 : RegisterClass<"X86", [i16], 16,
396
397
const TargetMachine &TM = MF.getTarget();
397
398
const TargetRegisterInfo *RI = TM.getRegisterInfo();
398
399
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
400
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
399
401
if (Subtarget.is64Bit()) {
400
402
// Does the function dedicate RBP to being a frame ptr?
401
- if (RI->hasFP(MF))
403
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
402
404
// If so, don't allocate SP or BP.
403
405
return array_endof(X86_GR16_AO_64) - 1;
404
406
else
405
407
// If not, just don't allocate SP.
406
408
return array_endof(X86_GR16_AO_64);
407
409
} else {
408
410
// Does the function dedicate EBP to being a frame ptr?
409
- if (RI->hasFP(MF))
411
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
410
412
// If so, don't allocate SP or BP.
411
413
return begin() + 6;
412
414
else
@@ -447,17 +449,18 @@ def GR32 : RegisterClass<"X86", [i32], 32,
447
449
const TargetMachine &TM = MF.getTarget();
448
450
const TargetRegisterInfo *RI = TM.getRegisterInfo();
449
451
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
452
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
450
453
if (Subtarget.is64Bit()) {
451
454
// Does the function dedicate RBP to being a frame ptr?
452
- if (RI->hasFP(MF))
455
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
453
456
// If so, don't allocate ESP or EBP.
454
457
return array_endof(X86_GR32_AO_64) - 1;
455
458
else
456
459
// If not, just don't allocate ESP.
457
460
return array_endof(X86_GR32_AO_64);
458
461
} else {
459
462
// Does the function dedicate EBP to being a frame ptr?
460
- if (RI->hasFP(MF))
463
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
461
464
// If so, don't allocate ESP or EBP.
462
465
return begin() + 6;
463
466
else
@@ -484,9 +487,11 @@ def GR64 : RegisterClass<"X86", [i64], 64,
484
487
const TargetMachine &TM = MF.getTarget();
485
488
const TargetRegisterInfo *RI = TM.getRegisterInfo();
486
489
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
490
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
487
491
if (!Subtarget.is64Bit())
488
492
return begin(); // None of these are allocatable in 32-bit.
489
- if (RI->hasFP(MF)) // Does the function dedicate RBP to being a frame ptr?
493
+ // Does the function dedicate RBP to being a frame ptr?
494
+ if (RI->hasFP(MF) || MFI->getReserveFP())
490
495
return end()-3; // If so, don't allocate RIP, RSP or RBP
491
496
else
492
497
return end()-2; // If not, just don't allocate RIP or RSP
@@ -582,8 +587,9 @@ def GR16_NOREX : RegisterClass<"X86", [i16], 16,
582
587
GR16_NOREXClass::allocation_order_end(const MachineFunction &MF) const {
583
588
const TargetMachine &TM = MF.getTarget();
584
589
const TargetRegisterInfo *RI = TM.getRegisterInfo();
590
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
585
591
// Does the function dedicate RBP / EBP to being a frame ptr?
586
- if (RI->hasFP(MF))
592
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
587
593
// If so, don't allocate SP or BP.
588
594
return end() - 2;
589
595
else
@@ -604,8 +610,9 @@ def GR32_NOREX : RegisterClass<"X86", [i32], 32,
604
610
GR32_NOREXClass::allocation_order_end(const MachineFunction &MF) const {
605
611
const TargetMachine &TM = MF.getTarget();
606
612
const TargetRegisterInfo *RI = TM.getRegisterInfo();
613
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
607
614
// Does the function dedicate RBP / EBP to being a frame ptr?
608
- if (RI->hasFP(MF))
615
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
609
616
// If so, don't allocate ESP or EBP.
610
617
return end() - 2;
611
618
else
@@ -626,8 +633,9 @@ def GR64_NOREX : RegisterClass<"X86", [i64], 64,
626
633
GR64_NOREXClass::allocation_order_end(const MachineFunction &MF) const {
627
634
const TargetMachine &TM = MF.getTarget();
628
635
const TargetRegisterInfo *RI = TM.getRegisterInfo();
636
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
629
637
// Does the function dedicate RBP to being a frame ptr?
630
- if (RI->hasFP(MF))
638
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
631
639
// If so, don't allocate RIP, RSP or RBP.
632
640
return end() - 3;
633
641
else
@@ -668,17 +676,18 @@ def GR32_NOSP : RegisterClass<"X86", [i32], 32,
668
676
const TargetMachine &TM = MF.getTarget();
669
677
const TargetRegisterInfo *RI = TM.getRegisterInfo();
670
678
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
679
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
671
680
if (Subtarget.is64Bit()) {
672
681
// Does the function dedicate RBP to being a frame ptr?
673
- if (RI->hasFP(MF))
682
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
674
683
// If so, don't allocate EBP.
675
684
return array_endof(X86_GR32_NOSP_AO_64) - 1;
676
685
else
677
686
// If not, any reg in this class is ok.
678
687
return array_endof(X86_GR32_NOSP_AO_64);
679
688
} else {
680
689
// Does the function dedicate EBP to being a frame ptr?
681
- if (RI->hasFP(MF))
690
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
682
691
// If so, don't allocate EBP.
683
692
return begin() + 6;
684
693
else
@@ -703,9 +712,11 @@ def GR64_NOSP : RegisterClass<"X86", [i64], 64,
703
712
const TargetMachine &TM = MF.getTarget();
704
713
const TargetRegisterInfo *RI = TM.getRegisterInfo();
705
714
const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
715
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
706
716
if (!Subtarget.is64Bit())
707
717
return begin(); // None of these are allocatable in 32-bit.
708
- if (RI->hasFP(MF)) // Does the function dedicate RBP to being a frame ptr?
718
+ // Does the function dedicate RBP to being a frame ptr?
719
+ if (RI->hasFP(MF) || MFI->getReserveFP())
709
720
return end()-1; // If so, don't allocate RBP
710
721
else
711
722
return end(); // If not, any reg in this class is ok.
@@ -726,8 +737,9 @@ def GR64_NOREX_NOSP : RegisterClass<"X86", [i64], 64,
726
737
{
727
738
const TargetMachine &TM = MF.getTarget();
728
739
const TargetRegisterInfo *RI = TM.getRegisterInfo();
740
+ const X86MachineFunctionInfo *MFI = MF.getInfo<X86MachineFunctionInfo>();
729
741
// Does the function dedicate RBP to being a frame ptr?
730
- if (RI->hasFP(MF))
742
+ if (RI->hasFP(MF) || MFI->getReserveFP() )
731
743
// If so, don't allocate RBP.
732
744
return end() - 1;
733
745
else
0 commit comments