forked from OSchip/llvm-project
Added an offset field to ConstantPoolSDNode.
llvm-svn: 26371
This commit is contained in:
parent
b8d9667087
commit
ed169db8a5
|
@ -131,7 +131,8 @@ private:
|
|||
// will be set for a value after reg allocation
|
||||
|
||||
int offset; // Offset to address of global or external, only
|
||||
// valid for MO_GlobalAddress and MO_ExternalSym
|
||||
// valid for MO_GlobalAddress, MO_ExternalSym
|
||||
// and MO_ConstantPoolIndex
|
||||
} extra;
|
||||
|
||||
void zeroContents () {
|
||||
|
@ -140,11 +141,14 @@ private:
|
|||
}
|
||||
|
||||
MachineOperand(int64_t ImmVal = 0,
|
||||
MachineOperandType OpTy = MO_VirtualRegister)
|
||||
MachineOperandType OpTy = MO_VirtualRegister, int Offset = 0)
|
||||
: flags(0), opType(OpTy) {
|
||||
zeroContents ();
|
||||
contents.immedVal = ImmVal;
|
||||
extra.regNum = -1;
|
||||
if (OpTy == MachineOperand::MO_ConstantPoolIndex)
|
||||
extra.offset = Offset;
|
||||
else
|
||||
extra.regNum = -1;
|
||||
}
|
||||
|
||||
MachineOperand(int Reg, MachineOperandType OpTy, UseType UseTy)
|
||||
|
@ -286,7 +290,7 @@ public:
|
|||
return (GlobalValue*)contents.value;
|
||||
}
|
||||
int getOffset() const {
|
||||
assert((isGlobalAddress() || isExternalSymbol()) &&
|
||||
assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
return extra.offset;
|
||||
}
|
||||
|
@ -344,7 +348,7 @@ public:
|
|||
}
|
||||
|
||||
void setOffset(int Offset) {
|
||||
assert((isGlobalAddress() || isExternalSymbol()) &&
|
||||
assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
extra.offset = Offset;
|
||||
}
|
||||
|
@ -644,7 +648,7 @@ public:
|
|||
/// addConstantPoolndexOperand - Add a constant pool object index to the
|
||||
/// instruction.
|
||||
///
|
||||
void addConstantPoolIndexOperand(unsigned I) {
|
||||
void addConstantPoolIndexOperand(unsigned I, int Offset=0) {
|
||||
assert(!OperandsComplete() &&
|
||||
"Trying to add an operand to a machine instr that is already done!");
|
||||
operands.push_back(MachineOperand(I, MachineOperand::MO_ConstantPoolIndex));
|
||||
|
|
|
@ -125,13 +125,15 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx) const {
|
||||
MI->addConstantPoolIndexOperand(Idx);
|
||||
const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx,
|
||||
int Offset = 0) const {
|
||||
MI->addConstantPoolIndexOperand(Idx, Offset);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV,
|
||||
bool isPCRelative = false, int Offset = 0) const {
|
||||
bool isPCRelative = false,
|
||||
int Offset = 0) const {
|
||||
MI->addGlobalAddressOperand(GV, isPCRelative, Offset);
|
||||
return *this;
|
||||
}
|
||||
|
|
|
@ -121,9 +121,9 @@ public:
|
|||
SDOperand getFrameIndex(int FI, MVT::ValueType VT);
|
||||
SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
|
||||
SDOperand getConstantPool(Constant *C, MVT::ValueType VT,
|
||||
unsigned Alignment=0);
|
||||
unsigned Alignment=0, int offset = 0);
|
||||
SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT,
|
||||
unsigned Alignment=0);
|
||||
unsigned Alignment=0, int offset = 0);
|
||||
SDOperand getBasicBlock(MachineBasicBlock *MBB);
|
||||
SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT);
|
||||
SDOperand getTargetExternalSymbol(const char *Sym, MVT::ValueType VT);
|
||||
|
@ -469,8 +469,10 @@ private:
|
|||
std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
|
||||
std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstantFPs;
|
||||
std::map<int, SDNode*> FrameIndices, TargetFrameIndices;
|
||||
std::map<std::pair<Constant *, unsigned>, SDNode*> ConstantPoolIndices;
|
||||
std::map<std::pair<Constant *, unsigned>, SDNode*> TargetConstantPoolIndices;
|
||||
std::map<std::pair<Constant *,
|
||||
std::pair<int, unsigned> >, SDNode*> ConstantPoolIndices;
|
||||
std::map<std::pair<Constant *,
|
||||
std::pair<int, unsigned> >, SDNode*> TargetConstantPoolIndices;
|
||||
std::map<MachineBasicBlock *, SDNode*> BBNodes;
|
||||
std::vector<SDNode*> ValueTypeNodes;
|
||||
std::map<std::string, SDNode*> ExternalSymbols;
|
||||
|
|
|
@ -1028,19 +1028,19 @@ public:
|
|||
|
||||
class GlobalAddressSDNode : public SDNode {
|
||||
GlobalValue *TheGlobal;
|
||||
int offset;
|
||||
int Offset;
|
||||
protected:
|
||||
friend class SelectionDAG;
|
||||
GlobalAddressSDNode(bool isTarget, const GlobalValue *GA, MVT::ValueType VT,
|
||||
int o=0)
|
||||
: SDNode(isTarget ? ISD::TargetGlobalAddress : ISD::GlobalAddress, VT) {
|
||||
: SDNode(isTarget ? ISD::TargetGlobalAddress : ISD::GlobalAddress, VT),
|
||||
Offset(o) {
|
||||
TheGlobal = const_cast<GlobalValue*>(GA);
|
||||
offset = o;
|
||||
}
|
||||
public:
|
||||
|
||||
GlobalValue *getGlobal() const { return TheGlobal; }
|
||||
int getOffset() const { return offset; }
|
||||
int getOffset() const { return Offset; }
|
||||
|
||||
static bool classof(const GlobalAddressSDNode *) { return true; }
|
||||
static bool classof(const SDNode *N) {
|
||||
|
@ -1069,19 +1069,22 @@ public:
|
|||
|
||||
class ConstantPoolSDNode : public SDNode {
|
||||
Constant *C;
|
||||
int Offset;
|
||||
unsigned Alignment;
|
||||
protected:
|
||||
friend class SelectionDAG;
|
||||
ConstantPoolSDNode(Constant *c, MVT::ValueType VT, bool isTarget)
|
||||
ConstantPoolSDNode(bool isTarget, Constant *c, MVT::ValueType VT,
|
||||
int o=0)
|
||||
: SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT),
|
||||
C(c), Alignment(0) {}
|
||||
ConstantPoolSDNode(Constant *c, MVT::ValueType VT, unsigned Align,
|
||||
bool isTarget)
|
||||
C(c), Offset(o), Alignment(0) {}
|
||||
ConstantPoolSDNode(bool isTarget, Constant *c, MVT::ValueType VT, int o,
|
||||
unsigned Align)
|
||||
: SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT),
|
||||
C(c), Alignment(Align) {}
|
||||
C(c), Offset(o), Alignment(Align) {}
|
||||
public:
|
||||
|
||||
Constant *get() const { return C; }
|
||||
int getOffset() const { return Offset; }
|
||||
|
||||
// Return the alignment of this constant pool object, which is either 0 (for
|
||||
// default alignment) or log2 of the desired value.
|
||||
|
|
|
@ -154,6 +154,7 @@ void ScheduleDAG::AddOperand(MachineInstr *MI, SDOperand Op,
|
|||
MI->addFrameIndexOperand(FI->getIndex());
|
||||
} else if (ConstantPoolSDNode *CP =
|
||||
dyn_cast<ConstantPoolSDNode>(Op)) {
|
||||
int Offset = CP->getOffset();
|
||||
unsigned Align = CP->getAlignment();
|
||||
// MachineConstantPool wants an explicit alignment.
|
||||
if (Align == 0) {
|
||||
|
@ -165,7 +166,7 @@ void ScheduleDAG::AddOperand(MachineInstr *MI, SDOperand Op,
|
|||
}
|
||||
|
||||
unsigned Idx = ConstPool->getConstantPoolIndex(CP->get(), Align);
|
||||
MI->addConstantPoolIndexOperand(Idx);
|
||||
MI->addConstantPoolIndexOperand(Idx, Offset);
|
||||
} else if (ExternalSymbolSDNode *ES =
|
||||
dyn_cast<ExternalSymbolSDNode>(Op)) {
|
||||
MI->addExternalSymbolOperand(ES->getSymbol(), false);
|
||||
|
|
|
@ -302,12 +302,14 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
|
|||
case ISD::ConstantPool:
|
||||
Erased = ConstantPoolIndices.
|
||||
erase(std::make_pair(cast<ConstantPoolSDNode>(N)->get(),
|
||||
cast<ConstantPoolSDNode>(N)->getAlignment()));
|
||||
std::make_pair(cast<ConstantPoolSDNode>(N)->getOffset(),
|
||||
cast<ConstantPoolSDNode>(N)->getAlignment())));
|
||||
break;
|
||||
case ISD::TargetConstantPool:
|
||||
Erased = TargetConstantPoolIndices.
|
||||
erase(std::make_pair(cast<ConstantPoolSDNode>(N)->get(),
|
||||
cast<ConstantPoolSDNode>(N)->getAlignment()));
|
||||
std::make_pair(cast<ConstantPoolSDNode>(N)->getOffset(),
|
||||
cast<ConstantPoolSDNode>(N)->getAlignment())));
|
||||
break;
|
||||
case ISD::BasicBlock:
|
||||
Erased = BBNodes.erase(cast<BasicBlockSDNode>(N)->getBasicBlock());
|
||||
|
@ -650,19 +652,21 @@ SDOperand SelectionDAG::getTargetFrameIndex(int FI, MVT::ValueType VT) {
|
|||
}
|
||||
|
||||
SDOperand SelectionDAG::getConstantPool(Constant *C, MVT::ValueType VT,
|
||||
unsigned Alignment) {
|
||||
SDNode *&N = ConstantPoolIndices[std::make_pair(C, Alignment)];
|
||||
unsigned Alignment, int Offset) {
|
||||
SDNode *&N = ConstantPoolIndices[std::make_pair(C,
|
||||
std::make_pair(Offset, Alignment))];
|
||||
if (N) return SDOperand(N, 0);
|
||||
N = new ConstantPoolSDNode(C, VT, Alignment, false);
|
||||
N = new ConstantPoolSDNode(false, C, VT, Offset, Alignment);
|
||||
AllNodes.push_back(N);
|
||||
return SDOperand(N, 0);
|
||||
}
|
||||
|
||||
SDOperand SelectionDAG::getTargetConstantPool(Constant *C, MVT::ValueType VT,
|
||||
unsigned Alignment) {
|
||||
SDNode *&N = TargetConstantPoolIndices[std::make_pair(C, Alignment)];
|
||||
unsigned Alignment, int Offset) {
|
||||
SDNode *&N = TargetConstantPoolIndices[std::make_pair(C,
|
||||
std::make_pair(Offset, Alignment))];
|
||||
if (N) return SDOperand(N, 0);
|
||||
N = new ConstantPoolSDNode(C, VT, Alignment, true);
|
||||
N = new ConstantPoolSDNode(true, C, VT, Offset, Alignment);
|
||||
AllNodes.push_back(N);
|
||||
return SDOperand(N, 0);
|
||||
}
|
||||
|
|
|
@ -196,25 +196,18 @@ void X86ATTAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
|
|||
O << " + " << DispSpec.getImmedValue();
|
||||
O << "]";
|
||||
return;
|
||||
} else if (BaseReg.isConstantPoolIndex()) {
|
||||
O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << "_"
|
||||
<< BaseReg.getConstantPoolIndex();
|
||||
if (forDarwin && TM.getRelocationModel() == Reloc::PIC)
|
||||
O << "-\"L" << getFunctionNumber() << "$pb\"";
|
||||
if (DispSpec.getImmedValue())
|
||||
O << "+" << DispSpec.getImmedValue();
|
||||
if (IndexReg.getReg()) {
|
||||
O << "(,";
|
||||
printOperand(MI, Op+2);
|
||||
if (ScaleVal != 1)
|
||||
O << "," << ScaleVal;
|
||||
O << ")";
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (DispSpec.isGlobalAddress()) {
|
||||
printOperand(MI, Op+3, "mem");
|
||||
} else if (DispSpec.isConstantPoolIndex()) {
|
||||
O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << "_"
|
||||
<< DispSpec.getConstantPoolIndex();
|
||||
if (forDarwin && TM.getRelocationModel() == Reloc::PIC)
|
||||
O << "-\"L" << getFunctionNumber() << "$pb\"";
|
||||
if (DispSpec.getOffset())
|
||||
O << "+" << DispSpec.getOffset();
|
||||
return;
|
||||
} else {
|
||||
int DispVal = DispSpec.getImmedValue();
|
||||
if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg()))
|
||||
|
|
|
@ -171,23 +171,6 @@ void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
|
|||
|
||||
if (BaseReg.isFrameIndex()) {
|
||||
O << "[frame slot #" << BaseReg.getFrameIndex();
|
||||
if (DispSpec.getImmedValue())
|
||||
O << " + " << DispSpec.getImmedValue();
|
||||
O << "]";
|
||||
return;
|
||||
} else if (BaseReg.isConstantPoolIndex()) {
|
||||
O << "[" << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << "_"
|
||||
<< BaseReg.getConstantPoolIndex();
|
||||
if (forDarwin && TM.getRelocationModel() == Reloc::PIC)
|
||||
O << "-\"L" << getFunctionNumber() << "$pb\"";
|
||||
|
||||
if (IndexReg.getReg()) {
|
||||
O << " + ";
|
||||
if (ScaleVal != 1)
|
||||
O << ScaleVal << "*";
|
||||
printOp(IndexReg);
|
||||
}
|
||||
|
||||
if (DispSpec.getImmedValue())
|
||||
O << " + " << DispSpec.getImmedValue();
|
||||
O << "]";
|
||||
|
@ -213,6 +196,15 @@ void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
|
|||
if (NeedPlus)
|
||||
O << " + ";
|
||||
printOp(DispSpec, "mem");
|
||||
} else if (DispSpec.isConstantPoolIndex()) {
|
||||
O << "[" << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << "_"
|
||||
<< DispSpec.getConstantPoolIndex();
|
||||
if (forDarwin && TM.getRelocationModel() == Reloc::PIC)
|
||||
O << "-\"L" << getFunctionNumber() << "$pb\"";
|
||||
if (DispSpec.getOffset())
|
||||
O << " + " << DispSpec.getOffset();
|
||||
O << "]";
|
||||
return;
|
||||
} else {
|
||||
int DispVal = DispSpec.getImmedValue();
|
||||
if (DispVal || (!BaseReg.getReg() && !IndexReg.getReg())) {
|
||||
|
|
Loading…
Reference in New Issue