FunctionLoweringInfo.cpp revision f012705c7e4ca8cf90b6b734ce1d5355daca5ba5
16277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===-- FunctionLoweringInfo.cpp ------------------------------------------===// 26277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 36277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// The LLVM Compiler Infrastructure 46277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 56277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// This file is distributed under the University of Illinois Open Source 66277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// License. See LICENSE.TXT for details. 76277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 86277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===----------------------------------------------------------------------===// 96277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// This implements routines for translating functions from LLVM IR into 116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// Machine IR. 126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===----------------------------------------------------------------------===// 146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#define DEBUG_TYPE "function-lowering-info" 166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "FunctionLoweringInfo.h" 176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CallingConv.h" 186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/DerivedTypes.h" 196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Function.h" 206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Instructions.h" 215fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#include "llvm/IntrinsicInst.h" 226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/LLVMContext.h" 236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Module.h" 246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineFunction.h" 256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineFrameInfo.h" 266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineInstrBuilder.h" 276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineModuleInfo.h" 286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h" 296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Analysis/DebugInfo.h" 306277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetRegisterInfo.h" 316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetData.h" 326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetFrameInfo.h" 336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetInstrInfo.h" 346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetIntrinsicInfo.h" 356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetLowering.h" 366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetOptions.h" 376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/Compiler.h" 386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/CommandLine.h" 396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/Debug.h" 406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/ErrorHandling.h" 416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/MathExtras.h" 426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/raw_ostream.h" 436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include <algorithm> 446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanusing namespace llvm; 456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// ComputeLinearIndex - Given an LLVM IR aggregate type and a sequence 476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// of insertvalue or extractvalue indices that identify a member, return 486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the linearized index of the start of the member. 496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned llvm::ComputeLinearIndex(const TargetLowering &TLI, const Type *Ty, 516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const unsigned *Indices, 526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const unsigned *IndicesEnd, 536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned CurIndex) { 546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Base case: We're done. 556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Indices && Indices == IndicesEnd) 566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex; 576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given a struct type, recursively traverse the elements. 596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (const StructType *STy = dyn_cast<StructType>(Ty)) { 606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (StructType::element_iterator EB = STy->element_begin(), 616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI = EB, 626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EE = STy->element_end(); 636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI != EE; ++EI) { 646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Indices && *Indices == unsigned(EI - EB)) 656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return ComputeLinearIndex(TLI, *EI, Indices+1, IndicesEnd, CurIndex); 666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CurIndex = ComputeLinearIndex(TLI, *EI, 0, 0, CurIndex); 676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex; 696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given an array type, recursively traverse the elements. 716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { 726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const Type *EltTy = ATy->getElementType(); 736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) { 746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Indices && *Indices == i) 756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return ComputeLinearIndex(TLI, EltTy, Indices+1, IndicesEnd, CurIndex); 766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CurIndex = ComputeLinearIndex(TLI, EltTy, 0, 0, CurIndex); 776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex; 796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // We haven't found the type we're looking for, so keep searching. 816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex + 1; 826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// ComputeValueVTs - Given an LLVM IR type, compute a sequence of 856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// EVTs that represent all the individual underlying 866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// non-aggregate types that comprise it. 876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// If Offsets is non-null, it points to a vector to be filled in 896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// with the in-memory offsets of each of the individual values. 906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid llvm::ComputeValueVTs(const TargetLowering &TLI, const Type *Ty, 926277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVectorImpl<EVT> &ValueVTs, 936277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVectorImpl<uint64_t> *Offsets, 946277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman uint64_t StartingOffset) { 956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given a struct type, recursively traverse the elements. 966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (const StructType *STy = dyn_cast<StructType>(Ty)) { 976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const StructLayout *SL = TLI.getTargetData()->getStructLayout(STy); 986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (StructType::element_iterator EB = STy->element_begin(), 996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI = EB, 1006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EE = STy->element_end(); 1016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI != EE; ++EI) 1026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, *EI, ValueVTs, Offsets, 1036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StartingOffset + SL->getElementOffset(EI - EB)); 1046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return; 1056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given an array type, recursively traverse the elements. 1076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { 1086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const Type *EltTy = ATy->getElementType(); 1096277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman uint64_t EltSize = TLI.getTargetData()->getTypeAllocSize(EltTy); 1106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) 1116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, EltTy, ValueVTs, Offsets, 1126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StartingOffset + i * EltSize); 1136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return; 1146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Interpret void as zero return values. 116f012705c7e4ca8cf90b6b734ce1d5355daca5ba5Benjamin Kramer if (Ty->isVoidTy()) 1176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return; 1186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Base case: we can get an EVT for this LLVM IR type. 1196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ValueVTs.push_back(TLI.getValueType(Ty)); 1206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Offsets) 1216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman Offsets->push_back(StartingOffset); 1226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by 1256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// PHI nodes or outside of the basic block that defines it, or used by a 1266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// switch or atomic instruction, which may expand to multiple basic blocks. 1276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanstatic bool isUsedOutsideOfDefiningBlock(Instruction *I) { 1286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (isa<PHINode>(I)) return true; 1296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman BasicBlock *BB = I->getParent(); 1306277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI) 1316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (cast<Instruction>(*UI)->getParent() != BB || isa<PHINode>(*UI)) 1326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return true; 1336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return false; 1346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isOnlyUsedInEntryBlock - If the specified argument is only used in the 1376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// entry block, return true. This includes arguments used by switches, since 1386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the switch may expand into multiple basic blocks. 1396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanstatic bool isOnlyUsedInEntryBlock(Argument *A, bool EnableFastISel) { 1406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // With FastISel active, we may be splitting blocks, so force creation 1416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // of virtual registers for all non-dead arguments. 1426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Don't force virtual registers for byval arguments though, because 1436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // fast-isel can't handle those in all cases. 1446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (EnableFastISel && !A->hasByValAttr()) 1456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return A->use_empty(); 1466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman BasicBlock *Entry = A->getParent()->begin(); 1486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (Value::use_iterator UI = A->use_begin(), E = A->use_end(); UI != E; ++UI) 1496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (cast<Instruction>(*UI)->getParent() != Entry || isa<SwitchInst>(*UI)) 1506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return false; // Use not in entry block. 1516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return true; 1526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan GohmanFunctionLoweringInfo::FunctionLoweringInfo(TargetLowering &tli) 1556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman : TLI(tli) { 1566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::set(Function &fn, MachineFunction &mf, 1596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman bool EnableFastISel) { 1606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman Fn = &fn; 1616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF = &mf; 1626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman RegInfo = &MF->getRegInfo(); 1636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create a vreg for each argument register that is not dead and is used 1656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // outside of the entry block for the function. 1666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (Function::arg_iterator AI = Fn->arg_begin(), E = Fn->arg_end(); 1676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman AI != E; ++AI) 1686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!isOnlyUsedInEntryBlock(AI, EnableFastISel)) 1696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman InitializeRegForValue(AI); 1706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Initialize the mapping of values to registers. This is only set up for 1726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // instruction values that are used outside of the block that defines 1736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // them. 1746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman Function::iterator BB = Fn->begin(), EB = Fn->end(); 1756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) 1766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) 1776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) { 1786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const Type *Ty = AI->getAllocatedType(); 1796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman uint64_t TySize = TLI.getTargetData()->getTypeAllocSize(Ty); 1806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned Align = 1816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty), 1826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman AI->getAlignment()); 1836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman TySize *= CUI->getZExtValue(); // Get total allocated size. 1856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects. 1866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StaticAllocaMap[AI] = 1876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF->getFrameInfo()->CreateStackObject(TySize, Align, false); 1886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (; BB != EB; ++BB) 1916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) 1926277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!I->use_empty() && isUsedOutsideOfDefiningBlock(I)) 1936277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!isa<AllocaInst>(I) || 1946277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman !StaticAllocaMap.count(cast<AllocaInst>(I))) 1956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman InitializeRegForValue(I); 1966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create an initial MachineBasicBlock for each LLVM BasicBlock in F. This 1986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // also creates the initial PHI MachineInstrs, though none of the input 1996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // operands are populated. 2006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (BB = Fn->begin(), EB = Fn->end(); BB != EB; ++BB) { 2016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB); 2026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBBMap[BB] = MBB; 2036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF->push_back(MBB); 2046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Transfer the address-taken flag. This is necessary because there could 2066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only 2076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // the first one should be marked. 2086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (BB->hasAddressTaken()) 2096277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBB->setHasAddressTaken(); 2106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create Machine PHI nodes for LLVM PHI nodes, lowering them as 2126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // appropriate. 2136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman PHINode *PN; 2146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman DebugLoc DL; 2156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (BasicBlock::iterator 2166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman I = BB->begin(), E = BB->end(); I != E; ++I) { 2176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman PN = dyn_cast<PHINode>(I); 2196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!PN || PN->use_empty()) continue; 2206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned PHIReg = ValueMap[PN]; 2226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman assert(PHIReg && "PHI node does not have an assigned virtual register!"); 2236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVector<EVT, 4> ValueVTs; 2256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, PN->getType(), ValueVTs); 2266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) { 2276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT VT = ValueVTs[vti]; 2286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned NumRegisters = TLI.getNumRegisters(Fn->getContext(), VT); 2296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const TargetInstrInfo *TII = MF->getTarget().getInstrInfo(); 2306277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0; i != NumRegisters; ++i) 2316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman BuildMI(MBB, DL, TII->get(TargetInstrInfo::PHI), PHIReg + i); 2326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman PHIReg += NumRegisters; 2336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 2376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// clear - Clear out all the function-specific state. This returns this 2396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// FunctionLoweringInfo to an empty state, ready to be used for a 2406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// different function. 2416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::clear() { 2426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBBMap.clear(); 2436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ValueMap.clear(); 2446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StaticAllocaMap.clear(); 2456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#ifndef NDEBUG 2466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CatchInfoLost.clear(); 2476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CatchInfoFound.clear(); 2486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#endif 2496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman LiveOutRegInfo.clear(); 2506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 2516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned FunctionLoweringInfo::MakeReg(EVT VT) { 2536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return RegInfo->createVirtualRegister(TLI.getRegClassFor(VT)); 2546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 2556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// CreateRegForValue - Allocate the appropriate number of virtual registers of 2576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the correctly promoted or expanded types. Assign these registers 2586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// consecutive vreg numbers and return the first assigned number. 2596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 2606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// In the case that the given value has struct or array type, this function 2616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// will assign registers for each member or element. 2626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 2636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned FunctionLoweringInfo::CreateRegForValue(const Value *V) { 2646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVector<EVT, 4> ValueVTs; 2656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, V->getType(), ValueVTs); 2666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned FirstReg = 0; 2686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) { 2696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT ValueVT = ValueVTs[Value]; 2706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT RegisterVT = TLI.getRegisterType(V->getContext(), ValueVT); 2716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned NumRegs = TLI.getNumRegisters(V->getContext(), ValueVT); 2736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0; i != NumRegs; ++i) { 2746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned R = MakeReg(RegisterVT); 2756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!FirstReg) FirstReg = R; 2766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return FirstReg; 2796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 28066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 28166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V. 28266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan GohmanGlobalVariable *llvm::ExtractTypeInfo(Value *V) { 28366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman V = V->stripPointerCasts(); 28466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman GlobalVariable *GV = dyn_cast<GlobalVariable>(V); 28566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman assert ((GV || isa<ConstantPointerNull>(V)) && 28666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman "TypeInfo must be a global variable or NULL"); 28766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman return GV; 28866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman} 28966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 29066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// AddCatchInfo - Extract the personality and type infos from an eh.selector 29166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// call, and add them to the specified machine basic block. 29266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohmanvoid llvm::AddCatchInfo(CallInst &I, MachineModuleInfo *MMI, 29366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MachineBasicBlock *MBB) { 29466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Inform the MachineModuleInfo of the personality for this landing pad. 29566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman ConstantExpr *CE = cast<ConstantExpr>(I.getOperand(2)); 29666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman assert(CE->getOpcode() == Instruction::BitCast && 29766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman isa<Function>(CE->getOperand(0)) && 29866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman "Personality should be a function"); 29966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addPersonality(MBB, cast<Function>(CE->getOperand(0))); 30066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 30166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Gather all the type infos for this landing pad and pass them along to 30266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // MachineModuleInfo. 30366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman std::vector<GlobalVariable *> TyInfo; 30466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman unsigned N = I.getNumOperands(); 30566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 30666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned i = N - 1; i > 2; --i) { 30766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(i))) { 30866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman unsigned FilterLength = CI->getZExtValue(); 30966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman unsigned FirstCatch = i + FilterLength + !FilterLength; 31066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman assert (FirstCatch <= N && "Invalid filter length"); 31166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 31266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (FirstCatch < N) { 31366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.reserve(N - FirstCatch); 31466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned j = FirstCatch; j < N; ++j) 31566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.push_back(ExtractTypeInfo(I.getOperand(j))); 31666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCatchTypeInfo(MBB, TyInfo); 31766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.clear(); 31866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 31966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 32066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (!FilterLength) { 32166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Cleanup. 32266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCleanup(MBB); 32366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } else { 32466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Filter. 32566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.reserve(FilterLength - 1); 32666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned j = i + 1; j < FirstCatch; ++j) 32766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.push_back(ExtractTypeInfo(I.getOperand(j))); 32866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addFilterTypeInfo(MBB, TyInfo); 32966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.clear(); 33066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 33166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 33266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman N = i; 33366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 33466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 33566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 33666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (N > 3) { 33766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.reserve(N - 3); 33866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned j = 3; j < N; ++j) 33966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.push_back(ExtractTypeInfo(I.getOperand(j))); 34066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCatchTypeInfo(MBB, TyInfo); 34166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 34266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman} 34366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 3445fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohmanvoid llvm::CopyCatchInfo(BasicBlock *SrcBB, BasicBlock *DestBB, 3455fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) { 3465fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman for (BasicBlock::iterator I = SrcBB->begin(), E = --SrcBB->end(); I != E; ++I) 3475fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman if (EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) { 3485fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman // Apply the catch info to DestBB. 3495fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman AddCatchInfo(*EHSel, MMI, FLI.MBBMap[DestBB]); 3505fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#ifndef NDEBUG 3515fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman if (!FLI.MBBMap[SrcBB]->isLandingPad()) 3525fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman FLI.CatchInfoFound.insert(EHSel); 3535fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#endif 3545fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman } 3555fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman} 356