ARM has to provide its own TargetLowering::findRepresentativeClass because its scalar floating point registers alias its vector registers.

llvm-svn: 108761
This commit is contained in:
Evan Cheng 2010-07-19 22:15:08 +00:00
parent 9e687994f3
commit 10f99a3490
4 changed files with 33 additions and 12 deletions

View File

@ -993,6 +993,11 @@ protected:
Synthesizable[VT.getSimpleVT().SimpleTy] = isSynthesizable;
}
/// findRepresentativeClass - Return the largest legal super-reg register class
/// of the specified register class.
virtual const TargetRegisterClass *
findRepresentativeClass(const TargetRegisterClass *RC) const;
/// computeRegisterProperties - Once all of the register classes are added,
/// this allows us to compute derived properties we expose.
void computeRegisterProperties();
@ -1698,12 +1703,7 @@ private:
/// hasLegalSuperRegRegClasses - Return true if the specified register class
/// has one or more super-reg register classes that are legal.
bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC);
/// findRepresentativeClass - Return the largest legal super-reg register class
/// of the specified register class.
const TargetRegisterClass *
findRepresentativeClass(const TargetRegisterClass *RC);
bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const;
};
/// GetReturnInfo - Given an LLVM IR type and return type attributes,

View File

@ -664,7 +664,8 @@ bool TargetLowering::isLegalRC(const TargetRegisterClass *RC) const {
/// hasLegalSuperRegRegClasses - Return true if the specified register class
/// has one or more super-reg register classes that are legal.
bool TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) {
bool
TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const{
if (*RC->superregclasses_begin() == 0)
return false;
for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(),
@ -679,9 +680,7 @@ bool TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) {
/// findRepresentativeClass - Return the largest legal super-reg register class
/// of the specified register class.
const TargetRegisterClass *
TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) {
if (!RC) return 0;
TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const {
const TargetRegisterClass *BestRC = RC;
for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(),
E = RC->superregclasses_end(); I != E; ++I) {
@ -820,8 +819,10 @@ void TargetLowering::computeRegisterProperties() {
// not a sub-register class / subreg register class) legal register class for
// a group of value types. For example, on i386, i8, i16, and i32
// representative would be GR32; while on x86_64 it's GR64.
for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i)
RepRegClassForVT[i] = findRepresentativeClass(RegClassForVT[i]);
for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) {
const TargetRegisterClass *RC = RegClassForVT[i];
RepRegClassForVT[i] = RC ? findRepresentativeClass(RC) : 0;
}
}
const char *TargetLowering::getTargetNodeName(unsigned Opcode) const {

View File

@ -550,6 +550,22 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
benefitFromCodePlacementOpt = true;
}
const TargetRegisterClass *
ARMTargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const{
switch (RC->getID()) {
default:
return RC;
case ARM::tGPRRegClassID:
case ARM::GPRRegClassID:
return ARM::GPRRegisterClass;
case ARM::SPRRegClassID:
case ARM::DPRRegClassID:
return ARM::DPRRegisterClass;
case ARM::QPRRegClassID:
return ARM::QPRRegisterClass;
}
}
const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
switch (Opcode) {
default: return 0;

View File

@ -271,6 +271,10 @@ namespace llvm {
/// materialize the FP immediate as a load from a constant pool.
virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
protected:
const TargetRegisterClass *
findRepresentativeClass(const TargetRegisterClass *RC) const;
private:
/// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
/// make the right decision when generating code for different targets.