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