diff options
author | Tim Northover <tnorthover@apple.com> | 2016-09-12 12:10:41 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-09-12 12:10:41 +0000 |
commit | 032548fc5eb206176b68e13cde39df682377b0fc (patch) | |
tree | 0d8fbb0429f8997d3869683f8d020981a9cd33b2 /llvm/lib/CodeGen | |
parent | 03ea468a1ccc39a1a451a12b1ce48d43678aa927 (diff) | |
download | bcm5719-llvm-032548fc5eb206176b68e13cde39df682377b0fc.tar.gz bcm5719-llvm-032548fc5eb206176b68e13cde39df682377b0fc.zip |
GlobalISel: support translation of global addresses.
llvm-svn: 281207
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 12 |
2 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index c891502112f..40c46d61041 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -508,6 +508,8 @@ bool IRTranslator::translate(const Constant &C, unsigned Reg) { EntryBuilder.buildInstr(TargetOpcode::G_CONSTANT) .addDef(Reg) .addImm(0); + else if (auto GV = dyn_cast<GlobalValue>(&C)) + EntryBuilder.buildGlobalValue(Reg, GV); else if (auto CE = dyn_cast<ConstantExpr>(&C)) { switch(CE->getOpcode()) { #define HANDLE_INST(NUM, OPCODE, CLASS) \ diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index acf94495df7..7aa5405ef20 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -84,6 +84,18 @@ MachineInstrBuilder MachineIRBuilder::buildFrameIndex(unsigned Res, int Idx) { .addFrameIndex(Idx); } +MachineInstrBuilder MachineIRBuilder::buildGlobalValue(unsigned Res, + const GlobalValue *GV) { + assert(MRI->getType(Res).isPointer() && "invalid operand type"); + assert(MRI->getType(Res).getAddressSpace() == + GV->getType()->getAddressSpace() && + "address space mismatch"); + + return buildInstr(TargetOpcode::G_GLOBAL_VALUE) + .addDef(Res) + .addGlobalAddress(GV); +} + MachineInstrBuilder MachineIRBuilder::buildAdd(unsigned Res, unsigned Op0, unsigned Op1) { assert((MRI->getType(Res).isScalar() || MRI->getType(Res).isVector()) && |