FunctionLoweringInfo.cpp revision 551754c4958086cc6910da7c950f2875e212f5cf
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" 34551754c4958086cc6910da7c950f2875e212f5cfEric Christopher#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/Debug.h" 396277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/ErrorHandling.h" 406277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/MathExtras.h" 416277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include "llvm/Support/raw_ostream.h" 426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#include <algorithm> 436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanusing namespace llvm; 446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// ComputeLinearIndex - Given an LLVM IR aggregate type and a sequence 466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// of insertvalue or extractvalue indices that identify a member, return 476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the linearized index of the start of the member. 486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 496277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned llvm::ComputeLinearIndex(const TargetLowering &TLI, const Type *Ty, 506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const unsigned *Indices, 516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const unsigned *IndicesEnd, 526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned CurIndex) { 536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Base case: We're done. 546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Indices && Indices == IndicesEnd) 556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex; 566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given a struct type, recursively traverse the elements. 586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (const StructType *STy = dyn_cast<StructType>(Ty)) { 596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (StructType::element_iterator EB = STy->element_begin(), 606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI = EB, 616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EE = STy->element_end(); 626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI != EE; ++EI) { 636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Indices && *Indices == unsigned(EI - EB)) 646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return ComputeLinearIndex(TLI, *EI, Indices+1, IndicesEnd, CurIndex); 656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CurIndex = ComputeLinearIndex(TLI, *EI, 0, 0, CurIndex); 666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex; 686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given an array type, recursively traverse the elements. 706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { 716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const Type *EltTy = ATy->getElementType(); 726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) { 736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Indices && *Indices == i) 746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return ComputeLinearIndex(TLI, EltTy, Indices+1, IndicesEnd, CurIndex); 756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CurIndex = ComputeLinearIndex(TLI, EltTy, 0, 0, CurIndex); 766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex; 786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // We haven't found the type we're looking for, so keep searching. 806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return CurIndex + 1; 816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// ComputeValueVTs - Given an LLVM IR type, compute a sequence of 846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// EVTs that represent all the individual underlying 856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// non-aggregate types that comprise it. 866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// If Offsets is non-null, it points to a vector to be filled in 886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// with the in-memory offsets of each of the individual values. 896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid llvm::ComputeValueVTs(const TargetLowering &TLI, const Type *Ty, 916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVectorImpl<EVT> &ValueVTs, 926277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVectorImpl<uint64_t> *Offsets, 936277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman uint64_t StartingOffset) { 946277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given a struct type, recursively traverse the elements. 956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (const StructType *STy = dyn_cast<StructType>(Ty)) { 966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const StructLayout *SL = TLI.getTargetData()->getStructLayout(STy); 976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (StructType::element_iterator EB = STy->element_begin(), 986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI = EB, 996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EE = STy->element_end(); 1006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EI != EE; ++EI) 1016277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, *EI, ValueVTs, Offsets, 1026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StartingOffset + SL->getElementOffset(EI - EB)); 1036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return; 1046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Given an array type, recursively traverse the elements. 1066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { 1076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const Type *EltTy = ATy->getElementType(); 1086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman uint64_t EltSize = TLI.getTargetData()->getTypeAllocSize(EltTy); 1096277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) 1106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, EltTy, ValueVTs, Offsets, 1116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StartingOffset + i * EltSize); 1126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return; 1136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1146277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Interpret void as zero return values. 115f012705c7e4ca8cf90b6b734ce1d5355daca5ba5Benjamin Kramer if (Ty->isVoidTy()) 1166277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return; 1176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Base case: we can get an EVT for this LLVM IR type. 1186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ValueVTs.push_back(TLI.getValueType(Ty)); 1196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (Offsets) 1206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman Offsets->push_back(StartingOffset); 1216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by 1246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// PHI nodes or outside of the basic block that defines it, or used by a 1256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// switch or atomic instruction, which may expand to multiple basic blocks. 126ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isUsedOutsideOfDefiningBlock(const Instruction *I) { 1276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (isa<PHINode>(I)) return true; 128ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman const BasicBlock *BB = I->getParent(); 129ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (Value::const_use_iterator UI = I->use_begin(), E = I->use_end(); 130ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman 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. 139ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanstatic bool isOnlyUsedInEntryBlock(const 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 147ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman const BasicBlock *Entry = A->getParent()->begin(); 148ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (Value::const_use_iterator UI = A->use_begin(), E = A->use_end(); 149ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman UI != E; ++UI) 1506277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (cast<Instruction>(*UI)->getParent() != Entry || isa<SwitchInst>(*UI)) 1516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return false; // Use not in entry block. 1526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return true; 1536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan GohmanFunctionLoweringInfo::FunctionLoweringInfo(TargetLowering &tli) 1566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman : TLI(tli) { 1576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 1586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 159ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohmanvoid FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf, 1606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman bool EnableFastISel) { 1616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman Fn = &fn; 1626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF = &mf; 1636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman RegInfo = &MF->getRegInfo(); 1646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create a vreg for each argument register that is not dead and is used 1666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // outside of the entry block for the function. 167ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (Function::const_arg_iterator AI = Fn->arg_begin(), E = Fn->arg_end(); 1686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman AI != E; ++AI) 1696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!isOnlyUsedInEntryBlock(AI, EnableFastISel)) 1706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman InitializeRegForValue(AI); 1716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Initialize the mapping of values to registers. This is only set up for 1736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // instruction values that are used outside of the block that defines 1746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // them. 175ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman Function::const_iterator BB = Fn->begin(), EB = Fn->end(); 176ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) 177ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman if (const AllocaInst *AI = dyn_cast<AllocaInst>(I)) 178ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman if (const ConstantInt *CUI = dyn_cast<ConstantInt>(AI->getArraySize())) { 1796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const Type *Ty = AI->getAllocatedType(); 1806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman uint64_t TySize = TLI.getTargetData()->getTypeAllocSize(Ty); 1816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned Align = 1826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman std::max((unsigned)TLI.getTargetData()->getPrefTypeAlignment(Ty), 1836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman AI->getAlignment()); 1846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman TySize *= CUI->getZExtValue(); // Get total allocated size. 1866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects. 1876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StaticAllocaMap[AI] = 1886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF->getFrameInfo()->CreateStackObject(TySize, Align, false); 1896277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 1906277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1916277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (; BB != EB; ++BB) 192ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) 1936277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!I->use_empty() && isUsedOutsideOfDefiningBlock(I)) 1946277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!isa<AllocaInst>(I) || 1956277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman !StaticAllocaMap.count(cast<AllocaInst>(I))) 1966277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman InitializeRegForValue(I); 1976277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 1986277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create an initial MachineBasicBlock for each LLVM BasicBlock in F. This 1996277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // also creates the initial PHI MachineInstrs, though none of the input 2006277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // operands are populated. 201d0d8275cb264b17bed836ccd35c923476a236426Dan Gohman for (BB = Fn->begin(); BB != EB; ++BB) { 2026277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB); 2036277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBBMap[BB] = MBB; 2046277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MF->push_back(MBB); 2056277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2066277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Transfer the address-taken flag. This is necessary because there could 2076277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only 2086277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // the first one should be marked. 2096277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (BB->hasAddressTaken()) 2106277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBB->setHasAddressTaken(); 2116277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2126277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // Create Machine PHI nodes for LLVM PHI nodes, lowering them as 2136277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman // appropriate. 214ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman const PHINode *PN; 2156277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman DebugLoc DL; 216ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman for (BasicBlock::const_iterator 2176277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman I = BB->begin(), E = BB->end(); I != E; ++I) { 2186277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2196277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman PN = dyn_cast<PHINode>(I); 2206277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!PN || PN->use_empty()) continue; 2216277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2226277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned PHIReg = ValueMap[PN]; 2236277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman assert(PHIReg && "PHI node does not have an assigned virtual register!"); 2246277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2256277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVector<EVT, 4> ValueVTs; 2266277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, PN->getType(), ValueVTs); 2276277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) { 2286277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT VT = ValueVTs[vti]; 2296277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned NumRegisters = TLI.getNumRegisters(Fn->getContext(), VT); 2306277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman const TargetInstrInfo *TII = MF->getTarget().getInstrInfo(); 2316277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0; i != NumRegisters; ++i) 232518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner BuildMI(MBB, DL, TII->get(TargetOpcode::PHI), PHIReg + i); 2336277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman PHIReg += NumRegisters; 2346277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2356277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2366277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 237de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman 238de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman // Mark landing pad blocks. 239de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman for (BB = Fn->begin(); BB != EB; ++BB) 240ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman if (const InvokeInst *Invoke = dyn_cast<InvokeInst>(BB->getTerminator())) 241de4c0a7da7cfa1693ad9e6e09969003b610af08aDan Gohman MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad(); 2426277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 2436277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2446277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// clear - Clear out all the function-specific state. This returns this 2456277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// FunctionLoweringInfo to an empty state, ready to be used for a 2466277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// different function. 2476277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanvoid FunctionLoweringInfo::clear() { 2480e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman assert(CatchInfoFound.size() == CatchInfoLost.size() && 2490e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman "Not all catch info was assigned to a landing pad!"); 2500e026729aef35523e4f8d6124a569dceb4286bbbDan Gohman 2516277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman MBBMap.clear(); 2526277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ValueMap.clear(); 2536277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman StaticAllocaMap.clear(); 2546277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#ifndef NDEBUG 2556277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CatchInfoLost.clear(); 2566277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman CatchInfoFound.clear(); 2576277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman#endif 2586277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman LiveOutRegInfo.clear(); 2596277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 2606277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2616277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned FunctionLoweringInfo::MakeReg(EVT VT) { 2626277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return RegInfo->createVirtualRegister(TLI.getRegClassFor(VT)); 2636277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 2646277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2656277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// CreateRegForValue - Allocate the appropriate number of virtual registers of 2666277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// the correctly promoted or expanded types. Assign these registers 2676277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// consecutive vreg numbers and return the first assigned number. 2686277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 2696277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// In the case that the given value has struct or array type, this function 2706277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// will assign registers for each member or element. 2716277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman/// 2726277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanunsigned FunctionLoweringInfo::CreateRegForValue(const Value *V) { 2736277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman SmallVector<EVT, 4> ValueVTs; 2746277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman ComputeValueVTs(TLI, V->getType(), ValueVTs); 2756277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2766277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned FirstReg = 0; 2776277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) { 2786277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT ValueVT = ValueVTs[Value]; 2796277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman EVT RegisterVT = TLI.getRegisterType(V->getContext(), ValueVT); 2806277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman 2816277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned NumRegs = TLI.getNumRegisters(V->getContext(), ValueVT); 2826277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman for (unsigned i = 0; i != NumRegs; ++i) { 2836277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman unsigned R = MakeReg(RegisterVT); 2846277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman if (!FirstReg) FirstReg = R; 2856277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2866277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman } 2876277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman return FirstReg; 2886277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohman} 28966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 29066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V. 29166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan GohmanGlobalVariable *llvm::ExtractTypeInfo(Value *V) { 29266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman V = V->stripPointerCasts(); 29366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman GlobalVariable *GV = dyn_cast<GlobalVariable>(V); 294e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling 295e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling if (GV && GV->getName() == ".llvm.eh.catch.all.value") { 296e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling assert(GV->hasInitializer() && 297e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling "The EH catch-all value must have an initializer"); 298e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling Value *Init = GV->getInitializer(); 299e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling GV = dyn_cast<GlobalVariable>(Init); 300e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling if (!GV) V = cast<ConstantPointerNull>(Init); 301e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling } 302e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling 303e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling assert((GV || isa<ConstantPointerNull>(V)) && 304e6b293b78d8eb3eb749771d2201ace3ecd076010Bill Wendling "TypeInfo must be a global variable or NULL"); 30566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman return GV; 30666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman} 30766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 30866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// AddCatchInfo - Extract the personality and type infos from an eh.selector 30966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman/// call, and add them to the specified machine basic block. 3102520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::AddCatchInfo(const CallInst &I, MachineModuleInfo *MMI, 31166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MachineBasicBlock *MBB) { 31266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Inform the MachineModuleInfo of the personality for this landing pad. 313551754c4958086cc6910da7c950f2875e212f5cfEric Christopher const ConstantExpr *CE = cast<ConstantExpr>(I.getOperand(2)); 31466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman assert(CE->getOpcode() == Instruction::BitCast && 31566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman isa<Function>(CE->getOperand(0)) && 31666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman "Personality should be a function"); 31766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addPersonality(MBB, cast<Function>(CE->getOperand(0))); 31866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 31966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Gather all the type infos for this landing pad and pass them along to 32066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // MachineModuleInfo. 32146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman std::vector<const GlobalVariable *> TyInfo; 322551754c4958086cc6910da7c950f2875e212f5cfEric Christopher unsigned N = I.getNumOperands(); 32366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 324551754c4958086cc6910da7c950f2875e212f5cfEric Christopher for (unsigned i = N - 1; i > 2; --i) { 3252520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman if (const ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(i))) { 32666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman unsigned FilterLength = CI->getZExtValue(); 32766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman unsigned FirstCatch = i + FilterLength + !FilterLength; 32866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman assert (FirstCatch <= N && "Invalid filter length"); 32966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 33066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (FirstCatch < N) { 33166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.reserve(N - FirstCatch); 33266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned j = FirstCatch; j < N; ++j) 33366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.push_back(ExtractTypeInfo(I.getOperand(j))); 33466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCatchTypeInfo(MBB, TyInfo); 33566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.clear(); 33666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 33766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 33866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman if (!FilterLength) { 33966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Cleanup. 34066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCleanup(MBB); 34166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } else { 34266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman // Filter. 34366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.reserve(FilterLength - 1); 34466336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman for (unsigned j = i + 1; j < FirstCatch; ++j) 34566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.push_back(ExtractTypeInfo(I.getOperand(j))); 34666336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addFilterTypeInfo(MBB, TyInfo); 34766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.clear(); 34866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 34966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 35066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman N = i; 35166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 35266336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 35366336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 354551754c4958086cc6910da7c950f2875e212f5cfEric Christopher if (N > 3) { 355551754c4958086cc6910da7c950f2875e212f5cfEric Christopher TyInfo.reserve(N - 3); 356551754c4958086cc6910da7c950f2875e212f5cfEric Christopher for (unsigned j = 3; j < N; ++j) 35766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman TyInfo.push_back(ExtractTypeInfo(I.getOperand(j))); 35866336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman MMI->addCatchTypeInfo(MBB, TyInfo); 35966336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman } 36066336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman} 36166336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman 3622520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohmanvoid llvm::CopyCatchInfo(const BasicBlock *SrcBB, const BasicBlock *DestBB, 3635fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) { 3642520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman for (BasicBlock::const_iterator I = SrcBB->begin(), E = --SrcBB->end(); 3652520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman I != E; ++I) 3662520864773dcb73d76d297605f4bc41c0cf3fa39Dan Gohman if (const EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) { 3675fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman // Apply the catch info to DestBB. 3685fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman AddCatchInfo(*EHSel, MMI, FLI.MBBMap[DestBB]); 3695fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#ifndef NDEBUG 3705fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman if (!FLI.MBBMap[SrcBB]->isLandingPad()) 3715fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman FLI.CatchInfoFound.insert(EHSel); 3725fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman#endif 3735fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman } 3745fca8b1c8dc0b9efb0a9822222a6505d1eea6bddDan Gohman} 375fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman 376fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// hasInlineAsmMemConstraint - Return true if the inline asm instruction being 377fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// processed uses a memory 'm' constraint. 378fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohmanbool 379fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohmanllvm::hasInlineAsmMemConstraint(std::vector<InlineAsm::ConstraintInfo> &CInfos, 380fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman const TargetLowering &TLI) { 381fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman for (unsigned i = 0, e = CInfos.size(); i != e; ++i) { 382fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman InlineAsm::ConstraintInfo &CI = CInfos[i]; 383fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman for (unsigned j = 0, ee = CI.Codes.size(); j != ee; ++j) { 384fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman TargetLowering::ConstraintType CType = TLI.getConstraintType(CI.Codes[j]); 385fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman if (CType == TargetLowering::C_Memory) 386fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman return true; 387fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman } 388fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman 389fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman // Indirect operand accesses access memory. 390fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman if (CI.isIndirect) 391fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman return true; 392fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman } 393fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman 394fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman return false; 395fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman} 396fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman 397fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// getFCmpCondCode - Return the ISD condition code corresponding to 398fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// the given LLVM IR floating-point condition code. This includes 399fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// consideration of global floating-point math flags. 400fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// 401fe85e764736f4d87104f3d1508c173f566c8c461Dan GohmanISD::CondCode llvm::getFCmpCondCode(FCmpInst::Predicate Pred) { 402fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman ISD::CondCode FPC, FOC; 403fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman switch (Pred) { 404fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_FALSE: FOC = FPC = ISD::SETFALSE; break; 405fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_OEQ: FOC = ISD::SETEQ; FPC = ISD::SETOEQ; break; 406fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_OGT: FOC = ISD::SETGT; FPC = ISD::SETOGT; break; 407fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_OGE: FOC = ISD::SETGE; FPC = ISD::SETOGE; break; 408fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_OLT: FOC = ISD::SETLT; FPC = ISD::SETOLT; break; 409fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_OLE: FOC = ISD::SETLE; FPC = ISD::SETOLE; break; 410fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_ONE: FOC = ISD::SETNE; FPC = ISD::SETONE; break; 411fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_ORD: FOC = FPC = ISD::SETO; break; 412fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_UNO: FOC = FPC = ISD::SETUO; break; 413fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_UEQ: FOC = ISD::SETEQ; FPC = ISD::SETUEQ; break; 414fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_UGT: FOC = ISD::SETGT; FPC = ISD::SETUGT; break; 415fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_UGE: FOC = ISD::SETGE; FPC = ISD::SETUGE; break; 416fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_ULT: FOC = ISD::SETLT; FPC = ISD::SETULT; break; 417fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_ULE: FOC = ISD::SETLE; FPC = ISD::SETULE; break; 418fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_UNE: FOC = ISD::SETNE; FPC = ISD::SETUNE; break; 419fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case FCmpInst::FCMP_TRUE: FOC = FPC = ISD::SETTRUE; break; 420fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman default: 421fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman llvm_unreachable("Invalid FCmp predicate opcode!"); 422fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman FOC = FPC = ISD::SETFALSE; 423fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman break; 424fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman } 425fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman if (FiniteOnlyFPMath()) 426fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman return FOC; 427fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman else 428fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman return FPC; 429fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman} 430fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman 431fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// getICmpCondCode - Return the ISD condition code corresponding to 432fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// the given LLVM IR integer condition code. 433fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman/// 434fe85e764736f4d87104f3d1508c173f566c8c461Dan GohmanISD::CondCode llvm::getICmpCondCode(ICmpInst::Predicate Pred) { 435fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman switch (Pred) { 436fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_EQ: return ISD::SETEQ; 437fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_NE: return ISD::SETNE; 438fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_SLE: return ISD::SETLE; 439fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_ULE: return ISD::SETULE; 440fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_SGE: return ISD::SETGE; 441fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_UGE: return ISD::SETUGE; 442fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_SLT: return ISD::SETLT; 443fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_ULT: return ISD::SETULT; 444fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_SGT: return ISD::SETGT; 445fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman case ICmpInst::ICMP_UGT: return ISD::SETUGT; 446fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman default: 447fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman llvm_unreachable("Invalid ICmp predicate opcode!"); 448fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman return ISD::SETNE; 449fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman } 450fe85e764736f4d87104f3d1508c173f566c8c461Dan Gohman} 451