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"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/PostOrderIterator.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Analysis.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFrameInfo.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h"
22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineModuleInfo.h"
23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineRegisterInfo.h"
240bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h"
300b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
310b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/Debug.h"
336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/ErrorHandling.h"
346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/MathExtras.h"
35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
36d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetLowering.h"
37d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h"
38d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.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();
5003f09a3e329abcb35c1a5aa3a4546668b1af21eeGabor Greif        UI != E; ++UI) {
5103f09a3e329abcb35c1a5aa3a4546668b1af21eeGabor Greif    const User *U = *UI;
5203f09a3e329abcb35c1a5aa3a4546668b1af21eeGabor Greif    if (cast<Instruction>(U)->getParent() != BB || isa<PHINode>(U))
536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      return true;
5403f09a3e329abcb35c1a5aa3a4546668b1af21eeGabor Greif  }
556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return false;
566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
58d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan GohmanFunctionLoweringInfo::FunctionLoweringInfo(const TargetLowering &tli)
596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  : TLI(tli) {
606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
627451d3e09d26115195280ba36f686a0a90815089Dan Gohmanvoid FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf) {
636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  Fn = &fn;
646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MF = &mf;
656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  RegInfo = &MF->getRegInfo();
666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
6784023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  // Check whether the function can return without sret-demotion.
6884023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  SmallVector<ISD::OutputArg, 4> Outs;
698b62abdd7b9c8fc5d78dad86093f4afdfeba949dBill Wendling  GetReturnInfo(Fn->getReturnType(), Fn->getAttributes(), Outs, TLI);
70471e4224809f51652c71f319532697a879a75a0dEric Christopher  CanLowerReturn = TLI.CanLowerReturn(Fn->getCallingConv(), *MF,
715b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher                                      Fn->isVarArg(),
7284023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman                                      Outs, Fn->getContext());
7384023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Initialize the mapping of values to registers.  This is only set up for
756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // instruction values that are used outside of the block that defines
766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // them.
77ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  Function::const_iterator BB = Fn->begin(), EB = Fn->end();
78ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
79ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    if (const AllocaInst *AI = dyn_cast<AllocaInst>(I))
80ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman      if (const ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) {
81db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner        Type *Ty = AI->getAllocatedType();
823574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow        uint64_t TySize = TLI.getDataLayout()->getTypeAllocSize(Ty);
836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        unsigned Align =
843574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow          std::max((unsigned)TLI.getDataLayout()->getPrefTypeAlignment(Ty),
856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman                   AI->getAlignment());
866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        TySize *= CUI->getZExtValue();   // Get total allocated size.
886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects.
89dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling
90dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling        // The object may need to be placed onto the stack near the stack
91dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling        // protector if one exists. Determine here if this object is a suitable
92dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling        // candidate. I.e., it would trigger the creation of a stack protector.
93dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling        bool MayNeedSP =
94dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling          (AI->isArrayAllocation() ||
959c674bb012c23622bd31d5e82cb0baeda9aac3a5Bill Wendling           (TySize >= 8 && isa<ArrayType>(Ty) &&
96dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling            cast<ArrayType>(Ty)->getElementType()->isIntegerTy(8)));
976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        StaticAllocaMap[AI] =
985b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher          MF->getFrameInfo()->CreateStackObject(TySize, Align, false,
99c05d30601ced172b55be81bb529df6be91d6ae15Nadav Rotem                                                MayNeedSP, AI);
1006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
1016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  for (; BB != EB; ++BB)
1035b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher    for (BasicBlock::const_iterator I = BB->begin(), E = BB->end();
1045b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher         I != E; ++I) {
1059c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // Mark values used outside their block as exported, by allocating
1069c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // a virtual register for them.
1074ecc82e592745d6995db83ea158b3c15011a84f8Cameron Zwarich      if (isUsedOutsideOfDefiningBlock(I))
1086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (!isa<AllocaInst>(I) ||
1096277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman            !StaticAllocaMap.count(cast<AllocaInst>(I)))
1106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          InitializeRegForValue(I);
1116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1129c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // Collect llvm.dbg.declare information. This is done now instead of
1139c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // during the initial isel pass through the IR so that it is done
1149c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // in a predictable order.
1159c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      if (const DbgDeclareInst *DI = dyn_cast<DbgDeclareInst>(I)) {
1169c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman        MachineModuleInfo &MMI = MF->getMMI();
1179c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman        if (MMI.hasDebugInfo() &&
1189c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            DIVariable(DI->getVariable()).Verify() &&
1199c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            !DI->getDebugLoc().isUnknown()) {
1209c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          // Don't handle byval struct arguments or VLAs, for example.
1219c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          // Non-byval arguments are handled here (they refer to the stack
1229c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          // temporary alloca at this point).
1239c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          const Value *Address = DI->getAddress();
1249c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          if (Address) {
1259c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1269c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              Address = BCI->getOperand(0);
1279c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            if (const AllocaInst *AI = dyn_cast<AllocaInst>(Address)) {
1289c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              DenseMap<const AllocaInst *, int>::iterator SI =
1299c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                StaticAllocaMap.find(AI);
1309c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              if (SI != StaticAllocaMap.end()) { // Check for VLAs.
1319c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                int FI = SI->second;
1329c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                MMI.setVariableDbgInfo(DI->getVariable(),
1339c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                                       FI, DI->getDebugLoc());
1349c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              }
1359c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            }
1369c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          }
1379c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman        }
1389c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      }
1399c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman    }
1409c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman
1416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Create an initial MachineBasicBlock for each LLVM BasicBlock in F.  This
1426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // also creates the initial PHI MachineInstrs, though none of the input
1436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // operands are populated.
144d0d8275cb264b17bed836ccd35c923476a236426Dan Gohman  for (BB = Fn->begin(); BB != EB; ++BB) {
1456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB);
1466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MBBMap[BB] = MBB;
1476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MF->push_back(MBB);
1486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Transfer the address-taken flag. This is necessary because there could
1506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only
1516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // the first one should be marked.
1526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (BB->hasAddressTaken())
1536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      MBB->setHasAddressTaken();
1546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Create Machine PHI nodes for LLVM PHI nodes, lowering them as
1566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // appropriate.
1573f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman    for (BasicBlock::const_iterator I = BB->begin();
1583f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman         const PHINode *PN = dyn_cast<PHINode>(I); ++I) {
1593f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman      if (PN->use_empty()) continue;
1606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1613fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola      // Skip empty types
1623fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola      if (PN->getType()->isEmptyTy())
1633fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola        continue;
1643fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola
165c025c853522feef9e8350c52b9013e5bf178dec3Dan Gohman      DebugLoc DL = PN->getDebugLoc();
1666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      unsigned PHIReg = ValueMap[PN];
1676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      assert(PHIReg && "PHI node does not have an assigned virtual register!");
1686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      SmallVector<EVT, 4> ValueVTs;
1706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      ComputeValueVTs(TLI, PN->getType(), ValueVTs);
1716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {
1726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        EVT VT = ValueVTs[vti];
1736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        unsigned NumRegisters = TLI.getNumRegisters(Fn->getContext(), VT);
1746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
1756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        for (unsigned i = 0; i != NumRegisters; ++i)
176518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner          BuildMI(MBB, DL, TII->get(TargetOpcode::PHI), PHIReg + i);
1776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        PHIReg += NumRegisters;
1786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
1796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    }
1806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  }
181de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman
182de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  // Mark landing pad blocks.
183de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  for (BB = Fn->begin(); BB != EB; ++BB)
184ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    if (const InvokeInst *Invoke = dyn_cast<InvokeInst>(BB->getTerminator()))
185de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman      MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
1866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
1876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// clear - Clear out all the function-specific state. This returns this
1896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// FunctionLoweringInfo to an empty state, ready to be used for a
1906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// different function.
1916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::clear() {
1920e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman  assert(CatchInfoFound.size() == CatchInfoLost.size() &&
1930e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman         "Not all catch info was assigned to a landing pad!");
1940e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman
1956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MBBMap.clear();
1966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  ValueMap.clear();
1976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  StaticAllocaMap.clear();
1986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#ifndef NDEBUG
1996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoLost.clear();
2006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoFound.clear();
2016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#endif
2026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  LiveOutRegInfo.clear();
203a46cd97818ac6fa336b093adecf2006fb041ca1cCameron Zwarich  VisitedBBs.clear();
2042ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  ArgDbgValues.clear();
2050b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  ByValArgFrameIndexMap.clear();
20684023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  RegFixups.clear();
2076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
2086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
20989496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateReg - Allocate a single virtual register for the given type.
210a61b17c18a67f1b3faef2f2108379c4337ce9bb7Patrik Hagglundunsigned FunctionLoweringInfo::CreateReg(MVT VT) {
2116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return RegInfo->createVirtualRegister(TLI.getRegClassFor(VT));
2126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
2136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
21489496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateRegs - Allocate the appropriate number of virtual registers of
2156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the correctly promoted or expanded types.  Assign these registers
2166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// consecutive vreg numbers and return the first assigned number.
2176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman///
2186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// In the case that the given value has struct or array type, this function
2196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// will assign registers for each member or element.
2206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman///
221db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattnerunsigned FunctionLoweringInfo::CreateRegs(Type *Ty) {
2226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  SmallVector<EVT, 4> ValueVTs;
223ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman  ComputeValueVTs(TLI, Ty, ValueVTs);
2246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
2256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  unsigned FirstReg = 0;
2266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) {
2276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    EVT ValueVT = ValueVTs[Value];
228dfcf33a287d1756721f1f735af687595ce2f5a21Patrik Hagglund    MVT RegisterVT = TLI.getRegisterType(Ty->getContext(), ValueVT);
2296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
230ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman    unsigned NumRegs = TLI.getNumRegisters(Ty->getContext(), ValueVT);
2316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    for (unsigned i = 0; i != NumRegs; ++i) {
23289496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman      unsigned R = CreateReg(RegisterVT);
2336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      if (!FirstReg) FirstReg = R;
2346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    }
2356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  }
2366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return FirstReg;
2376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
23866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
2398ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
2408ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// register is a PHI destination and the PHI's LiveOutInfo is not valid. If
2418ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// the register's LiveOutInfo is for a smaller bit width, it is extended to
2428ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// the larger bit width by zero extension. The bit width must be no smaller
2438ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// than the LiveOutInfo's existing bit width.
2448ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarichconst FunctionLoweringInfo::LiveOutInfo *
2458ca814c4e0a39e1fcac023f0fb014917da07a796Cameron ZwarichFunctionLoweringInfo::GetLiveOutRegInfo(unsigned Reg, unsigned BitWidth) {
2468ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!LiveOutRegInfo.inBounds(Reg))
2478ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return NULL;
2488ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2498ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  LiveOutInfo *LOI = &LiveOutRegInfo[Reg];
2508ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!LOI->IsValid)
2518ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return NULL;
2528ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
25333b554795def5cd50f961721acbb33246226824bCameron Zwarich  if (BitWidth > LOI->KnownZero.getBitWidth()) {
2548fbbdca45c0eb2ef4a434cdef883f5c36516376cCameron Zwarich    LOI->NumSignBits = 1;
2558ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    LOI->KnownZero = LOI->KnownZero.zextOrTrunc(BitWidth);
2568ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    LOI->KnownOne = LOI->KnownOne.zextOrTrunc(BitWidth);
2578ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
2588ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2598ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  return LOI;
2608ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich}
2618ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2628ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// ComputePHILiveOutRegInfo - Compute LiveOutInfo for a PHI's destination
2638ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// register based on the LiveOutInfo of its operands.
2648ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarichvoid FunctionLoweringInfo::ComputePHILiveOutRegInfo(const PHINode *PN) {
265db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *Ty = PN->getType();
2668ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!Ty->isIntegerTy() || Ty->isVectorTy())
2678ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
2688ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2698ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  SmallVector<EVT, 1> ValueVTs;
2708ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  ComputeValueVTs(TLI, Ty, ValueVTs);
2718ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  assert(ValueVTs.size() == 1 &&
2728ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich         "PHIs with non-vector integer types should have a single VT.");
2738ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  EVT IntVT = ValueVTs[0];
2748ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2758ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (TLI.getNumRegisters(PN->getContext(), IntVT) != 1)
2768ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
2778ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  IntVT = TLI.getTypeToTransformTo(PN->getContext(), IntVT);
2788ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  unsigned BitWidth = IntVT.getSizeInBits();
2798ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2808ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  unsigned DestReg = ValueMap[PN];
2818ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!TargetRegisterInfo::isVirtualRegister(DestReg))
2828ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
2838ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  LiveOutRegInfo.grow(DestReg);
2848ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  LiveOutInfo &DestLOI = LiveOutRegInfo[DestReg];
2858ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2868ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  Value *V = PN->getIncomingValue(0);
2878ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (isa<UndefValue>(V) || isa<ConstantExpr>(V)) {
2888ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.NumSignBits = 1;
2898ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    APInt Zero(BitWidth, 0);
2908ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownZero = Zero;
2918ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownOne = Zero;
2928ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
2938ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
2948ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2958ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
2968ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    APInt Val = CI->getValue().zextOrTrunc(BitWidth);
2978ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.NumSignBits = Val.getNumSignBits();
2988ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownZero = ~Val;
2998ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownOne = Val;
3008ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  } else {
3018ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    assert(ValueMap.count(V) && "V should have been placed in ValueMap when its"
3028ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich                                "CopyToReg node was created.");
3038ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    unsigned SrcReg = ValueMap[V];
3048ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!TargetRegisterInfo::isVirtualRegister(SrcReg)) {
3058ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3068ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3078ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3088ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    const LiveOutInfo *SrcLOI = GetLiveOutRegInfo(SrcReg, BitWidth);
3098ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!SrcLOI) {
3108ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3118ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3128ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3138ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI = *SrcLOI;
3148ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
3158ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3168ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  assert(DestLOI.KnownZero.getBitWidth() == BitWidth &&
3178ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich         DestLOI.KnownOne.getBitWidth() == BitWidth &&
3188ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich         "Masks should have the same bit width as the type.");
3198ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3208ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i) {
3218ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    Value *V = PN->getIncomingValue(i);
3228ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (isa<UndefValue>(V) || isa<ConstantExpr>(V)) {
3238ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.NumSignBits = 1;
3248ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      APInt Zero(BitWidth, 0);
3258ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownZero = Zero;
3268ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownOne = Zero;
327471e4224809f51652c71f319532697a879a75a0dEric Christopher      return;
3288ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3298ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3308ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
3318ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      APInt Val = CI->getValue().zextOrTrunc(BitWidth);
3328ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.NumSignBits = std::min(DestLOI.NumSignBits, Val.getNumSignBits());
3338ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownZero &= ~Val;
3348ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownOne &= Val;
3358ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      continue;
3368ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3378ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3388ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    assert(ValueMap.count(V) && "V should have been placed in ValueMap when "
3398ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich                                "its CopyToReg node was created.");
3408ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    unsigned SrcReg = ValueMap[V];
3418ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!TargetRegisterInfo::isVirtualRegister(SrcReg)) {
3428ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3438ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3448ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3458ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    const LiveOutInfo *SrcLOI = GetLiveOutRegInfo(SrcReg, BitWidth);
3468ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!SrcLOI) {
3478ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3488ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3498ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3508ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.NumSignBits = std::min(DestLOI.NumSignBits, SrcLOI->NumSignBits);
3518ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownZero &= SrcLOI->KnownZero;
3528ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownOne &= SrcLOI->KnownOne;
3538ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
3548ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich}
3558ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3569aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patel/// setArgumentFrameIndex - Record frame index for the byval
3570b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// argument. This overrides previous frame index entry for this argument,
3580b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// if any.
3599aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patelvoid FunctionLoweringInfo::setArgumentFrameIndex(const Argument *A,
3605b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher                                                 int FI) {
3610b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  ByValArgFrameIndexMap[A] = FI;
3620b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel}
363471e4224809f51652c71f319532697a879a75a0dEric Christopher
3649aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patel/// getArgumentFrameIndex - Get frame index for the byval argument.
3650b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// If the argument does not have any assigned frame index then 0 is
3660b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// returned.
3679aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patelint FunctionLoweringInfo::getArgumentFrameIndex(const Argument *A) {
368471e4224809f51652c71f319532697a879a75a0dEric Christopher  DenseMap<const Argument *, int>::iterator I =
3690b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel    ByValArgFrameIndexMap.find(A);
3700b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  if (I != ByValArgFrameIndexMap.end())
3710b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel    return I->second;
3720822e010d1b55eb24e746a575a31235f45110ac3Eric Christopher  DEBUG(dbgs() << "Argument does not have assigned frame index!\n");
3730b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  return 0;
3740b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel}
3750b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel
376c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// ComputeUsesVAFloatArgument - Determine if any floating-point values are
377c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// being passed to this variadic function, and set the MachineModuleInfo's
378c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// usesVAFloatArgument flag if so. This flag is used to emit an undefined
379c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// reference to _fltused on Windows, which will link in MSVCRT's
380c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// floating-point support.
381c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencervoid llvm::ComputeUsesVAFloatArgument(const CallInst &I,
382c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer                                      MachineModuleInfo *MMI)
383c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer{
384c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer  FunctionType *FT = cast<FunctionType>(
385c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer    I.getCalledValue()->getType()->getContainedType(0));
386c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer  if (FT->isVarArg() && !MMI->usesVAFloatArgument()) {
387c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer    for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) {
388c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer      Type* T = I.getArgOperand(i)->getType();
389c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer      for (po_iterator<Type*> i = po_begin(T), e = po_end(T);
390c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer           i != e; ++i) {
391c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer        if (i->isFloatingPointTy()) {
392c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer          MMI->setUsesVAFloatArgument(true);
393c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer          return;
394c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer        }
395c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer      }
396c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer    }
397c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer  }
398c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer}
399c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer
40066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// AddCatchInfo - Extract the personality and type infos from an eh.selector
40166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// call, and add them to the specified machine basic block.
4022520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI,
40366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman                        MachineBasicBlock *MBB) {
40466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // Inform the MachineModuleInfo of the personality for this landing pad.
4051518444f0c0f7675a30f34bcf58e8cef21d37c80Gabor Greif  const ConstantExpr *CE = cast<ConstantExpr>(I.getArgOperand(1));
40666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  assert(CE->getOpcode() == Instruction::BitCast &&
40766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman         isa<Function>(CE->getOperand(0)) &&
40866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman         "Personality should be a function");
40966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  MMI->addPersonality(MBB, cast<Function>(CE->getOperand(0)));
41066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
41166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // Gather all the type infos for this landing pad and pass them along to
41266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // MachineModuleInfo.
41346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  std::vector<const GlobalVariable *> TyInfo;
414e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  unsigned N = I.getNumArgOperands();
41566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
416e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  for (unsigned i = N - 1; i > 1; --i) {
417e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    if (const ConstantInt *CI = dyn_cast<ConstantInt>(I.getArgOperand(i))) {
41866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FilterLength = CI->getZExtValue();
41966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FirstCatch = i + FilterLength + !FilterLength;
420e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif      assert(FirstCatch <= N && "Invalid filter length");
42166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
42266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      if (FirstCatch < N) {
42366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.reserve(N - FirstCatch);
42466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        for (unsigned j = FirstCatch; j < N; ++j)
425e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif          TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j)));
42666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addCatchTypeInfo(MBB, TyInfo);
42766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.clear();
42866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      }
42966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
43066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      if (!FilterLength) {
43166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        // Cleanup.
43266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addCleanup(MBB);
43366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      } else {
43466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        // Filter.
43566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.reserve(FilterLength - 1);
43666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        for (unsigned j = i + 1; j < FirstCatch; ++j)
437e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif          TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j)));
43866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addFilterTypeInfo(MBB, TyInfo);
43966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.clear();
44066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      }
44166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
44266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      N = i;
44366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman    }
44466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  }
44566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
446e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  if (N > 2) {
447e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    TyInfo.reserve(N - 2);
448e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    for (unsigned j = 2; j < N; ++j)
449e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif      TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j)));
45066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman    MMI->addCatchTypeInfo(MBB, TyInfo);
45166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  }
45266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman}
45366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
4542ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling/// AddLandingPadInfo - Extract the exception handling information from the
4552ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling/// landingpad instruction and add them to the specified machine module info.
4562ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendlingvoid llvm::AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
4572ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling                             MachineBasicBlock *MBB) {
4582ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  MMI.addPersonality(MBB,
4592ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling                     cast<Function>(I.getPersonalityFn()->stripPointerCasts()));
4602ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling
4612ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  if (I.isCleanup())
4622ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    MMI.addCleanup(MBB);
4632ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling
4642ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  // FIXME: New EH - Add the clauses in reverse order. This isn't 100% correct,
4652ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  //        but we need to do it this way because of how the DWARF EH emitter
4662ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  //        processes the clauses.
4672ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  for (unsigned i = I.getNumClauses(); i != 0; --i) {
4682ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    Value *Val = I.getClause(i - 1);
4692ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    if (I.isCatch(i - 1)) {
4702ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      MMI.addCatchTypeInfo(MBB,
4712ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling                           dyn_cast<GlobalVariable>(Val->stripPointerCasts()));
4722ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    } else {
4732ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      // Add filters in a list.
4742ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      Constant *CVal = cast<Constant>(Val);
4752ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      SmallVector<const GlobalVariable*, 4> FilterList;
4762ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      for (User::op_iterator
4772ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling             II = CVal->op_begin(), IE = CVal->op_end(); II != IE; ++II)
4782ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling        FilterList.push_back(cast<GlobalVariable>((*II)->stripPointerCasts()));
4792ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling
4802ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      MMI.addFilterTypeInfo(MBB, FilterList);
4812ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    }
4822ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  }
4832ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling}
484