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