FunctionLoweringInfo.cpp revision 4c3fd9f92f89810d659973d2666ab729758de64a
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"
164c3fd9f92f89810d659973d2666ab729758de64aDan Gohman#include "llvm/CodeGen/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"
336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetLowering.h"
346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetOptions.h"
356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/Debug.h"
366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/ErrorHandling.h"
376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/MathExtras.h"
386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include <algorithm>
396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanusing namespace llvm;
406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by
426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// PHI nodes or outside of the basic block that defines it, or used by a
436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// switch or atomic instruction, which may expand to multiple basic blocks.
44ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isUsedOutsideOfDefiningBlock(const Instruction *I) {
45d84e806dd4b03fa711ae2665ac1acef646f16c5cDan Gohman  if (I->use_empty()) return false;
466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  if (isa<PHINode>(I)) return true;
47ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  const BasicBlock *BB = I->getParent();
48ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (Value::const_use_iterator UI = I->use_begin(), E = I->use_end();
49ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman        UI != E; ++UI)
506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (cast<Instruction>(*UI)->getParent() != BB || isa<PHINode>(*UI))
516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      return true;
526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return false;
536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isOnlyUsedInEntryBlock - If the specified argument is only used in the
566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// entry block, return true.  This includes arguments used by switches, since
576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the switch may expand into multiple basic blocks.
58ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isOnlyUsedInEntryBlock(const Argument *A, bool EnableFastISel) {
596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // With FastISel active, we may be splitting blocks, so force creation
606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // of virtual registers for all non-dead arguments.
61d725f04ff81db0e61baa153bf21ca2dd08838244Dan Gohman  if (EnableFastISel)
626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    return A->use_empty();
636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
64ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  const BasicBlock *Entry = A->getParent()->begin();
65ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (Value::const_use_iterator UI = A->use_begin(), E = A->use_end();
66ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman       UI != E; ++UI)
676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (cast<Instruction>(*UI)->getParent() != Entry || isa<SwitchInst>(*UI))
686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      return false;  // Use not in entry block.
696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return true;
706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
72d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan GohmanFunctionLoweringInfo::FunctionLoweringInfo(const TargetLowering &tli)
736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  : TLI(tli) {
746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
767451d3e09d26115195280ba36f686a0a90815089Dan Gohmanvoid FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf) {
776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  Fn = &fn;
786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MF = &mf;
796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  RegInfo = &MF->getRegInfo();
806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Create a vreg for each argument register that is not dead and is used
826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // outside of the entry block for the function.
83ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (Function::const_arg_iterator AI = Fn->arg_begin(), E = Fn->arg_end();
846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman       AI != E; ++AI)
856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (!isOnlyUsedInEntryBlock(AI, EnableFastISel))
866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      InitializeRegForValue(AI);
876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Initialize the mapping of values to registers.  This is only set up for
896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // instruction values that are used outside of the block that defines
906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // them.
91ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  Function::const_iterator BB = Fn->begin(), EB = Fn->end();
92ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
93ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    if (const AllocaInst *AI = dyn_cast<AllocaInst>(I))
94ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman      if (const ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) {
956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        const Type *Ty = AI->getAllocatedType();
966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        uint64_t TySize = TLI.getTargetData()->getTypeAllocSize(Ty);
976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        unsigned Align =
986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty),
996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman                   AI->getAlignment());
1006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        TySize *= CUI->getZExtValue();   // Get total allocated size.
1026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects.
1036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        StaticAllocaMap[AI] =
1046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          MF->getFrameInfo()->CreateStackObject(TySize, Align, false);
1056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
1066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  for (; BB != EB; ++BB)
108ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
109d84e806dd4b03fa711ae2665ac1acef646f16c5cDan Gohman      if (isUsedOutsideOfDefiningBlock(I))
1106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (!isa<AllocaInst>(I) ||
1116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman            !StaticAllocaMap.count(cast<AllocaInst>(I)))
1126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          InitializeRegForValue(I);
1136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Create an initial MachineBasicBlock for each LLVM BasicBlock in F.  This
1156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // also creates the initial PHI MachineInstrs, though none of the input
1166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // operands are populated.
117d0d8275cb264b17bed836ccd35c923476a236426Dan Gohman  for (BB = Fn->begin(); BB != EB; ++BB) {
1186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB);
1196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MBBMap[BB] = MBB;
1206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MF->push_back(MBB);
1216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Transfer the address-taken flag. This is necessary because there could
1236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only
1246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // the first one should be marked.
1256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (BB->hasAddressTaken())
1266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      MBB->setHasAddressTaken();
1276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Create Machine PHI nodes for LLVM PHI nodes, lowering them as
1296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // appropriate.
1303f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman    for (BasicBlock::const_iterator I = BB->begin();
1313f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman         const PHINode *PN = dyn_cast<PHINode>(I); ++I) {
1323f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman      if (PN->use_empty()) continue;
1336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
134c025c853522feef9e8350c52b9013e5bf178dec3Dan Gohman      DebugLoc DL = PN->getDebugLoc();
1356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      unsigned PHIReg = ValueMap[PN];
1366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      assert(PHIReg && "PHI node does not have an assigned virtual register!");
1376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      SmallVector<EVT, 4> ValueVTs;
1396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      ComputeValueVTs(TLI, PN->getType(), ValueVTs);
1406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {
1416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        EVT VT = ValueVTs[vti];
1426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        unsigned NumRegisters = TLI.getNumRegisters(Fn->getContext(), VT);
1436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
1446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        for (unsigned i = 0; i != NumRegisters; ++i)
145518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner          BuildMI(MBB, DL, TII->get(TargetOpcode::PHI), PHIReg + i);
1466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        PHIReg += NumRegisters;
1476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
1486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    }
1496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  }
150de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman
151de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  // Mark landing pad blocks.
152de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  for (BB = Fn->begin(); BB != EB; ++BB)
153ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    if (const InvokeInst *Invoke = dyn_cast<InvokeInst>(BB->getTerminator()))
154de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman      MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
1556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
1566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// clear - Clear out all the function-specific state. This returns this
1586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// FunctionLoweringInfo to an empty state, ready to be used for a
1596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// different function.
1606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::clear() {
1610e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman  assert(CatchInfoFound.size() == CatchInfoLost.size() &&
1620e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman         "Not all catch info was assigned to a landing pad!");
1630e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman
1646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MBBMap.clear();
1656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  ValueMap.clear();
1666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  StaticAllocaMap.clear();
1676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#ifndef NDEBUG
1686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoLost.clear();
1696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoFound.clear();
1706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#endif
1716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  LiveOutRegInfo.clear();
1722ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  ArgDbgValues.clear();
1736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
1746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
17589496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateReg - Allocate a single virtual register for the given type.
17689496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohmanunsigned FunctionLoweringInfo::CreateReg(EVT VT) {
1776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return RegInfo->createVirtualRegister(TLI.getRegClassFor(VT));
1786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
1796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
18089496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateRegs - 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///
18789496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohmanunsigned FunctionLoweringInfo::CreateRegs(const Type *Ty) {
1886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  SmallVector<EVT, 4> ValueVTs;
189ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman  ComputeValueVTs(TLI, Ty, 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];
194ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman    EVT RegisterVT = TLI.getRegisterType(Ty->getContext(), ValueVT);
1956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
196ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman    unsigned NumRegs = TLI.getNumRegisters(Ty->getContext(), ValueVT);
1976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    for (unsigned i = 0; i != NumRegs; ++i) {
19889496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman      unsigned R = CreateReg(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.
2101518444f0c0f7675a30f34bcf58e8cef21d37c80Gabor Greif  const ConstantExpr *CE = cast<ConstantExpr>(I.getArgOperand(1));
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;
219e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  unsigned N = I.getNumArgOperands();
22066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
221e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  for (unsigned i = N - 1; i > 1; --i) {
222e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    if (const ConstantInt *CI = dyn_cast<ConstantInt>(I.getArgOperand(i))) {
22366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FilterLength = CI->getZExtValue();
22466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FirstCatch = i + FilterLength + !FilterLength;
225e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif      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)
230e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif          TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(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)
242e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif          TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(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
251e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  if (N > 2) {
252e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    TyInfo.reserve(N - 2);
253e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    for (unsigned j = 2; j < N; ++j)
254e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif      TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(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