GlobalISel: first translation support for Constants.

For now put them all in the entry block. This should be correct but may give
poor runtime performance. Hopefully MachineSinking combined with
isReMaterializable can solve those issues, but if not the interface is sound
enough to support alternatives.

llvm-svn: 278168
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 618a385..ef83630 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -49,7 +49,12 @@
     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 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 @@
     return false;
   CLI = MF.getSubtarget().getCallLowering();
   MIRBuilder.setMF(MF);
+  EntryBuilder.setMF(MF);
   MRI = &MF.getRegInfo();
   DL = &F.getParent()->getDataLayout();
 
@@ -342,6 +357,13 @@
   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