FunctionLoweringInfo.cpp revision 4c3fd9f92f89810d659973d2666ab729758de64a
16277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===-- FunctionLoweringInfo.cpp ------------------------------------------===// 26277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 36277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// The LLVM Compiler Infrastructure 46277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 56277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// This file is distributed under the University of Illinois Open Source 66277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// License. See LICENSE.TXT for details. 76277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 86277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===----------------------------------------------------------------------===// 96277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// This implements routines for translating functions from LLVM IR into 116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// Machine IR. 126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman// 136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman//===----------------------------------------------------------------------===// 146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#define DEBUG_TYPE "function-lowering-info" 164c3fd9f92f89810d659973d2666ab729758de64aDan Gohman#include "llvm/CodeGen/FunctionLoweringInfo.h" 176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/DerivedTypes.h" 186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Function.h" 196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Instructions.h" 205fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#include "llvm/IntrinsicInst.h" 216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/LLVMContext.h" 226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Module.h" 235eb6d65a27fd77a0bf10bd49f5cccb9f1796d98bDan Gohman#include "llvm/CodeGen/Analysis.h" 246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineFunction.h" 256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineFrameInfo.h" 266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineInstrBuilder.h" 276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineModuleInfo.h" 286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h" 296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetRegisterInfo.h" 306277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetData.h" 316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetFrameInfo.h" 326277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetInstrInfo.h" 336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetLowering.h" 346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Target/TargetOptions.h" 356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/Debug.h" 366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/ErrorHandling.h" 376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/MathExtras.h" 386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include <algorithm> 396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanusing namespace llvm; 406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by 426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// PHI nodes or outside of the basic block that defines it, or used by a 436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// switch or atomic instruction, which may expand to multiple basic blocks. 44ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isUsedOutsideOfDefiningBlock(const Instruction *I) { 45d84e806dd4b03fa711ae2665ac1acef646f16c5cDan Gohman if (I->use_empty()) return false; 466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (isa<PHINode>(I)) return true; 47ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman const BasicBlock *BB = I->getParent(); 48ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (Value::const_use_iterator UI = I->use_begin(), E = I->use_end(); 49ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman UI != E; ++UI) 506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (cast<Instruction>(*UI)->getParent() != BB || isa<PHINode>(*UI)) 516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return true; 526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return false; 536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isOnlyUsedInEntryBlock - If the specified argument is only used in the 566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// entry block, return true. This includes arguments used by switches, since 576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the switch may expand into multiple basic blocks. 58ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isOnlyUsedInEntryBlock(const Argument *A, bool EnableFastISel) { 596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // With FastISel active, we may be splitting blocks, so force creation 606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // of virtual registers for all non-dead arguments. 61d725f04ff81db0e61baa153bf21ca2dd08838244Dan Gohman if (EnableFastISel) 626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return A->use_empty(); 636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 64ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman const BasicBlock *Entry = A->getParent()->begin(); 65ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (Value::const_use_iterator UI = A->use_begin(), E = A->use_end(); 66ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman UI != E; ++UI) 676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (cast<Instruction>(*UI)->getParent() != Entry || isa<SwitchInst>(*UI)) 686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return false; // Use not in entry block. 696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return true; 706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 72d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan GohmanFunctionLoweringInfo::FunctionLoweringInfo(const TargetLowering &tli) 736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman : TLI(tli) { 746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 767451d3e09d26115195280ba36f686a0a90815089Dan Gohmanvoid FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf) { 776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman Fn = &fn; 786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF = &mf; 796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman RegInfo = &MF->getRegInfo(); 806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create a vreg for each argument register that is not dead and is used 826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // outside of the entry block for the function. 83ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (Function::const_arg_iterator AI = Fn->arg_begin(), E = Fn->arg_end(); 846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman AI != E; ++AI) 856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!isOnlyUsedInEntryBlock(AI, EnableFastISel)) 866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman InitializeRegForValue(AI); 876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Initialize the mapping of values to registers. This is only set up for 896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // instruction values that are used outside of the block that defines 906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // them. 91ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman Function::const_iterator BB = Fn->begin(), EB = Fn->end(); 92ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) 93ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman if (const AllocaInst *AI = dyn_cast<AllocaInst>(I)) 94ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman if (const ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) { 956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const Type *Ty = AI->getAllocatedType(); 966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman uint64_t TySize = TLI.getTargetData()->getTypeAllocSize(Ty); 976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned Align = 986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty), 996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman AI->getAlignment()); 1006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman TySize *= CUI->getZExtValue(); // Get total allocated size. 1026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects. 1036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StaticAllocaMap[AI] = 1046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF->getFrameInfo()->CreateStackObject(TySize, Align, false); 1056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (; BB != EB; ++BB) 108ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) 109d84e806dd4b03fa711ae2665ac1acef646f16c5cDan Gohman if (isUsedOutsideOfDefiningBlock(I)) 1106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!isa<AllocaInst>(I) || 1116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman !StaticAllocaMap.count(cast<AllocaInst>(I))) 1126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman InitializeRegForValue(I); 1136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create an initial MachineBasicBlock for each LLVM BasicBlock in F. This 1156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // also creates the initial PHI MachineInstrs, though none of the input 1166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // operands are populated. 117d0d8275cb264b17bed836ccd35c923476a236426Dan Gohman for (BB = Fn->begin(); BB != EB; ++BB) { 1186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB); 1196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBBMap[BB] = MBB; 1206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF->push_back(MBB); 1216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Transfer the address-taken flag. This is necessary because there could 1236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only 1246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // the first one should be marked. 1256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (BB->hasAddressTaken()) 1266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBB->setHasAddressTaken(); 1276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create Machine PHI nodes for LLVM PHI nodes, lowering them as 1296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // appropriate. 1303f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman for (BasicBlock::const_iterator I = BB->begin(); 1313f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman const PHINode *PN = dyn_cast<PHINode>(I); ++I) { 1323f1403f14e45a862ff97c14d80a1daf28518722aDan Gohman if (PN->use_empty()) continue; 1336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 134c025c853522feef9e8350c52b9013e5bf178dec3Dan Gohman DebugLoc DL = PN->getDebugLoc(); 1356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned PHIReg = ValueMap[PN]; 1366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman assert(PHIReg && "PHI node does not have an assigned virtual register!"); 1376277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1386277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVector<EVT, 4> ValueVTs; 1396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, PN->getType(), ValueVTs); 1406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) { 1416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT VT = ValueVTs[vti]; 1426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned NumRegisters = TLI.getNumRegisters(Fn->getContext(), VT); 1436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const TargetInstrInfo *TII = MF->getTarget().getInstrInfo(); 1446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0; i != NumRegisters; ++i) 145518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner BuildMI(MBB, DL, TII->get(TargetOpcode::PHI), PHIReg + i); 1466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman PHIReg += NumRegisters; 1476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 150de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman 151de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman // Mark landing pad blocks. 152de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman for (BB = Fn->begin(); BB != EB; ++BB) 153ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman if (const InvokeInst *Invoke = dyn_cast<InvokeInst>(BB->getTerminator())) 154de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad(); 1556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// clear - Clear out all the function-specific state. This returns this 1586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// FunctionLoweringInfo to an empty state, ready to be used for a 1596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// different function. 1606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::clear() { 1610e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman assert(CatchInfoFound.size() == CatchInfoLost.size() && 1620e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman "Not all catch info was assigned to a landing pad!"); 1630e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman 1646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBBMap.clear(); 1656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ValueMap.clear(); 1666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StaticAllocaMap.clear(); 1676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#ifndef NDEBUG 1686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CatchInfoLost.clear(); 1696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CatchInfoFound.clear(); 1706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#endif 1716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman LiveOutRegInfo.clear(); 1722ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng ArgDbgValues.clear(); 1736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 17589496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateReg - Allocate a single virtual register for the given type. 17689496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohmanunsigned FunctionLoweringInfo::CreateReg(EVT VT) { 1776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return RegInfo->createVirtualRegister(TLI.getRegClassFor(VT)); 1786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 18089496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman/// CreateRegs - Allocate the appropriate number of virtual registers of 1816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the correctly promoted or expanded types. Assign these registers 1826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// consecutive vreg numbers and return the first assigned number. 1836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 1846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// In the case that the given value has struct or array type, this function 1856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// will assign registers for each member or element. 1866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 18789496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohmanunsigned FunctionLoweringInfo::CreateRegs(const Type *Ty) { 1886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVector<EVT, 4> ValueVTs; 189ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman ComputeValueVTs(TLI, Ty, ValueVTs); 1906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned FirstReg = 0; 1926277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) { 1936277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT ValueVT = ValueVTs[Value]; 194ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman EVT RegisterVT = TLI.getRegisterType(Ty->getContext(), ValueVT); 1956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 196ffda6bac113d4c079b534b1bfa7aea5498ee3e83Dan Gohman unsigned NumRegs = TLI.getNumRegisters(Ty->getContext(), ValueVT); 1976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0; i != NumRegs; ++i) { 19889496d0eb73ab8771b27b3d9c1db6492d8eefc3aDan Gohman unsigned R = CreateReg(RegisterVT); 1996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!FirstReg) FirstReg = R; 2006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return FirstReg; 2036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 20466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 20566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// AddCatchInfo - Extract the personality and type infos from an eh.selector 20666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// call, and add them to the specified machine basic block. 2072520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI, 20866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MachineBasicBlock *MBB) { 20966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Inform the MachineModuleInfo of the personality for this landing pad. 2101518444f0c0f7675a30f34bcf58e8cef21d37c80Gabor Greif const ConstantExpr *CE = cast<ConstantExpr>(I.getArgOperand(1)); 21166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman assert(CE->getOpcode() == Instruction::BitCast && 21266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman isa<Function>(CE->getOperand(0)) && 21366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman "Personality should be a function"); 21466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addPersonality(MBB, cast<Function>(CE->getOperand(0))); 21566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 21666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Gather all the type infos for this landing pad and pass them along to 21766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // MachineModuleInfo. 21846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman std::vector<const GlobalVariable *> TyInfo; 219e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif unsigned N = I.getNumArgOperands(); 22066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 221e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif for (unsigned i = N - 1; i > 1; --i) { 222e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif if (const ConstantInt *CI = dyn_cast<ConstantInt>(I.getArgOperand(i))) { 22366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman unsigned FilterLength = CI->getZExtValue(); 22466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman unsigned FirstCatch = i + FilterLength + !FilterLength; 225e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif assert(FirstCatch <= N && "Invalid filter length"); 22666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 22766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (FirstCatch < N) { 22866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.reserve(N - FirstCatch); 22966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned j = FirstCatch; j < N; ++j) 230e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j))); 23166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCatchTypeInfo(MBB, TyInfo); 23266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.clear(); 23366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 23466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 23566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (!FilterLength) { 23666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Cleanup. 23766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCleanup(MBB); 23866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } else { 23966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Filter. 24066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.reserve(FilterLength - 1); 24166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned j = i + 1; j < FirstCatch; ++j) 242e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j))); 24366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addFilterTypeInfo(MBB, TyInfo); 24466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.clear(); 24566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 24666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 24766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman N = i; 24866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 24966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 25066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 251e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif if (N > 2) { 252e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif TyInfo.reserve(N - 2); 253e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif for (unsigned j = 2; j < N; ++j) 254e767e6bbb78dae999040a6123d2314a7ed11a5c4Gabor Greif TyInfo.push_back(ExtractTypeInfo(I.getArgOperand(j))); 25566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCatchTypeInfo(MBB, TyInfo); 25666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 25766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman} 25866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 2592520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::CopyCatchInfo(const BasicBlock *SrcBB, const BasicBlock *DestBB, 2605fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) { 2612520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman for (BasicBlock::const_iterator I = SrcBB->begin(), E = --SrcBB->end(); 2622520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman I != E; ++I) 2632520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman if (const EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) { 2645fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman // Apply the catch info to DestBB. 2655fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman AddCatchInfo(*EHSel, MMI, FLI.MBBMap[DestBB]); 2665fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#ifndef NDEBUG 2675fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman if (!FLI.MBBMap[SrcBB]->isLandingPad()) 2685fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman FLI.CatchInfoFound.insert(EHSel); 2695fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#endif 2705fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman } 2715fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman} 272