| //===- CodeGen/Analysis.h - CodeGen LLVM IR Analysis Utilities --*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file declares several CodeGen-specific LLVM IR analysis utilties. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_CODEGEN_ANALYSIS_H | |
| #define LLVM_CODEGEN_ANALYSIS_H | |
| #include "llvm/Instructions.h" | |
| #include "llvm/InlineAsm.h" | |
| #include "llvm/ADT/ArrayRef.h" | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/CodeGen/ValueTypes.h" | |
| #include "llvm/CodeGen/ISDOpcodes.h" | |
| #include "llvm/Support/CallSite.h" | |
| namespace llvm { | |
| class GlobalVariable; | |
| class TargetLowering; | |
| class SDNode; | |
| class SelectionDAG; | |
| /// ComputeLinearIndex - Given an LLVM IR aggregate type and a sequence | |
| /// of insertvalue or extractvalue indices that identify a member, return | |
| /// the linearized index of the start of the member. | |
| /// | |
| unsigned ComputeLinearIndex(Type *Ty, | |
| const unsigned *Indices, | |
| const unsigned *IndicesEnd, | |
| unsigned CurIndex = 0); | |
| inline unsigned ComputeLinearIndex(Type *Ty, | |
| ArrayRef<unsigned> Indices, | |
| unsigned CurIndex = 0) { | |
| return ComputeLinearIndex(Ty, Indices.begin(), Indices.end(), CurIndex); | |
| } | |
| /// ComputeValueVTs - Given an LLVM IR type, compute a sequence of | |
| /// EVTs that represent all the individual underlying | |
| /// non-aggregate types that comprise it. | |
| /// | |
| /// If Offsets is non-null, it points to a vector to be filled in | |
| /// with the in-memory offsets of each of the individual values. | |
| /// | |
| void ComputeValueVTs(const TargetLowering &TLI, Type *Ty, | |
| SmallVectorImpl<EVT> &ValueVTs, | |
| SmallVectorImpl<uint64_t> *Offsets = 0, | |
| uint64_t StartingOffset = 0); | |
| /// ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V. | |
| GlobalVariable *ExtractTypeInfo(Value *V); | |
| /// hasInlineAsmMemConstraint - Return true if the inline asm instruction being | |
| /// processed uses a memory 'm' constraint. | |
| bool hasInlineAsmMemConstraint(InlineAsm::ConstraintInfoVector &CInfos, | |
| const TargetLowering &TLI); | |
| /// getFCmpCondCode - Return the ISD condition code corresponding to | |
| /// the given LLVM IR floating-point condition code. This includes | |
| /// consideration of global floating-point math flags. | |
| /// | |
| ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred); | |
| /// getICmpCondCode - Return the ISD condition code corresponding to | |
| /// the given LLVM IR integer condition code. | |
| /// | |
| ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred); | |
| /// Test if the given instruction is in a position to be optimized | |
| /// with a tail-call. This roughly means that it's in a block with | |
| /// a return and there's nothing that needs to be scheduled | |
| /// between it and the return. | |
| /// | |
| /// This function only tests target-independent requirements. | |
| bool isInTailCallPosition(ImmutableCallSite CS, Attributes CalleeRetAttr, | |
| const TargetLowering &TLI); | |
| bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node, | |
| const TargetLowering &TLI); | |
| } // End llvm namespace | |
| #endif |