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
154c3fd9f92f89810d659973d2666ab729758de64aDan Gohman#include "llvm/CodeGen/FunctionLoweringInfo.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/PostOrderIterator.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Analysis.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFrameInfo.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineModuleInfo.h"
22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineRegisterInfo.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DebugInfo.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h"
290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
300b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/Debug.h"
326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/ErrorHandling.h"
336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/MathExtras.h"
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetFrameLowering.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
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "function-lowering-info"
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by
456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// PHI nodes or outside of the basic block that defines it, or used by a
466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// switch or atomic instruction, which may expand to multiple basic blocks.
47ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isUsedOutsideOfDefiningBlock(const Instruction *I) {
48d84e806dd4b03fa711ae2665ac1acef646f16c5cDan Gohman  if (I->use_empty()) return false;
496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  if (isa<PHINode>(I)) return true;
50ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  const BasicBlock *BB = I->getParent();
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (const User *U : I->users())
5203f09a3e329abcb35c1a5aa3a4546668b1af21eeGabor Greif    if (cast<Instruction>(U)->getParent() != BB || isa<PHINode>(U))
536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      return true;
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return false;
566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               SelectionDAG *DAG) {
60d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling  const TargetLowering *TLI = TM.getTargetLowering();
61d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling
626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  Fn = &fn;
636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MF = &mf;
646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  RegInfo = &MF->getRegInfo();
656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
6684023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  // Check whether the function can return without sret-demotion.
6784023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  SmallVector<ISD::OutputArg, 4> Outs;
68384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling  GetReturnInfo(Fn->getReturnType(), Fn->getAttributes(), Outs, *TLI);
69384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling  CanLowerReturn = TLI->CanLowerReturn(Fn->getCallingConv(), *MF,
70384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling                                       Fn->isVarArg(),
71384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling                                       Outs, Fn->getContext());
7284023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Initialize the mapping of values to registers.  This is only set up for
746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // instruction values that are used outside of the block that defines
756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // them.
76ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  Function::const_iterator BB = Fn->begin(), EB = Fn->end();
77ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (const AllocaInst *AI = dyn_cast<AllocaInst>(I)) {
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // Don't fold inalloca allocas or other dynamic allocas into the initial
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // stack frame allocation, even if they are in the entry block.
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (!AI->isStaticAlloca())
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        continue;
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
84ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman      if (const ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) {
85db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner        Type *Ty = AI->getAllocatedType();
86384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling        uint64_t TySize = TLI->getDataLayout()->getTypeAllocSize(Ty);
876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        unsigned Align =
88384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling          std::max((unsigned)TLI->getDataLayout()->getPrefTypeAlignment(Ty),
896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman                   AI->getAlignment());
906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        TySize *= CUI->getZExtValue();   // Get total allocated size.
926277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects.
93dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling
946277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        StaticAllocaMap[AI] =
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          MF->getFrameInfo()->CreateStackObject(TySize, Align, false, AI);
966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  for (; BB != EB; ++BB)
1005b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher    for (BasicBlock::const_iterator I = BB->begin(), E = BB->end();
1015b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher         I != E; ++I) {
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // Look for dynamic allocas.
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (const AllocaInst *AI = dyn_cast<AllocaInst>(I)) {
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        if (!AI->isStaticAlloca()) {
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          unsigned Align = std::max(
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              (unsigned)TLI->getDataLayout()->getPrefTypeAlignment(
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                AI->getAllocatedType()),
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              AI->getAlignment());
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          unsigned StackAlign = TM.getFrameLowering()->getStackAlignment();
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          if (Align <= StackAlign)
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            Align = 0;
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          // Inform the Frame Information that we have variable-sized objects.
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          MF->getFrameInfo()->CreateVariableSizedObject(Align ? Align : 1, AI);
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        }
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // Look for inline asm that clobbers the SP register.
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (isa<CallInst>(I) || isa<InvokeInst>(I)) {
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        ImmutableCallSite CS(I);
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        if (isa<InlineAsm>(CS.getCalledValue())) {
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          unsigned SP = TLI->getStackPointerRegisterToSaveRestore();
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          std::vector<TargetLowering::AsmOperandInfo> Ops =
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            TLI->ParseConstraints(CS);
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          for (size_t I = 0, E = Ops.size(); I != E; ++I) {
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            TargetLowering::AsmOperandInfo &Op = Ops[I];
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            if (Op.Type == InlineAsm::isClobber) {
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              // Clobbers don't have SDValue operands, hence SDValue().
12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              TLI->ComputeConstraintToUse(Op, SDValue(), DAG);
12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              std::pair<unsigned, const TargetRegisterClass*> PhysReg =
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                TLI->getRegForInlineAsmConstraint(Op.ConstraintCode,
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                  Op.ConstraintVT);
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              if (PhysReg.first == SP)
13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                MF->getFrameInfo()->setHasInlineAsmWithSPAdjust(true);
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            }
13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          }
13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        }
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1399c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // Mark values used outside their block as exported, by allocating
1409c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // a virtual register for them.
1414ecc82e592745d6995db83ea158b3c15011a84f8Cameron Zwarich      if (isUsedOutsideOfDefiningBlock(I))
1426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        if (!isa<AllocaInst>(I) ||
1436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman            !StaticAllocaMap.count(cast<AllocaInst>(I)))
1446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman          InitializeRegForValue(I);
1456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1469c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // Collect llvm.dbg.declare information. This is done now instead of
1479c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // during the initial isel pass through the IR so that it is done
1489c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      // in a predictable order.
1499c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      if (const DbgDeclareInst *DI = dyn_cast<DbgDeclareInst>(I)) {
1509c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman        MachineModuleInfo &MMI = MF->getMMI();
151cbafae6d33031a72ba8219c28cb0e852511f79a3Manman Ren        DIVariable DIVar(DI->getVariable());
152cbafae6d33031a72ba8219c28cb0e852511f79a3Manman Ren        assert((!DIVar || DIVar.isVariable()) &&
153cbafae6d33031a72ba8219c28cb0e852511f79a3Manman Ren          "Variable in DbgDeclareInst should be either null or a DIVariable.");
1549c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman        if (MMI.hasDebugInfo() &&
155cbafae6d33031a72ba8219c28cb0e852511f79a3Manman Ren            DIVar &&
1569c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            !DI->getDebugLoc().isUnknown()) {
1579c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          // Don't handle byval struct arguments or VLAs, for example.
1589c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          // Non-byval arguments are handled here (they refer to the stack
1599c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          // temporary alloca at this point).
1609c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          const Value *Address = DI->getAddress();
1619c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          if (Address) {
1629c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
1639c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              Address = BCI->getOperand(0);
1649c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            if (const AllocaInst *AI = dyn_cast<AllocaInst>(Address)) {
1659c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              DenseMap<const AllocaInst *, int>::iterator SI =
1669c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                StaticAllocaMap.find(AI);
1679c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              if (SI != StaticAllocaMap.end()) { // Check for VLAs.
1689c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                int FI = SI->second;
1699c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                MMI.setVariableDbgInfo(DI->getVariable(),
1709c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman                                       FI, DI->getDebugLoc());
1719c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman              }
1729c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman            }
1739c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman          }
1749c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman        }
1759c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman      }
1769c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman    }
1779c3d5e41b94ff51dc78ae42397151b52d9c2b546Dan Gohman
1786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // Create an initial MachineBasicBlock for each LLVM BasicBlock in F.  This
1796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // also creates the initial PHI MachineInstrs, though none of the input
1806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  // operands are populated.
181d0d8275cb264b17bed836ccd35c923476a236426Dan Gohman  for (BB = Fn->begin(); BB != EB; ++BB) {
1826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB);
1836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MBBMap[BB] = MBB;
1846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    MF->push_back(MBB);
1856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Transfer the address-taken flag. This is necessary because there could
1876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only
1886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // the first one should be marked.
1896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    if (BB->hasAddressTaken())
1906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      MBB->setHasAddressTaken();
1916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1926277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // Create Machine PHI nodes for LLVM PHI nodes, lowering them as
1936277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    // appropriate.
1943f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman    for (BasicBlock::const_iterator I = BB->begin();
1953f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman         const PHINode *PN = dyn_cast<PHINode>(I); ++I) {
1963f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman      if (PN->use_empty()) continue;
1976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
1983fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola      // Skip empty types
1993fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola      if (PN->getType()->isEmptyTy())
2003fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola        continue;
2013fa82837441d716a225427f7a924f36d21db3a32Rafael Espindola
202c025c853522feef9e8350c52b9013e5bf178dec3Dan Gohman      DebugLoc DL = PN->getDebugLoc();
2036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      unsigned PHIReg = ValueMap[PN];
2046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      assert(PHIReg && "PHI node does not have an assigned virtual register!");
2056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
2066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      SmallVector<EVT, 4> ValueVTs;
207384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling      ComputeValueVTs(*TLI, PN->getType(), ValueVTs);
2086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {
2096277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        EVT VT = ValueVTs[vti];
210384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling        unsigned NumRegisters = TLI->getNumRegisters(Fn->getContext(), VT);
2116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
2126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        for (unsigned i = 0; i != NumRegisters; ++i)
213518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner          BuildMI(MBB, DL, TII->get(TargetOpcode::PHI), PHIReg + i);
2146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman        PHIReg += NumRegisters;
2156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      }
2166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    }
2176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  }
218de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman
219de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  // Mark landing pad blocks.
220de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman  for (BB = Fn->begin(); BB != EB; ++BB)
221ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman    if (const InvokeInst *Invoke = dyn_cast<InvokeInst>(BB->getTerminator()))
222de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman      MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
2236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
2246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
2256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// clear - Clear out all the function-specific state. This returns this
2266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// FunctionLoweringInfo to an empty state, ready to be used for a
2276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// different function.
2286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::clear() {
2290e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman  assert(CatchInfoFound.size() == CatchInfoLost.size() &&
2300e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman         "Not all catch info was assigned to a landing pad!");
2310e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman
2326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  MBBMap.clear();
2336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  ValueMap.clear();
2346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  StaticAllocaMap.clear();
2356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#ifndef NDEBUG
2366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoLost.clear();
2376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  CatchInfoFound.clear();
2386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#endif
2396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  LiveOutRegInfo.clear();
240a46cd97818ac6fa336b093adecf2006fb041ca1cCameron Zwarich  VisitedBBs.clear();
2412ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  ArgDbgValues.clear();
2420b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  ByValArgFrameIndexMap.clear();
24384023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  RegFixups.clear();
2446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
2456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
24689496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateReg - Allocate a single virtual register for the given type.
247a61b17c18a67f1b3faef2f2108379c4337ce9bb7Patrik Hagglundunsigned FunctionLoweringInfo::CreateReg(MVT VT) {
248d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling  return RegInfo->
249d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling    createVirtualRegister(TM.getTargetLowering()->getRegClassFor(VT));
2506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
2516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
25289496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateRegs - Allocate the appropriate number of virtual registers of
2536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the correctly promoted or expanded types.  Assign these registers
2546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// consecutive vreg numbers and return the first assigned number.
2556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman///
2566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// In the case that the given value has struct or array type, this function
2576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// will assign registers for each member or element.
2586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman///
259db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattnerunsigned FunctionLoweringInfo::CreateRegs(Type *Ty) {
260d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling  const TargetLowering *TLI = TM.getTargetLowering();
261d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling
2626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  SmallVector<EVT, 4> ValueVTs;
263384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling  ComputeValueVTs(*TLI, Ty, ValueVTs);
2646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
2656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  unsigned FirstReg = 0;
2666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) {
2676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    EVT ValueVT = ValueVTs[Value];
268384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling    MVT RegisterVT = TLI->getRegisterType(Ty->getContext(), ValueVT);
2696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman
270384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling    unsigned NumRegs = TLI->getNumRegisters(Ty->getContext(), ValueVT);
2716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    for (unsigned i = 0; i != NumRegs; ++i) {
27289496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman      unsigned R = CreateReg(RegisterVT);
2736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman      if (!FirstReg) FirstReg = R;
2746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman    }
2756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  }
2766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman  return FirstReg;
2776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman}
27866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
2798ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// GetLiveOutRegInfo - Gets LiveOutInfo for a register, returning NULL if the
2808ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// register is a PHI destination and the PHI's LiveOutInfo is not valid. If
2818ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// the register's LiveOutInfo is for a smaller bit width, it is extended to
2828ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// the larger bit width by zero extension. The bit width must be no smaller
2838ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// than the LiveOutInfo's existing bit width.
2848ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarichconst FunctionLoweringInfo::LiveOutInfo *
2858ca814c4e0a39e1fcac023f0fb014917da07a796Cameron ZwarichFunctionLoweringInfo::GetLiveOutRegInfo(unsigned Reg, unsigned BitWidth) {
2868ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!LiveOutRegInfo.inBounds(Reg))
287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
2888ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2898ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  LiveOutInfo *LOI = &LiveOutRegInfo[Reg];
2908ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!LOI->IsValid)
291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
2928ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
29333b554795def5cd50f961721acbb33246226824bCameron Zwarich  if (BitWidth > LOI->KnownZero.getBitWidth()) {
2948fbbdca45c0eb2ef4a434cdef883f5c36516376cCameron Zwarich    LOI->NumSignBits = 1;
2958ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    LOI->KnownZero = LOI->KnownZero.zextOrTrunc(BitWidth);
2968ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    LOI->KnownOne = LOI->KnownOne.zextOrTrunc(BitWidth);
2978ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
2988ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
2998ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  return LOI;
3008ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich}
3018ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3028ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// ComputePHILiveOutRegInfo - Compute LiveOutInfo for a PHI's destination
3038ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich/// register based on the LiveOutInfo of its operands.
3048ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarichvoid FunctionLoweringInfo::ComputePHILiveOutRegInfo(const PHINode *PN) {
305db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *Ty = PN->getType();
3068ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!Ty->isIntegerTy() || Ty->isVectorTy())
3078ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
3088ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
309d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling  const TargetLowering *TLI = TM.getTargetLowering();
310d626d33246c897a10d40e01b8658fa05c36b1e5fBill Wendling
3118ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  SmallVector<EVT, 1> ValueVTs;
312384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling  ComputeValueVTs(*TLI, Ty, ValueVTs);
3138ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  assert(ValueVTs.size() == 1 &&
3148ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich         "PHIs with non-vector integer types should have a single VT.");
3158ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  EVT IntVT = ValueVTs[0];
3168ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
317384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling  if (TLI->getNumRegisters(PN->getContext(), IntVT) != 1)
3188ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
319384ceb8446bebe4425e65d1035256eee3b4cfa6dBill Wendling  IntVT = TLI->getTypeToTransformTo(PN->getContext(), IntVT);
3208ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  unsigned BitWidth = IntVT.getSizeInBits();
3218ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3228ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  unsigned DestReg = ValueMap[PN];
3238ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (!TargetRegisterInfo::isVirtualRegister(DestReg))
3248ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
3258ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  LiveOutRegInfo.grow(DestReg);
3268ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  LiveOutInfo &DestLOI = LiveOutRegInfo[DestReg];
3278ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3288ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  Value *V = PN->getIncomingValue(0);
3298ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (isa<UndefValue>(V) || isa<ConstantExpr>(V)) {
3308ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.NumSignBits = 1;
3318ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    APInt Zero(BitWidth, 0);
3328ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownZero = Zero;
3338ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownOne = Zero;
3348ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    return;
3358ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
3368ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3378ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
3388ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    APInt Val = CI->getValue().zextOrTrunc(BitWidth);
3398ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.NumSignBits = Val.getNumSignBits();
3408ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownZero = ~Val;
3418ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownOne = Val;
3428ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  } else {
3438ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    assert(ValueMap.count(V) && "V should have been placed in ValueMap when its"
3448ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich                                "CopyToReg node was created.");
3458ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    unsigned SrcReg = ValueMap[V];
3468ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!TargetRegisterInfo::isVirtualRegister(SrcReg)) {
3478ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3488ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3498ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3508ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    const LiveOutInfo *SrcLOI = GetLiveOutRegInfo(SrcReg, BitWidth);
3518ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!SrcLOI) {
3528ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3538ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3548ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3558ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI = *SrcLOI;
3568ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
3578ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3588ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  assert(DestLOI.KnownZero.getBitWidth() == BitWidth &&
3598ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich         DestLOI.KnownOne.getBitWidth() == BitWidth &&
3608ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich         "Masks should have the same bit width as the type.");
3618ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3628ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i) {
3638ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    Value *V = PN->getIncomingValue(i);
3648ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (isa<UndefValue>(V) || isa<ConstantExpr>(V)) {
3658ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.NumSignBits = 1;
3668ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      APInt Zero(BitWidth, 0);
3678ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownZero = Zero;
3688ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownOne = Zero;
369471e4224809f51652c71f319532697a879a75a0dEric Christopher      return;
3708ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3718ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3728ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
3738ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      APInt Val = CI->getValue().zextOrTrunc(BitWidth);
3748ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.NumSignBits = std::min(DestLOI.NumSignBits, Val.getNumSignBits());
3758ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownZero &= ~Val;
3768ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.KnownOne &= Val;
3778ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      continue;
3788ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3798ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3808ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    assert(ValueMap.count(V) && "V should have been placed in ValueMap when "
3818ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich                                "its CopyToReg node was created.");
3828ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    unsigned SrcReg = ValueMap[V];
3838ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!TargetRegisterInfo::isVirtualRegister(SrcReg)) {
3848ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3858ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3868ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3878ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    const LiveOutInfo *SrcLOI = GetLiveOutRegInfo(SrcReg, BitWidth);
3888ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    if (!SrcLOI) {
3898ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      DestLOI.IsValid = false;
3908ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich      return;
3918ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    }
3928ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.NumSignBits = std::min(DestLOI.NumSignBits, SrcLOI->NumSignBits);
3938ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownZero &= SrcLOI->KnownZero;
3948ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich    DestLOI.KnownOne &= SrcLOI->KnownOne;
3958ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich  }
3968ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich}
3978ca814c4e0a39e1fcac023f0fb014917da07a796Cameron Zwarich
3989aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patel/// setArgumentFrameIndex - Record frame index for the byval
3990b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// argument. This overrides previous frame index entry for this argument,
4000b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// if any.
4019aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patelvoid FunctionLoweringInfo::setArgumentFrameIndex(const Argument *A,
4025b13ed1ac9745f21f30ddb07015cf27959c194c4Eric Christopher                                                 int FI) {
4030b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  ByValArgFrameIndexMap[A] = FI;
4040b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel}
405471e4224809f51652c71f319532697a879a75a0dEric Christopher
4069aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patel/// getArgumentFrameIndex - Get frame index for the byval argument.
4070b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// If the argument does not have any assigned frame index then 0 is
4080b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel/// returned.
4099aee335c23bec4f6d1b2cab3bca76231d7b0d556Devang Patelint FunctionLoweringInfo::getArgumentFrameIndex(const Argument *A) {
410471e4224809f51652c71f319532697a879a75a0dEric Christopher  DenseMap<const Argument *, int>::iterator I =
4110b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel    ByValArgFrameIndexMap.find(A);
4120b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  if (I != ByValArgFrameIndexMap.end())
4130b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel    return I->second;
4140822e010d1b55eb24e746a575a31235f45110ac3Eric Christopher  DEBUG(dbgs() << "Argument does not have assigned frame index!\n");
4150b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel  return 0;
4160b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel}
4170b48eade42022c929fcf0f2afcffdf849c5bd05aDevang Patel
418c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// ComputeUsesVAFloatArgument - Determine if any floating-point values are
419c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// being passed to this variadic function, and set the MachineModuleInfo's
420c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// usesVAFloatArgument flag if so. This flag is used to emit an undefined
421c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// reference to _fltused on Windows, which will link in MSVCRT's
422c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer/// floating-point support.
423c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencervoid llvm::ComputeUsesVAFloatArgument(const CallInst &I,
424c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer                                      MachineModuleInfo *MMI)
425c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer{
426c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer  FunctionType *FT = cast<FunctionType>(
427c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer    I.getCalledValue()->getType()->getContainedType(0));
428c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer  if (FT->isVarArg() && !MMI->usesVAFloatArgument()) {
429c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer    for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) {
430c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer      Type* T = I.getArgOperand(i)->getType();
431c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer      for (po_iterator<Type*> i = po_begin(T), e = po_end(T);
432c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer           i != e; ++i) {
433c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer        if (i->isFloatingPointTy()) {
434c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer          MMI->setUsesVAFloatArgument(true);
435c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer          return;
436c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer        }
437c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer      }
438c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer    }
439c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer  }
440c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer}
441c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer
44266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// AddCatchInfo - Extract the personality and type infos from an eh.selector
44366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// call, and add them to the specified machine basic block.
4442520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI,
44566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman                        MachineBasicBlock *MBB) {
44666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // Inform the MachineModuleInfo of the personality for this landing pad.
4471518444f0c0f7675a30f34bcf58e8cef21d37c80Gabor Greif  const ConstantExpr *CE = cast<ConstantExpr>(I.getArgOperand(1));
44866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  assert(CE->getOpcode() == Instruction::BitCast &&
44966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman         isa<Function>(CE->getOperand(0)) &&
45066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman         "Personality should be a function");
45166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  MMI->addPersonality(MBB, cast<Function>(CE->getOperand(0)));
45266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
45366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // Gather all the type infos for this landing pad and pass them along to
45466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  // MachineModuleInfo.
45546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  std::vector<const GlobalVariable *> TyInfo;
456e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  unsigned N = I.getNumArgOperands();
45766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
458e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  for (unsigned i = N - 1; i > 1; --i) {
459e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    if (const ConstantInt *CI = dyn_cast<ConstantInt>(I.getArgOperand(i))) {
46066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FilterLength = CI->getZExtValue();
46166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      unsigned FirstCatch = i + FilterLength + !FilterLength;
462e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif      assert(FirstCatch <= N && "Invalid filter length");
46366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
46466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      if (FirstCatch < N) {
46566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.reserve(N - FirstCatch);
46666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        for (unsigned j = FirstCatch; j < N; ++j)
467e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif          TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j)));
46866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addCatchTypeInfo(MBB, TyInfo);
46966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.clear();
47066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      }
47166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
47266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      if (!FilterLength) {
47366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        // Cleanup.
47466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addCleanup(MBB);
47566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      } else {
47666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        // Filter.
47766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.reserve(FilterLength - 1);
47866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        for (unsigned j = i + 1; j < FirstCatch; ++j)
479e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif          TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j)));
48066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        MMI->addFilterTypeInfo(MBB, TyInfo);
48166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman        TyInfo.clear();
48266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      }
48366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
48466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman      N = i;
48566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman    }
48666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  }
48766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
488e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif  if (N > 2) {
489e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    TyInfo.reserve(N - 2);
490e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif    for (unsigned j = 2; j < N; ++j)
491e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif      TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j)));
49266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman    MMI->addCatchTypeInfo(MBB, TyInfo);
49366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman  }
49466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman}
49566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman
4962ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling/// AddLandingPadInfo - Extract the exception handling information from the
4972ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling/// landingpad instruction and add them to the specified machine module info.
4982ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendlingvoid llvm::AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
4992ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling                             MachineBasicBlock *MBB) {
5002ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  MMI.addPersonality(MBB,
5012ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling                     cast<Function>(I.getPersonalityFn()->stripPointerCasts()));
5022ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling
5032ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  if (I.isCleanup())
5042ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    MMI.addCleanup(MBB);
5052ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling
5062ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  // FIXME: New EH - Add the clauses in reverse order. This isn't 100% correct,
5072ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  //        but we need to do it this way because of how the DWARF EH emitter
5082ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  //        processes the clauses.
5092ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  for (unsigned i = I.getNumClauses(); i != 0; --i) {
5102ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    Value *Val = I.getClause(i - 1);
5112ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    if (I.isCatch(i - 1)) {
5122ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      MMI.addCatchTypeInfo(MBB,
5132ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling                           dyn_cast<GlobalVariable>(Val->stripPointerCasts()));
5142ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    } else {
5152ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      // Add filters in a list.
5162ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      Constant *CVal = cast<Constant>(Val);
5172ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      SmallVector<const GlobalVariable*, 4> FilterList;
5182ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      for (User::op_iterator
5192ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling             II = CVal->op_begin(), IE = CVal->op_end(); II != IE; ++II)
5202ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling        FilterList.push_back(cast<GlobalVariable>((*II)->stripPointerCasts()));
5212ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling
5222ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling      MMI.addFilterTypeInfo(MBB, FilterList);
5232ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling    }
5242ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling  }
5252ac0e6be05d53323d305155fcf53d50c87d6a9b2Bill Wendling}
526