FunctionLoweringInfo.cpp revision 7451d3e09d26115195280ba36f686a0a90815089
16277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===-- FunctionLoweringInfo.cpp ------------------------------------------===//
26277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//
36277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//                     The LLVM Compiler Infrastructure
46277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//
56277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// This file is distributed under the University of Illinois Open Source
66277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// License. See LICENSE.TXT for details.
76277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//
86277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===----------------------------------------------------------------------===//
96277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//
106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// This implements routines for translating functions from LLVM IR into
116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// Machine IR.
126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//
136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===----------------------------------------------------------------------===//
146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#define DEBUG_TYPE "function-lowering-info"
166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "FunctionLoweringInfo.h"
176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/DerivedTypes.h"
186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Function.h"
196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Instructions.h"
205fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#include "llvm/IntrinsicInst.h"
216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/LLVMContext.h"
226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Module.h"
235eb6d65a27fd77a0bf10bd49f5cccb9f1796d98bDan Gohman#include "llvm/CodeGen/Analysis.h"
246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineFunction.h"
256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineFrameInfo.h"
266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineInstrBuilder.h"
276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineModuleInfo.h"
286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h"
296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetRegisterInfo.h"
306277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetData.h"
316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetFrameInfo.h"
326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetInstrInfo.h"
33551754c4958086cc6910da7c950f2875e212f5cfEric Christopher#include "llvm/Target/TargetIntrinsicInfo.h"
346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetLowering.h"
356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetOptions.h"
366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/Debug.h"
376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/ErrorHandling.h"
386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/MathExtras.h"
396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include <algorithm>
406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanusing namespace llvm;
416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by
436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// PHI nodes or outside of the basic block that defines it, or used by a
446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// switch or atomic instruction, which may expand to multiple basic blocks.
45ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isUsedOutsideOfDefiningBlock(const Instruction *I) {
46d84e806dd4b03fa711ae2665ac1acef646f16c5cDan Gohman  if (I->use_empty()) return false;
476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  if (isa<PHINode>(I)) return true;
48ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  const BasicBlock *BB = I->getParent();
49ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (Value::const_use_iterator UI = I->use_begin(), E = I->use_end();
50ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman        UI != E; ++UI)
516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (cast<Instruction>(*UI)->getParent() != BB || isa<PHINode>(*UI))
526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      return true;
536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return false;
546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// entry block, return true.  This includes arguments used by switches, since
586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the switch may expand into multiple basic blocks.
59ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isOnlyUsedInEntryBlock(const Argument *A, bool EnableFastISel) {
606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // With FastISel active, we may be splitting blocks, so force creation
616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // of virtual registers for all non-dead arguments.
62d725f04ff81db0e61baa153bf21ca2dd08838244Dan Gohman  if (EnableFastISel)
636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    return A->use_empty();
646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
65ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  const BasicBlock *Entry = A->getParent()->begin();
66ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (Value::const_use_iterator UI = A->use_begin(), E = A->use_end();
67ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman       UI != E; ++UI)
686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (cast<Instruction>(*UI)->getParent() != Entry || isa<SwitchInst>(*UI))
696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      return false;  // Use not in entry block.
706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return true;
716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
73d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan GohmanFunctionLoweringInfo::FunctionLoweringInfo(const TargetLowering &tli)
746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  : TLI(tli) {
756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
777451d3e09d26115195280ba36f686a0a90815089Dan Gohmanvoid FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf) {
786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  Fn = &fn;
796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MF = &mf;
806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  RegInfo = &MF->getRegInfo();
816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Create a vreg for each argument register that is not dead and is used
836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // outside of the entry block for the function.
84ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (Function::const_arg_iterator AI = Fn->arg_begin(), E = Fn->arg_end();
856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman       AI != E; ++AI)
866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (!isOnlyUsedInEntryBlock(AI, EnableFastISel))
876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      InitializeRegForValue(AI);
886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Initialize the mapping of values to registers.  This is only set up for
906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // instruction values that are used outside of the block that defines
916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // them.
92ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  Function::const_iterator BB = Fn->begin(), EB = Fn->end();
93ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
94ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    if (const AllocaInst *AI = dyn_cast<AllocaInst>(I))
95ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman      if (const ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) {
966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        const Type *Ty = AI->getAllocatedType();
976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        uint64_t TySize = TLI.getTargetData()->getTypeAllocSize(Ty);
986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        unsigned Align =
996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty),
1006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman                   AI->getAlignment());
1016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        TySize *= CUI->getZExtValue();   // Get total allocated size.
1036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects.
1046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        StaticAllocaMap[AI] =
1056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          MF->getFrameInfo()->CreateStackObject(TySize, Align, false);
1066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
1076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  for (; BB != EB; ++BB)
109ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
110d84e806dd4b03fa711ae2665ac1acef646f16c5cDan Gohman      if (isUsedOutsideOfDefiningBlock(I))
1116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (!isa<AllocaInst>(I) ||
1126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman            !StaticAllocaMap.count(cast<AllocaInst>(I)))
1136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          InitializeRegForValue(I);
1146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Create an initial MachineBasicBlock for each LLVM BasicBlock in F.  This
1166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // also creates the initial PHI MachineInstrs, though none of the input
1176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // operands are populated.
118d0d8275cb264b17bed836ccd35c923476a236426Dan Gohman  for (BB = Fn->begin(); BB != EB; ++BB) {
1196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB);
1206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MBBMap[BB] = MBB;
1216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MF->push_back(MBB);
1226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Transfer the address-taken flag. This is necessary because there could
1246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only
1256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // the first one should be marked.
1266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (BB->hasAddressTaken())
1276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      MBB->setHasAddressTaken();
1286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Create Machine PHI nodes for LLVM PHI nodes, lowering them as
1306277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // appropriate.
1313f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman    for (BasicBlock::const_iterator I = BB->begin();
1323f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman         const PHINode *PN = dyn_cast<PHINode>(I); ++I) {
1333f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman      if (PN->use_empty()) continue;
1346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
135c025c853522feef9e8350c52b9013e5bf178dec3Dan Gohman      DebugLoc DL = PN->getDebugLoc();
1366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      unsigned PHIReg = ValueMap[PN];
1376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      assert(PHIReg && "PHI node does not have an assigned virtual register!");
1386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      SmallVector<EVT, 4> ValueVTs;
1406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      ComputeValueVTs(TLI, PN->getType(), ValueVTs);
1416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {
1426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        EVT VT = ValueVTs[vti];
1436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        unsigned NumRegisters = TLI.getNumRegisters(Fn->getContext(), VT);
1446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
1456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        for (unsigned i = 0; i != NumRegisters; ++i)
146518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner          BuildMI(MBB, DL, TII->get(TargetOpcode::PHI), PHIReg + i);
1476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        PHIReg += NumRegisters;
1486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
1496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    }
1506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  }
151de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman
152de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  // Mark landing pad blocks.
153de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  for (BB = Fn->begin(); BB != EB; ++BB)
154ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    if (const InvokeInst *Invoke = dyn_cast<InvokeInst>(BB->getTerminator()))
155de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman      MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
1566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
1576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// clear - Clear out all the function-specific state. This returns this
1596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// FunctionLoweringInfo to an empty state, ready to be used for a
1606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// different function.
1616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::clear() {
1620e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman  assert(CatchInfoFound.size() == CatchInfoLost.size() &&
1630e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman         "Not all catch info was assigned to a landing pad!");
1640e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman
1656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MBBMap.clear();
1666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  ValueMap.clear();
1676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  StaticAllocaMap.clear();
1686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#ifndef NDEBUG
1696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoLost.clear();
1706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoFound.clear();
1716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#endif
1726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  LiveOutRegInfo.clear();
1732ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  ArgDbgValues.clear();
1746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
1756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned FunctionLoweringInfo::MakeReg(EVT VT) {
1776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return RegInfo->createVirtualRegister(TLI.getRegClassFor(VT));
1786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
1796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// CreateRegForValue - Allocate the appropriate number of virtual registers of
1816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the correctly promoted or expanded types.  Assign these registers
1826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// consecutive vreg numbers and return the first assigned number.
1836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman///
1846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// In the case that the given value has struct or array type, this function
1856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// will assign registers for each member or element.
1866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman///
1876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned FunctionLoweringInfo::CreateRegForValue(const Value *V) {
1886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  SmallVector<EVT, 4> ValueVTs;
1896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  ComputeValueVTs(TLI, V->getType(), ValueVTs);
1906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  unsigned FirstReg = 0;
1926277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) {
1936277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    EVT ValueVT = ValueVTs[Value];
1946277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    EVT RegisterVT = TLI.getRegisterType(V->getContext(), ValueVT);
1956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    unsigned NumRegs = TLI.getNumRegisters(V->getContext(), ValueVT);
1976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    for (unsigned i = 0; i != NumRegs; ++i) {
1986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      unsigned R = MakeReg(RegisterVT);
1996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      if (!FirstReg) FirstReg = R;
2006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    }
2016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  }
2026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return FirstReg;
2036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
20466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
20566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// AddCatchInfo - Extract the personality and type infos from an eh.selector
20666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// call, and add them to the specified machine basic block.
2072520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI,
20866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman                        MachineBasicBlock *MBB) {
20966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // Inform the MachineModuleInfo of the personality for this landing pad.
210551754c4958086cc6910da7c950f2875e212f5cfEric Christopher  const ConstantExpr *CE = cast<ConstantExpr>(I.getOperand(2));
21166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  assert(CE->getOpcode() == Instruction::BitCast &&
21266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman         isa<Function>(CE->getOperand(0)) &&
21366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman         "Personality should be a function");
21466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  MMI->addPersonality(MBB, cast<Function>(CE->getOperand(0)));
21566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
21666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // Gather all the type infos for this landing pad and pass them along to
21766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // MachineModuleInfo.
21846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  std::vector<const GlobalVariable *> TyInfo;
219551754c4958086cc6910da7c950f2875e212f5cfEric Christopher  unsigned N = I.getNumOperands();
22066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
221551754c4958086cc6910da7c950f2875e212f5cfEric Christopher  for (unsigned i = N - 1; i > 2; --i) {
2222520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman    if (const ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(i))) {
22366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FilterLength = CI->getZExtValue();
22466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FirstCatch = i + FilterLength + !FilterLength;
22566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      assert (FirstCatch <= N && "Invalid filter length");
22666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
22766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      if (FirstCatch < N) {
22866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.reserve(N - FirstCatch);
22966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        for (unsigned j = FirstCatch; j < N; ++j)
23066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman          TyInfo.push_back(ExtractTypeInfo(I.getOperand(j)));
23166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addCatchTypeInfo(MBB, TyInfo);
23266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.clear();
23366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      }
23466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
23566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      if (!FilterLength) {
23666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        // Cleanup.
23766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addCleanup(MBB);
23866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      } else {
23966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        // Filter.
24066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.reserve(FilterLength - 1);
24166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        for (unsigned j = i + 1; j < FirstCatch; ++j)
24266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman          TyInfo.push_back(ExtractTypeInfo(I.getOperand(j)));
24366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addFilterTypeInfo(MBB, TyInfo);
24466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.clear();
24566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      }
24666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
24766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      N = i;
24866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman    }
24966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  }
25066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
251551754c4958086cc6910da7c950f2875e212f5cfEric Christopher  if (N > 3) {
252551754c4958086cc6910da7c950f2875e212f5cfEric Christopher    TyInfo.reserve(N - 3);
253551754c4958086cc6910da7c950f2875e212f5cfEric Christopher    for (unsigned j = 3; j < N; ++j)
25466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      TyInfo.push_back(ExtractTypeInfo(I.getOperand(j)));
25566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman    MMI->addCatchTypeInfo(MBB, TyInfo);
25666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  }
25766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman}
25866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
2592520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::CopyCatchInfo(const BasicBlock *SrcBB, const BasicBlock *DestBB,
2605fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman                         MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) {
2612520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman  for (BasicBlock::const_iterator I = SrcBB->begin(), E = --SrcBB->end();
2622520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman       I != E; ++I)
2632520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman    if (const EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) {
2645fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman      // Apply the catch info to DestBB.
2655fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman      AddCatchInfo(*EHSel, MMI, FLI.MBBMap[DestBB]);
2665fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#ifndef NDEBUG
2675fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman      if (!FLI.MBBMap[SrcBB]->isLandingPad())
2685fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman        FLI.CatchInfoFound.insert(EHSel);
2695fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#endif
2705fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman    }
2715fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman}
272