diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index cb22690f5ec..ce522e6da93 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -128,21 +128,43 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC, if (RC == &X86::GR8_NOREXRegClass) return RC; + const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>(); + const TargetRegisterClass *Super = RC; TargetRegisterClass::sc_iterator I = RC->getSuperClasses(); do { switch (Super->getID()) { + case X86::FR32RegClassID: + case X86::FR64RegClassID: + // If AVX-512 isn't supported we should only inflate to these classes. + if (!Subtarget.hasAVX512() && Super->getSize() == RC->getSize()) + return Super; + break; + case X86::VR128RegClassID: + case X86::VR256RegClassID: + // If VLX isn't supported we should only inflate to these classes. + if (!Subtarget.hasVLX() && Super->getSize() == RC->getSize()) + return Super; + break; + case X86::FR32XRegClassID: + case X86::FR64XRegClassID: + // If VLX isn't support we shouldn't inflate to these classes. + if (!Subtarget.hasVLX()) + break; + // Fallthrough. The VLX check above passed, AVX512 check below will pass. + case X86::VR128XRegClassID: + case X86::VR256XRegClassID: + // If AVX-512 isn't support we shouldn't inflate to these classes. + if (!Subtarget.hasAVX512()) + break; + // Fallthrough. case X86::GR8RegClassID: case X86::GR16RegClassID: case X86::GR32RegClassID: case X86::GR64RegClassID: - case X86::FR32RegClassID: - case X86::FR64RegClassID: case X86::RFP32RegClassID: case X86::RFP64RegClassID: case X86::RFP80RegClassID: - case X86::VR128RegClassID: - case X86::VR256RegClassID: case X86::VR512RegClassID: // Don't return a super-class that would shrink the spill size. // That can happen with the vector and float classes. |

