summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 618a3859e22..ef836304c14 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -49,7 +49,12 @@ unsigned IRTranslator::getOrCreateVReg(const Value &Val) {
unsigned Size = DL->getTypeSizeInBits(Val.getType());
unsigned VReg = MRI->createGenericVirtualRegister(Size);
ValReg = VReg;
- assert(!isa<Constant>(Val) && "Not yet implemented");
+
+ if (auto CV = dyn_cast<Constant>(&Val)) {
+ bool Success = translate(*CV, VReg);
+ if (!Success)
+ report_fatal_error("unable to translate constant");
+ }
}
return ValReg;
}
@@ -312,6 +317,15 @@ bool IRTranslator::translate(const Instruction &Inst) {
}
}
+bool IRTranslator::translate(const Constant &C, unsigned Reg) {
+ if (auto CI = dyn_cast<ConstantInt>(&C)) {
+ EntryBuilder.buildConstant(LLT{*CI->getType()}, Reg, CI->getZExtValue());
+ return true;
+ }
+
+ llvm_unreachable("unhandled constant kind");
+}
+
void IRTranslator::finalize() {
// Release the memory used by the different maps we
@@ -326,6 +340,7 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &MF) {
return false;
CLI = MF.getSubtarget().getCallLowering();
MIRBuilder.setMF(MF);
+ EntryBuilder.setMF(MF);
MRI = &MF.getRegInfo();
DL = &F.getParent()->getDataLayout();
@@ -342,6 +357,13 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &MF) {
if (!Succeeded)
report_fatal_error("Unable to lower arguments");
+ // Now that we've got the ABI handling code, it's safe to set a location for
+ // any Constants we find in the IR.
+ if (MBB.empty())
+ EntryBuilder.setMBB(MBB);
+ else
+ EntryBuilder.setInstr(MBB.back(), /* Before */ false);
+
for (const BasicBlock &BB: F) {
MachineBasicBlock &MBB = getOrCreateBB(BB);
// Set the insertion point of all the following translations to
OpenPOWER on IntegriCloud