Update llvm/clang to r240225.
This commit is contained in:
commit
353ba56951
@ -161,15 +161,15 @@ typedef enum {
|
||||
/* FIXME: These attributes are currently not included in the C API as
|
||||
a temporary measure until the API/ABI impact to the C API is understood
|
||||
and the path forward agreed upon.
|
||||
LLVMAddressSafety = 1ULL << 32,
|
||||
LLVMStackProtectStrongAttribute = 1ULL<<33,
|
||||
LLVMCold = 1ULL << 34,
|
||||
LLVMOptimizeNone = 1ULL << 35,
|
||||
LLVMInAllocaAttribute = 1ULL << 36,
|
||||
LLVMNonNullAttribute = 1ULL << 37,
|
||||
LLVMJumpTableAttribute = 1ULL << 38,
|
||||
LLVMDereferenceableAttribute = 1ULL << 39,
|
||||
LLVMDereferenceableOrNullAttribute = 1ULL << 40,
|
||||
LLVMSanitizeAddressAttribute = 1ULL << 32,
|
||||
LLVMStackProtectStrongAttribute = 1ULL<<35,
|
||||
LLVMColdAttribute = 1ULL << 40,
|
||||
LLVMOptimizeNoneAttribute = 1ULL << 42,
|
||||
LLVMInAllocaAttribute = 1ULL << 43,
|
||||
LLVMNonNullAttribute = 1ULL << 44,
|
||||
LLVMJumpTableAttribute = 1ULL << 45,
|
||||
LLVMConvergentAttribute = 1ULL << 46,
|
||||
LLVMSafeStackAttribute = 1ULL << 47,
|
||||
*/
|
||||
} LLVMAttribute;
|
||||
|
||||
@ -2661,8 +2661,7 @@ LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
|
||||
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
|
||||
const char *Name);
|
||||
LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
|
||||
LLVMValueRef PersFn, unsigned NumClauses,
|
||||
const char *Name);
|
||||
unsigned NumClauses, const char *Name);
|
||||
LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
|
||||
LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
|
||||
|
||||
|
@ -62,7 +62,8 @@ typedef enum {
|
||||
LTO_SYMBOL_SCOPE_HIDDEN = 0x00001000,
|
||||
LTO_SYMBOL_SCOPE_PROTECTED = 0x00002000,
|
||||
LTO_SYMBOL_SCOPE_DEFAULT = 0x00001800,
|
||||
LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800
|
||||
LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800,
|
||||
LTO_SYMBOL_COMDAT = 0x00004000
|
||||
} lto_symbol_attributes;
|
||||
|
||||
/**
|
||||
|
@ -129,7 +129,7 @@ class APInt {
|
||||
|
||||
/// \brief Clear unused high order bits
|
||||
///
|
||||
/// This method is used internally to clear the to "N" bits in the high order
|
||||
/// This method is used internally to clear the top "N" bits in the high order
|
||||
/// word that are not used by the APInt. This is needed after the most
|
||||
/// significant word is assigned a value to ensure that those bits are
|
||||
/// zero'd out.
|
||||
@ -795,7 +795,7 @@ class APInt {
|
||||
|
||||
/// \brief Bitwise OR function.
|
||||
///
|
||||
/// Performs a bitwise or on *this and RHS. This is implemented bny simply
|
||||
/// Performs a bitwise or on *this and RHS. This is implemented by simply
|
||||
/// calling operator|.
|
||||
///
|
||||
/// \returns An APInt value representing the bitwise OR of *this and RHS.
|
||||
@ -1896,11 +1896,11 @@ inline APInt Xor(const APInt &LHS, const APInt &RHS) { return LHS ^ RHS; }
|
||||
/// Performs a bitwise complement operation on APInt.
|
||||
inline APInt Not(const APInt &APIVal) { return ~APIVal; }
|
||||
|
||||
} // End of APIntOps namespace
|
||||
} // namespace APIntOps
|
||||
|
||||
// See friend declaration above. This additional declaration is required in
|
||||
// order to compile LLVM with IBM xlC compiler.
|
||||
hash_code hash_value(const APInt &Arg);
|
||||
} // End of llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -361,6 +361,6 @@ namespace llvm {
|
||||
template <typename T> struct isPodLike<ArrayRef<T> > {
|
||||
static const bool value = true;
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -568,7 +568,7 @@ class BitVector {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of BitVector swap.
|
||||
|
@ -42,7 +42,7 @@ struct DenseMapPair : public std::pair<KeyT, ValueT> {
|
||||
ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
|
||||
const ValueT &getSecond() const { return std::pair<KeyT, ValueT>::second; }
|
||||
};
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
template <
|
||||
typename KeyT, typename ValueT, typename KeyInfoT = DenseMapInfo<KeyT>,
|
||||
|
@ -32,7 +32,7 @@ template <typename KeyT> class DenseSetPair : public DenseSetEmpty {
|
||||
DenseSetEmpty &getSecond() { return *this; }
|
||||
const DenseSetEmpty &getSecond() const { return *this; }
|
||||
};
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
/// DenseSet - This implements a dense probed hash-table based set.
|
||||
template<typename ValueT, typename ValueInfoT = DenseMapInfo<ValueT> >
|
||||
|
@ -288,6 +288,6 @@ iterator_range<idf_ext_iterator<T, SetTy>> inverse_depth_first_ext(const T& G,
|
||||
return make_range(idf_ext_begin(G, S), idf_ext_end(G, S));
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -278,6 +278,6 @@ class EquivalenceClasses {
|
||||
};
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -101,6 +101,6 @@ struct GraphTraits<Inverse<Inverse<T> > > {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -53,6 +53,7 @@
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iterator>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
@ -80,6 +80,6 @@ template <typename T, typename ToIndexT = llvm::identity<unsigned> >
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -83,6 +83,6 @@ class IntEqClasses {
|
||||
void uncompress();
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -204,6 +204,6 @@ void operator>=(const Optional<T> &X, const Optional<U> &Y);
|
||||
template<typename T, typename U>
|
||||
void operator>(const Optional<T> &X, const Optional<U> &Y);
|
||||
|
||||
} // end llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -507,6 +507,6 @@ namespace llvm {
|
||||
RHS.template get<U>()));
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -295,6 +295,6 @@ class ReversePostOrderTraversal {
|
||||
rpo_iterator end() { return Blocks.rend(); }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -79,6 +79,6 @@ class PriorityQueue : public std::priority_queue<T, Sequence, Compare> {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -240,6 +240,6 @@ template <class T> scc_iterator<Inverse<T> > scc_end(const Inverse<T> &G) {
|
||||
return scc_iterator<Inverse<T> >::end(G);
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -417,6 +417,6 @@ template <typename T> struct deref {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -66,6 +66,6 @@ void set_subtract(S1Ty &S1, const S2Ty &S2) {
|
||||
S1.erase(*SI);
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -225,7 +225,7 @@ class SmallSetVector : public SetVector<T, SmallVector<T, N>, SmallSet<T, N> > {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
// vim: sw=2 ai
|
||||
#endif
|
||||
|
@ -588,7 +588,7 @@ operator^(const SmallBitVector &LHS, const SmallBitVector &RHS) {
|
||||
return Result;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of BitVector swap.
|
||||
|
@ -334,7 +334,7 @@ class SmallPtrSet : public SmallPtrSetImpl<PtrType> {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of SmallPtrSet swap.
|
||||
|
@ -292,6 +292,6 @@ class SmallString : public SmallVector<char, InternalLen> {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -924,7 +924,7 @@ static inline size_t capacity_in_bytes(const SmallVector<T, N> &X) {
|
||||
return X.capacity_in_bytes();
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of SmallVector swap.
|
||||
@ -940,6 +940,6 @@ namespace std {
|
||||
swap(llvm::SmallVector<T, N> &LHS, llvm::SmallVector<T, N> &RHS) {
|
||||
LHS.swap(RHS);
|
||||
}
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
|
@ -176,6 +176,6 @@ void PrintStatistics();
|
||||
/// \brief Print statistics to the given output stream.
|
||||
void PrintStatistics(raw_ostream &OS);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -207,6 +207,6 @@ inline std::string join(IteratorT Begin, IteratorT End, StringRef Separator) {
|
||||
return join_impl(Begin, End, Separator, tag());
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -447,6 +447,6 @@ class StringMapIterator : public StringMapConstIterator<ValueTy> {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -566,6 +566,6 @@ namespace llvm {
|
||||
// StringRefs can be treated like a POD type.
|
||||
template <typename T> struct isPodLike;
|
||||
template <> struct isPodLike<StringRef> { static const bool value = true; };
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -29,6 +29,6 @@ namespace llvm {
|
||||
return base::insert(std::make_pair(Key, '\0'));
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif // LLVM_ADT_STRINGSET_H
|
||||
|
@ -84,7 +84,8 @@ class Triple {
|
||||
spir, // SPIR: standard portable IR for OpenCL 32-bit version
|
||||
spir64, // SPIR: standard portable IR for OpenCL 64-bit version
|
||||
kalimba, // Kalimba: generic kalimba
|
||||
LastArchType = kalimba
|
||||
shave, // SHAVE: Movidius vector VLIW processors
|
||||
LastArchType = shave
|
||||
};
|
||||
enum SubArchType {
|
||||
NoSubArch,
|
||||
@ -608,7 +609,7 @@ class Triple {
|
||||
/// @}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -537,6 +537,6 @@ namespace llvm {
|
||||
}
|
||||
|
||||
/// @}
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -97,6 +97,6 @@ unsigned ComputeEditDistance(ArrayRef<T> FromArray, ArrayRef<T> ToArray,
|
||||
return Result;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -655,7 +655,7 @@ struct ilist : public iplist<NodeTy> {
|
||||
void resize(size_type newsize) { resize(newsize, NodeTy()); }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
// Ensure that swap uses the fast list swap...
|
||||
|
@ -101,6 +101,6 @@ class ilist_node : private ilist_half_node<NodeTy> {
|
||||
/// @}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -239,6 +239,6 @@ struct pointee_iterator
|
||||
T &operator*() const { return **this->I; }
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -51,6 +51,6 @@ template <class T> iterator_range<T> make_range(T x, T y) {
|
||||
template <typename T> iterator_range<T> make_range(std::pair<T, T> p) {
|
||||
return iterator_range<T>(std::move(p.first), std::move(p.second));
|
||||
}
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -16,11 +16,12 @@
|
||||
// which automatically provides functionality for the entire suite of client
|
||||
// APIs.
|
||||
//
|
||||
// This API identifies memory regions with the Location class. The pointer
|
||||
// This API identifies memory regions with the MemoryLocation class. The pointer
|
||||
// component specifies the base memory address of the region. The Size specifies
|
||||
// the maximum size (in address units) of the memory region, or UnknownSize if
|
||||
// the size is not known. The TBAA tag identifies the "type" of the memory
|
||||
// reference; see the TypeBasedAliasAnalysis class for details.
|
||||
// the maximum size (in address units) of the memory region, or
|
||||
// MemoryLocation::UnknownSize if the size is not known. The TBAA tag
|
||||
// identifies the "type" of the memory reference; see the
|
||||
// TypeBasedAliasAnalysis class for details.
|
||||
//
|
||||
// Some non-obvious details include:
|
||||
// - Pointers that point to two completely different objects in memory never
|
||||
@ -80,11 +81,6 @@ class AliasAnalysis {
|
||||
AliasAnalysis() : DL(nullptr), TLI(nullptr), AA(nullptr) {}
|
||||
virtual ~AliasAnalysis(); // We want to be subclassed
|
||||
|
||||
/// UnknownSize - This is a special value which can be used with the
|
||||
/// size arguments in alias queries to indicate that the caller does not
|
||||
/// know the sizes of the potential memory references.
|
||||
static uint64_t const UnknownSize = MemoryLocation::UnknownSize;
|
||||
|
||||
/// getTargetLibraryInfo - Return a pointer to the current TargetLibraryInfo
|
||||
/// object, or null if no TargetLibraryInfo object is available.
|
||||
///
|
||||
@ -99,10 +95,6 @@ class AliasAnalysis {
|
||||
/// Alias Queries...
|
||||
///
|
||||
|
||||
/// Legacy typedef for the AA location object. New code should use \c
|
||||
/// MemoryLocation directly.
|
||||
typedef MemoryLocation Location;
|
||||
|
||||
/// Alias analysis result - Either we know for sure that it does not alias, we
|
||||
/// know for sure it must alias, or we don't know anything: The two pointers
|
||||
/// _might_ alias. This enum is designed so you can do things like:
|
||||
@ -123,38 +115,40 @@ class AliasAnalysis {
|
||||
/// Returns an AliasResult indicating whether the two pointers are aliased to
|
||||
/// each other. This is the interface that must be implemented by specific
|
||||
/// alias analysis implementations.
|
||||
virtual AliasResult alias(const Location &LocA, const Location &LocB);
|
||||
virtual AliasResult alias(const MemoryLocation &LocA,
|
||||
const MemoryLocation &LocB);
|
||||
|
||||
/// alias - A convenience wrapper.
|
||||
AliasResult alias(const Value *V1, uint64_t V1Size,
|
||||
const Value *V2, uint64_t V2Size) {
|
||||
return alias(Location(V1, V1Size), Location(V2, V2Size));
|
||||
return alias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size));
|
||||
}
|
||||
|
||||
/// alias - A convenience wrapper.
|
||||
AliasResult alias(const Value *V1, const Value *V2) {
|
||||
return alias(V1, UnknownSize, V2, UnknownSize);
|
||||
return alias(V1, MemoryLocation::UnknownSize, V2,
|
||||
MemoryLocation::UnknownSize);
|
||||
}
|
||||
|
||||
/// isNoAlias - A trivial helper function to check to see if the specified
|
||||
/// pointers are no-alias.
|
||||
bool isNoAlias(const Location &LocA, const Location &LocB) {
|
||||
bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) {
|
||||
return alias(LocA, LocB) == NoAlias;
|
||||
}
|
||||
|
||||
/// isNoAlias - A convenience wrapper.
|
||||
bool isNoAlias(const Value *V1, uint64_t V1Size,
|
||||
const Value *V2, uint64_t V2Size) {
|
||||
return isNoAlias(Location(V1, V1Size), Location(V2, V2Size));
|
||||
return isNoAlias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size));
|
||||
}
|
||||
|
||||
/// isNoAlias - A convenience wrapper.
|
||||
bool isNoAlias(const Value *V1, const Value *V2) {
|
||||
return isNoAlias(Location(V1), Location(V2));
|
||||
return isNoAlias(MemoryLocation(V1), MemoryLocation(V2));
|
||||
}
|
||||
|
||||
/// isMustAlias - A convenience wrapper.
|
||||
bool isMustAlias(const Location &LocA, const Location &LocB) {
|
||||
bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) {
|
||||
return alias(LocA, LocB) == MustAlias;
|
||||
}
|
||||
|
||||
@ -167,12 +161,12 @@ class AliasAnalysis {
|
||||
/// known to be constant, return true. If OrLocal is true and the
|
||||
/// specified memory location is known to be "local" (derived from
|
||||
/// an alloca), return true. Otherwise return false.
|
||||
virtual bool pointsToConstantMemory(const Location &Loc,
|
||||
virtual bool pointsToConstantMemory(const MemoryLocation &Loc,
|
||||
bool OrLocal = false);
|
||||
|
||||
/// pointsToConstantMemory - A convenient wrapper.
|
||||
bool pointsToConstantMemory(const Value *P, bool OrLocal = false) {
|
||||
return pointsToConstantMemory(Location(P), OrLocal);
|
||||
return pointsToConstantMemory(MemoryLocation(P), OrLocal);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
@ -228,13 +222,12 @@ class AliasAnalysis {
|
||||
UnknownModRefBehavior = Anywhere | ModRef
|
||||
};
|
||||
|
||||
/// Get the location associated with a pointer argument of a callsite.
|
||||
/// The mask bits are set to indicate the allowed aliasing ModRef kinds.
|
||||
/// Note that these mask bits do not necessarily account for the overall
|
||||
/// behavior of the function, but rather only provide additional
|
||||
/// per-argument information.
|
||||
virtual Location getArgLocation(ImmutableCallSite CS, unsigned ArgIdx,
|
||||
ModRefResult &Mask);
|
||||
/// Get the ModRef info associated with a pointer argument of a callsite. The
|
||||
/// result's bits are set to indicate the allowed aliasing ModRef kinds. Note
|
||||
/// that these bits do not necessarily account for the overall behavior of
|
||||
/// the function, but rather only provide additional per-argument
|
||||
/// information.
|
||||
virtual ModRefResult getArgModRefInfo(ImmutableCallSite CS, unsigned ArgIdx);
|
||||
|
||||
/// getModRefBehavior - Return the behavior when calling the given call site.
|
||||
virtual ModRefBehavior getModRefBehavior(ImmutableCallSite CS);
|
||||
@ -324,14 +317,13 @@ class AliasAnalysis {
|
||||
return NoModRef;
|
||||
}
|
||||
|
||||
return getModRefInfo(I, Location());
|
||||
return getModRefInfo(I, MemoryLocation());
|
||||
}
|
||||
|
||||
/// getModRefInfo - Return information about whether or not an instruction may
|
||||
/// read or write the specified memory location. An instruction
|
||||
/// that doesn't read or write memory may be trivially LICM'd for example.
|
||||
ModRefResult getModRefInfo(const Instruction *I,
|
||||
const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const Instruction *I, const MemoryLocation &Loc) {
|
||||
switch (I->getOpcode()) {
|
||||
case Instruction::VAArg: return getModRefInfo((const VAArgInst*)I, Loc);
|
||||
case Instruction::Load: return getModRefInfo((const LoadInst*)I, Loc);
|
||||
@ -350,65 +342,64 @@ class AliasAnalysis {
|
||||
/// getModRefInfo - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const Instruction *I,
|
||||
const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(I, Location(P, Size));
|
||||
return getModRefInfo(I, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for call sites) - Return information about whether
|
||||
/// a particular call site modifies or reads the specified memory location.
|
||||
virtual ModRefResult getModRefInfo(ImmutableCallSite CS,
|
||||
const Location &Loc);
|
||||
const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for call sites) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(ImmutableCallSite CS,
|
||||
const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(CS, Location(P, Size));
|
||||
return getModRefInfo(CS, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for calls) - Return information about whether
|
||||
/// a particular call modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const CallInst *C, const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const CallInst *C, const MemoryLocation &Loc) {
|
||||
return getModRefInfo(ImmutableCallSite(C), Loc);
|
||||
}
|
||||
|
||||
/// getModRefInfo (for calls) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const CallInst *C, const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(C, Location(P, Size));
|
||||
return getModRefInfo(C, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for invokes) - Return information about whether
|
||||
/// a particular invoke modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const InvokeInst *I,
|
||||
const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const InvokeInst *I, const MemoryLocation &Loc) {
|
||||
return getModRefInfo(ImmutableCallSite(I), Loc);
|
||||
}
|
||||
|
||||
/// getModRefInfo (for invokes) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const InvokeInst *I,
|
||||
const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(I, Location(P, Size));
|
||||
return getModRefInfo(I, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for loads) - Return information about whether
|
||||
/// a particular load modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const LoadInst *L, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const LoadInst *L, const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for loads) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const LoadInst *L, const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(L, Location(P, Size));
|
||||
return getModRefInfo(L, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for stores) - Return information about whether
|
||||
/// a particular store modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const StoreInst *S, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const StoreInst *S, const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for stores) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const StoreInst *S, const Value *P, uint64_t Size){
|
||||
return getModRefInfo(S, Location(P, Size));
|
||||
return getModRefInfo(S, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for fences) - Return information about whether
|
||||
/// a particular store modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const FenceInst *S, const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const FenceInst *S, const MemoryLocation &Loc) {
|
||||
// Conservatively correct. (We could possibly be a bit smarter if
|
||||
// Loc is a alloca that doesn't escape.)
|
||||
return ModRef;
|
||||
@ -416,36 +407,38 @@ class AliasAnalysis {
|
||||
|
||||
/// getModRefInfo (for fences) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const FenceInst *S, const Value *P, uint64_t Size){
|
||||
return getModRefInfo(S, Location(P, Size));
|
||||
return getModRefInfo(S, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for cmpxchges) - Return information about whether
|
||||
/// a particular cmpxchg modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const AtomicCmpXchgInst *CX, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const AtomicCmpXchgInst *CX,
|
||||
const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for cmpxchges) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const AtomicCmpXchgInst *CX,
|
||||
const Value *P, unsigned Size) {
|
||||
return getModRefInfo(CX, Location(P, Size));
|
||||
return getModRefInfo(CX, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for atomicrmws) - Return information about whether
|
||||
/// a particular atomicrmw modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const AtomicRMWInst *RMW, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const AtomicRMWInst *RMW,
|
||||
const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for atomicrmws) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const AtomicRMWInst *RMW,
|
||||
const Value *P, unsigned Size) {
|
||||
return getModRefInfo(RMW, Location(P, Size));
|
||||
return getModRefInfo(RMW, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for va_args) - Return information about whether
|
||||
/// a particular va_arg modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const VAArgInst* I, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const VAArgInst *I, const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for va_args) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const VAArgInst* I, const Value* P, uint64_t Size){
|
||||
return getModRefInfo(I, Location(P, Size));
|
||||
return getModRefInfo(I, MemoryLocation(P, Size));
|
||||
}
|
||||
/// getModRefInfo - Return information about whether a call and an instruction
|
||||
/// may refer to the same memory locations.
|
||||
@ -462,13 +455,13 @@ class AliasAnalysis {
|
||||
/// callCapturesBefore - Return information about whether a particular call
|
||||
/// site modifies or reads the specified memory location.
|
||||
ModRefResult callCapturesBefore(const Instruction *I,
|
||||
const AliasAnalysis::Location &MemLoc,
|
||||
const MemoryLocation &MemLoc,
|
||||
DominatorTree *DT);
|
||||
|
||||
/// callCapturesBefore - A convenience wrapper.
|
||||
ModRefResult callCapturesBefore(const Instruction *I, const Value *P,
|
||||
uint64_t Size, DominatorTree *DT) {
|
||||
return callCapturesBefore(I, Location(P, Size), DT);
|
||||
return callCapturesBefore(I, MemoryLocation(P, Size), DT);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
@ -477,11 +470,11 @@ class AliasAnalysis {
|
||||
|
||||
/// canBasicBlockModify - Return true if it is possible for execution of the
|
||||
/// specified basic block to modify the location Loc.
|
||||
bool canBasicBlockModify(const BasicBlock &BB, const Location &Loc);
|
||||
bool canBasicBlockModify(const BasicBlock &BB, const MemoryLocation &Loc);
|
||||
|
||||
/// canBasicBlockModify - A convenience wrapper.
|
||||
bool canBasicBlockModify(const BasicBlock &BB, const Value *P, uint64_t Size){
|
||||
return canBasicBlockModify(BB, Location(P, Size));
|
||||
return canBasicBlockModify(BB, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// canInstructionRangeModRef - Return true if it is possible for the
|
||||
@ -489,15 +482,15 @@ class AliasAnalysis {
|
||||
/// mode) the location Loc. The instructions to consider are all
|
||||
/// of the instructions in the range of [I1,I2] INCLUSIVE.
|
||||
/// I1 and I2 must be in the same basic block.
|
||||
bool canInstructionRangeModRef(const Instruction &I1,
|
||||
const Instruction &I2, const Location &Loc,
|
||||
bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2,
|
||||
const MemoryLocation &Loc,
|
||||
const ModRefResult Mode);
|
||||
|
||||
/// canInstructionRangeModRef - A convenience wrapper.
|
||||
bool canInstructionRangeModRef(const Instruction &I1,
|
||||
const Instruction &I2, const Value *Ptr,
|
||||
uint64_t Size, const ModRefResult Mode) {
|
||||
return canInstructionRangeModRef(I1, I2, Location(Ptr, Size), Mode);
|
||||
return canInstructionRangeModRef(I1, I2, MemoryLocation(Ptr, Size), Mode);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
@ -565,6 +558,6 @@ bool isIdentifiedObject(const Value *V);
|
||||
/// IdentifiedObjects.
|
||||
bool isIdentifiedFunctionLocal(const Value *V);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -437,6 +437,6 @@ inline raw_ostream& operator<<(raw_ostream &OS, const AliasSetTracker &AST) {
|
||||
return OS;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -63,6 +63,6 @@ class BlockFrequencyInfo : public FunctionPass {
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -196,23 +196,26 @@ class BlockFrequencyInfoImplBase {
|
||||
struct LoopData {
|
||||
typedef SmallVector<std::pair<BlockNode, BlockMass>, 4> ExitMap;
|
||||
typedef SmallVector<BlockNode, 4> NodeList;
|
||||
typedef SmallVector<BlockMass, 1> HeaderMassList;
|
||||
LoopData *Parent; ///< The parent loop.
|
||||
bool IsPackaged; ///< Whether this has been packaged.
|
||||
uint32_t NumHeaders; ///< Number of headers.
|
||||
ExitMap Exits; ///< Successor edges (and weights).
|
||||
NodeList Nodes; ///< Header and the members of the loop.
|
||||
BlockMass BackedgeMass; ///< Mass returned to loop header.
|
||||
HeaderMassList BackedgeMass; ///< Mass returned to each loop header.
|
||||
BlockMass Mass;
|
||||
Scaled64 Scale;
|
||||
|
||||
LoopData(LoopData *Parent, const BlockNode &Header)
|
||||
: Parent(Parent), IsPackaged(false), NumHeaders(1), Nodes(1, Header) {}
|
||||
: Parent(Parent), IsPackaged(false), NumHeaders(1), Nodes(1, Header),
|
||||
BackedgeMass(1) {}
|
||||
template <class It1, class It2>
|
||||
LoopData(LoopData *Parent, It1 FirstHeader, It1 LastHeader, It2 FirstOther,
|
||||
It2 LastOther)
|
||||
: Parent(Parent), IsPackaged(false), Nodes(FirstHeader, LastHeader) {
|
||||
NumHeaders = Nodes.size();
|
||||
Nodes.insert(Nodes.end(), FirstOther, LastOther);
|
||||
BackedgeMass.resize(NumHeaders);
|
||||
}
|
||||
bool isHeader(const BlockNode &Node) const {
|
||||
if (isIrreducible())
|
||||
@ -223,6 +226,14 @@ class BlockFrequencyInfoImplBase {
|
||||
BlockNode getHeader() const { return Nodes[0]; }
|
||||
bool isIrreducible() const { return NumHeaders > 1; }
|
||||
|
||||
HeaderMassList::difference_type getHeaderIndex(const BlockNode &B) {
|
||||
assert(isHeader(B) && "this is only valid on loop header blocks");
|
||||
if (isIrreducible())
|
||||
return std::lower_bound(Nodes.begin(), Nodes.begin() + NumHeaders, B) -
|
||||
Nodes.begin();
|
||||
return 0;
|
||||
}
|
||||
|
||||
NodeList::const_iterator members_begin() const {
|
||||
return Nodes.begin() + NumHeaders;
|
||||
}
|
||||
@ -431,6 +442,16 @@ class BlockFrequencyInfoImplBase {
|
||||
/// \brief Compute the loop scale for a loop.
|
||||
void computeLoopScale(LoopData &Loop);
|
||||
|
||||
/// Adjust the mass of all headers in an irreducible loop.
|
||||
///
|
||||
/// Initially, irreducible loops are assumed to distribute their mass
|
||||
/// equally among its headers. This can lead to wrong frequency estimates
|
||||
/// since some headers may be executed more frequently than others.
|
||||
///
|
||||
/// This adjusts header mass distribution so it matches the weights of
|
||||
/// the backedges going into each of the loop headers.
|
||||
void adjustLoopHeaderMass(LoopData &Loop);
|
||||
|
||||
/// \brief Package up a loop.
|
||||
void packageLoop(LoopData &Loop);
|
||||
|
||||
@ -607,7 +628,7 @@ void IrreducibleGraph::addEdges(const BlockNode &Node,
|
||||
else
|
||||
addBlockEdges(*this, Irr, OuterLoop);
|
||||
}
|
||||
}
|
||||
} // namespace bfi_detail
|
||||
|
||||
/// \brief Shared implementation for block frequency analysis.
|
||||
///
|
||||
@ -695,6 +716,17 @@ void IrreducibleGraph::addEdges(const BlockNode &Node,
|
||||
/// - Distribute the mass accordingly, dithering to minimize mass loss,
|
||||
/// as described in \a distributeMass().
|
||||
///
|
||||
/// In the case of irreducible loops, instead of a single loop header,
|
||||
/// there will be several. The computation of backedge masses is similar
|
||||
/// but instead of having a single backedge mass, there will be one
|
||||
/// backedge per loop header. In these cases, each backedge will carry
|
||||
/// a mass proportional to the edge weights along the corresponding
|
||||
/// path.
|
||||
///
|
||||
/// At the end of propagation, the full mass assigned to the loop will be
|
||||
/// distributed among the loop headers proportionally according to the
|
||||
/// mass flowing through their backedges.
|
||||
///
|
||||
/// Finally, calculate the loop scale from the accumulated backedge mass.
|
||||
///
|
||||
/// 3. Distribute mass in the function (\a computeMassInFunction()).
|
||||
@ -735,11 +767,6 @@ void IrreducibleGraph::addEdges(const BlockNode &Node,
|
||||
/// as sub-loops, rather than arbitrarily shoving the problematic
|
||||
/// blocks into the headers of the main irreducible SCC.
|
||||
///
|
||||
/// - Backedge frequencies are assumed to be evenly split between the
|
||||
/// headers of a given irreducible SCC. Instead, we could track the
|
||||
/// backedge mass separately for each header, and adjust their relative
|
||||
/// frequencies.
|
||||
///
|
||||
/// - Entry frequencies are assumed to be evenly split between the
|
||||
/// headers of a given irreducible SCC, which is the only option if we
|
||||
/// need to compute mass in the SCC before its parent loop. Instead,
|
||||
@ -846,7 +873,7 @@ template <class BT> class BlockFrequencyInfoImpl : BlockFrequencyInfoImplBase {
|
||||
///
|
||||
/// \pre \a computeMassInLoop() has been called for each subloop of \c
|
||||
/// OuterLoop.
|
||||
/// \pre \c Insert points at the the last loop successfully processed by \a
|
||||
/// \pre \c Insert points at the last loop successfully processed by \a
|
||||
/// computeMassInLoop().
|
||||
/// \pre \c OuterLoop has irreducible SCCs.
|
||||
void computeIrreducibleMass(LoopData *OuterLoop,
|
||||
@ -1042,6 +1069,8 @@ bool BlockFrequencyInfoImpl<BT>::computeMassInLoop(LoopData &Loop) {
|
||||
for (const BlockNode &M : Loop.Nodes)
|
||||
if (!propagateMassToSuccessors(&Loop, M))
|
||||
llvm_unreachable("unhandled irreducible control flow");
|
||||
|
||||
adjustLoopHeaderMass(Loop);
|
||||
} else {
|
||||
Working[Loop.getHeader().Index].getMass() = BlockMass::getFull();
|
||||
if (!propagateMassToSuccessors(&Loop, Loop.getHeader()))
|
||||
@ -1104,7 +1133,7 @@ template <class BT> struct BlockEdgesAdder {
|
||||
G.addEdge(Irr, BFI.getNode(*I), OuterLoop);
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace bfi_detail
|
||||
template <class BT>
|
||||
void BlockFrequencyInfoImpl<BT>::computeIrreducibleMass(
|
||||
LoopData *OuterLoop, std::list<LoopData>::iterator Insert) {
|
||||
|
@ -158,6 +158,6 @@ class BranchProbabilityInfo : public FunctionPass {
|
||||
bool calcInvokeHeuristics(BasicBlock *BB);
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -78,6 +78,6 @@ bool isPotentiallyReachable(const BasicBlock *From, const BasicBlock *To,
|
||||
const DominatorTree *DT = nullptr,
|
||||
const LoopInfo *LI = nullptr);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -119,7 +119,7 @@ struct DOTGraphTraits<const Function*> : public DefaultDOTGraphTraits {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace llvm {
|
||||
class FunctionPass;
|
||||
|
@ -485,6 +485,6 @@ CGSCCToFunctionPassAdaptor<FunctionPassT>
|
||||
createCGSCCToFunctionPassAdaptor(FunctionPassT Pass) {
|
||||
return CGSCCToFunctionPassAdaptor<FunctionPassT>(std::move(Pass));
|
||||
}
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -56,6 +56,7 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include <map>
|
||||
@ -229,7 +230,8 @@ class CallGraphNode {
|
||||
/// \brief Adds a function to the list of functions called by this one.
|
||||
void addCalledFunction(CallSite CS, CallGraphNode *M) {
|
||||
assert(!CS.getInstruction() || !CS.getCalledFunction() ||
|
||||
!CS.getCalledFunction()->isIntrinsic());
|
||||
!CS.getCalledFunction()->isIntrinsic() ||
|
||||
!Intrinsic::isLeaf(CS.getCalledFunction()->getIntrinsicID()));
|
||||
CalledFunctions.emplace_back(CS.getInstruction(), M);
|
||||
M->AddRef();
|
||||
}
|
||||
@ -479,6 +481,6 @@ struct GraphTraits<const CallGraph *> : public GraphTraits<
|
||||
static const CallGraphNode &CGdereference(PairTy P) { return *P.second; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -102,6 +102,6 @@ class CallGraphSCC {
|
||||
iterator end() const { return Nodes.end(); }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -102,6 +102,6 @@ struct CodeMetrics {
|
||||
SmallPtrSetImpl<const Value *> &EphValues);
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -97,6 +97,6 @@ bool canConstantFoldCallTo(const Function *F);
|
||||
/// with the specified arguments, returning null if unsuccessful.
|
||||
Constant *ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
const TargetLibraryInfo *TLI = nullptr);
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -25,6 +25,6 @@ namespace llvm {
|
||||
FunctionPass *createPostDomOnlyPrinterPass();
|
||||
FunctionPass *createPostDomViewerPass();
|
||||
FunctionPass *createPostDomOnlyViewerPass();
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -205,6 +205,6 @@ class DominanceFrontier : public FunctionPass {
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class DominanceFrontierBase<BasicBlock>);
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class ForwardDominanceFrontierBase<BasicBlock>);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -221,6 +221,6 @@ ForwardDominanceFrontierBase<BlockT>::calculate(const DomTreeT &DT,
|
||||
return *Result;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -178,6 +178,6 @@ class IVUsers : public LoopPass {
|
||||
|
||||
Pass *createIVUsersPass();
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -36,7 +36,7 @@ namespace InlineConstants {
|
||||
/// Do not inline functions which allocate this many bytes on the stack
|
||||
/// when the caller is recursive.
|
||||
const unsigned TotalAllocaSizeRecursiveCaller = 1024;
|
||||
}
|
||||
} // namespace InlineConstants
|
||||
|
||||
/// \brief Represents the cost of inlining a function.
|
||||
///
|
||||
@ -138,6 +138,6 @@ class InlineCostAnalysis : public CallGraphSCCPass {
|
||||
bool isInlineViable(Function &Callee);
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -145,6 +145,6 @@ template <> struct GraphTraits<Inverse<Interval*> > {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -263,6 +263,6 @@ inline interval_part_interval_iterator intervals_end(IntervalPartition &IP) {
|
||||
return interval_part_interval_iterator();
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -106,6 +106,6 @@ class IntervalPartition : public FunctionPass {
|
||||
void updatePredecessors(Interval *Int);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -92,5 +92,5 @@ class IDFCalculator {
|
||||
const SmallPtrSetImpl<BasicBlock *> *DefBlocks;
|
||||
SmallVector<BasicBlock *, 32> PHIBlocks;
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
#endif
|
||||
|
@ -66,6 +66,6 @@ class JumpInstrTableInfo : public ImmutablePass {
|
||||
/// bound specifies the maximum number of bytes needed to represent an
|
||||
/// unconditional jump or a trap instruction in the back end currently in use.
|
||||
ModulePass *createJumpInstrTableInfoPass(unsigned Bound);
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif /* LLVM_ANALYSIS_JUMPINSTRTABLEINFO_H */
|
||||
|
@ -569,6 +569,6 @@ class LazyCallGraphPrinterPass {
|
||||
static StringRef name() { return "LazyCallGraphPrinterPass"; }
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -39,7 +39,7 @@ namespace llvm {
|
||||
~LibCallAliasAnalysis() override;
|
||||
|
||||
ModRefResult getModRefInfo(ImmutableCallSite CS,
|
||||
const Location &Loc) override;
|
||||
const MemoryLocation &Loc) override;
|
||||
|
||||
ModRefResult getModRefInfo(ImmutableCallSite CS1,
|
||||
ImmutableCallSite CS2) override {
|
||||
@ -64,8 +64,8 @@ namespace llvm {
|
||||
private:
|
||||
ModRefResult AnalyzeLibCallDetails(const LibCallFunctionInfo *FI,
|
||||
ImmutableCallSite CS,
|
||||
const Location &Loc);
|
||||
const MemoryLocation &Loc);
|
||||
};
|
||||
} // End of llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -48,8 +48,7 @@ class InvokeInst;
|
||||
enum LocResult {
|
||||
Yes, No, Unknown
|
||||
};
|
||||
LocResult (*isLocation)(ImmutableCallSite CS,
|
||||
const AliasAnalysis::Location &Loc);
|
||||
LocResult (*isLocation)(ImmutableCallSite CS, const MemoryLocation &Loc);
|
||||
};
|
||||
|
||||
/// LibCallFunctionInfo - Each record in the array of FunctionInfo structs
|
||||
@ -207,7 +206,7 @@ class InvokeInst;
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
bool canSimplifyInvokeNoUnwind(const InvokeInst *II);
|
||||
bool canSimplifyInvokeNoUnwind(const Function *F);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
|
@ -44,6 +44,6 @@ void lintFunction(
|
||||
const Function &F ///< The function to be checked
|
||||
);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -52,6 +52,6 @@ Value *FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||
AliasAnalysis *AA = nullptr,
|
||||
AAMDNodes *AATags = nullptr);
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -555,6 +555,6 @@ class LoopAccessAnalysis : public FunctionPass {
|
||||
DominatorTree *DT;
|
||||
LoopInfo *LI;
|
||||
};
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -763,6 +763,6 @@ class LoopInfoWrapperPass : public FunctionPass {
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -535,6 +535,6 @@ void LoopInfoBase<BlockT, LoopT>::verify() const {
|
||||
#endif
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -169,6 +169,6 @@ class LPPassManager : public FunctionPass, public PMDataManager {
|
||||
Loop *CurrentLoop;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -262,6 +262,6 @@ class ObjectSizeOffsetEvaluator
|
||||
SizeOffsetEvalType visitInstruction(Instruction &I);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -287,7 +287,7 @@ namespace llvm {
|
||||
/// conflicting tags.
|
||||
AAMDNodes AATags;
|
||||
|
||||
NonLocalPointerInfo() : Size(AliasAnalysis::UnknownSize) {}
|
||||
NonLocalPointerInfo() : Size(MemoryLocation::UnknownSize) {}
|
||||
};
|
||||
|
||||
/// CachedNonLocalPointerInfo - This map stores the cached results of doing
|
||||
@ -403,13 +403,12 @@ namespace llvm {
|
||||
///
|
||||
/// Note that this is an uncached query, and thus may be inefficient.
|
||||
///
|
||||
MemDepResult getPointerDependencyFrom(const AliasAnalysis::Location &Loc,
|
||||
MemDepResult getPointerDependencyFrom(const MemoryLocation &Loc,
|
||||
bool isLoad,
|
||||
BasicBlock::iterator ScanIt,
|
||||
BasicBlock *BB,
|
||||
Instruction *QueryInst = nullptr);
|
||||
|
||||
|
||||
/// getLoadLoadClobberFullWidthSize - This is a little bit of analysis that
|
||||
/// looks at a memory location for a load (specified by MemLocBase, Offs,
|
||||
/// and Size) and compares it against a load. If the specified load could
|
||||
@ -428,15 +427,14 @@ namespace llvm {
|
||||
BasicBlock *BB);
|
||||
bool getNonLocalPointerDepFromBB(Instruction *QueryInst,
|
||||
const PHITransAddr &Pointer,
|
||||
const AliasAnalysis::Location &Loc,
|
||||
bool isLoad, BasicBlock *BB,
|
||||
const MemoryLocation &Loc, bool isLoad,
|
||||
BasicBlock *BB,
|
||||
SmallVectorImpl<NonLocalDepResult> &Result,
|
||||
DenseMap<BasicBlock*, Value*> &Visited,
|
||||
DenseMap<BasicBlock *, Value *> &Visited,
|
||||
bool SkipFirstBlock = false);
|
||||
MemDepResult GetNonLocalInfoForBlock(Instruction *QueryInst,
|
||||
const AliasAnalysis::Location &Loc,
|
||||
bool isLoad, BasicBlock *BB,
|
||||
NonLocalDepInfo *Cache,
|
||||
const MemoryLocation &Loc, bool isLoad,
|
||||
BasicBlock *BB, NonLocalDepInfo *Cache,
|
||||
unsigned NumSortedEntries);
|
||||
|
||||
void RemoveCachedNonLocalPointerDependencies(ValueIsLoadPair P);
|
||||
@ -447,6 +445,6 @@ namespace llvm {
|
||||
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -26,6 +26,7 @@ class LoadInst;
|
||||
class StoreInst;
|
||||
class MemTransferInst;
|
||||
class MemIntrinsic;
|
||||
class TargetLibraryInfo;
|
||||
|
||||
/// Representation for a specific memory location.
|
||||
///
|
||||
@ -87,6 +88,10 @@ class MemoryLocation {
|
||||
/// transfer.
|
||||
static MemoryLocation getForDest(const MemIntrinsic *MI);
|
||||
|
||||
/// Return a location representing a particular argument of a call.
|
||||
static MemoryLocation getForArgument(ImmutableCallSite CS, unsigned ArgIdx,
|
||||
const TargetLibraryInfo &TLI);
|
||||
|
||||
explicit MemoryLocation(const Value *Ptr = nullptr,
|
||||
uint64_t Size = UnknownSize,
|
||||
const AAMDNodes &AATags = AAMDNodes())
|
||||
@ -132,6 +137,6 @@ template <> struct DenseMapInfo<MemoryLocation> {
|
||||
return LHS == RHS;
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -173,6 +173,6 @@ namespace llvm {
|
||||
//
|
||||
FunctionPass *createMemDerefPrinter();
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -112,6 +112,6 @@ template <> struct GraphTraits<PostDominatorTree*>
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -280,6 +280,6 @@ class PtrUseVisitor : protected InstVisitor<DerivedT>,
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -906,5 +906,5 @@ EXTERN_TEMPLATE_INSTANTIATION(class RegionBase<RegionTraits<Function>>);
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class RegionNodeBase<RegionTraits<Function>>);
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class RegionInfoBase<RegionTraits<Function>>);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
#endif
|
||||
|
@ -123,6 +123,6 @@ class RGPassManager : public FunctionPass, public PMDataManager {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -981,6 +981,6 @@ namespace llvm {
|
||||
/// to locate them all and call their destructors.
|
||||
SCEVUnknown *FirstUnknown;
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -275,6 +275,6 @@ namespace llvm {
|
||||
Value *expandIVInc(PHINode *PN, Value *StepV, const Loop *L,
|
||||
Type *ExpandTy, Type *IntTy, bool useSubtract);
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -829,6 +829,6 @@ static inline const SCEV *apply(const SCEV *Scev, LoopToScevMapT &Map,
|
||||
return SCEVApplyRewriter::rewrite(Scev, Map, SE);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -73,6 +73,6 @@ const SCEV *TransformForPostIncUse(TransformKind Kind,
|
||||
ScalarEvolution &SE,
|
||||
DominatorTree &DT);
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -265,6 +265,6 @@ class TargetFolder {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -908,6 +908,6 @@ class TargetTransformInfoWrapperPass : public ImmutablePass {
|
||||
/// clients.
|
||||
ImmutablePass *createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -446,6 +446,6 @@ class TargetTransformInfoImplCRTPBase : public TargetTransformInfoImplBase {
|
||||
U->getNumOperands() == 1 ? U->getOperand(0)->getType() : nullptr);
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -67,6 +67,6 @@ std::unique_ptr<Module> parseAssembly(MemoryBufferRef F, SMDiagnostic &Err,
|
||||
/// @return true on error.
|
||||
bool parseAssemblyInto(MemoryBufferRef F, Module &M, SMDiagnostic &Err);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -77,7 +77,7 @@ namespace bitc {
|
||||
// [id, name]
|
||||
};
|
||||
|
||||
} // End bitc namespace
|
||||
} // namespace bitc
|
||||
|
||||
/// BitCodeAbbrevOp - This describes one or more operands in an abbreviation.
|
||||
/// This is actually a union of two different things:
|
||||
@ -180,6 +180,6 @@ class BitCodeAbbrev : public RefCountedBase<BitCodeAbbrev> {
|
||||
OperandList.push_back(OpInfo);
|
||||
}
|
||||
};
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -56,6 +56,6 @@ class BitcodeWriterPass {
|
||||
static StringRef name() { return "BitcodeWriterPass"; }
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -512,6 +512,6 @@ class BitstreamCursor {
|
||||
bool ReadBlockInfoBlock();
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Bitcode/BitCodes.h"
|
||||
#include "llvm/Support/Endian.h"
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
@ -63,10 +64,7 @@ class BitstreamWriter {
|
||||
// BackpatchWord - Backpatch a 32-bit word in the output with the specified
|
||||
// value.
|
||||
void BackpatchWord(unsigned ByteNo, unsigned NewWord) {
|
||||
Out[ByteNo++] = (unsigned char)(NewWord >> 0);
|
||||
Out[ByteNo++] = (unsigned char)(NewWord >> 8);
|
||||
Out[ByteNo++] = (unsigned char)(NewWord >> 16);
|
||||
Out[ByteNo ] = (unsigned char)(NewWord >> 24);
|
||||
support::endian::write32le(&Out[ByteNo], NewWord);
|
||||
}
|
||||
|
||||
void WriteByte(unsigned char Value) {
|
||||
@ -74,12 +72,9 @@ class BitstreamWriter {
|
||||
}
|
||||
|
||||
void WriteWord(unsigned Value) {
|
||||
unsigned char Bytes[4] = {
|
||||
(unsigned char)(Value >> 0),
|
||||
(unsigned char)(Value >> 8),
|
||||
(unsigned char)(Value >> 16),
|
||||
(unsigned char)(Value >> 24) };
|
||||
Out.append(&Bytes[0], &Bytes[4]);
|
||||
Value = support::endian::byte_swap<uint32_t, support::little>(Value);
|
||||
Out.append(reinterpret_cast<const char *>(&Value),
|
||||
reinterpret_cast<const char *>(&Value + 1));
|
||||
}
|
||||
|
||||
unsigned GetBufferOffset() const {
|
||||
@ -525,6 +520,6 @@ class BitstreamWriter {
|
||||
};
|
||||
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -342,7 +342,7 @@ namespace bitc {
|
||||
// align, vol,
|
||||
// ordering, synchscope]
|
||||
FUNC_CODE_INST_RESUME = 39, // RESUME: [opval]
|
||||
FUNC_CODE_INST_LANDINGPAD = 40, // LANDINGPAD: [ty,val,val,num,id0,val0...]
|
||||
FUNC_CODE_INST_LANDINGPAD_OLD = 40, // LANDINGPAD: [ty,val,val,num,id0,val0...]
|
||||
FUNC_CODE_INST_LOADATOMIC = 41, // LOAD: [opty, op, align, vol,
|
||||
// ordering, synchscope]
|
||||
FUNC_CODE_INST_STOREATOMIC_OLD = 42, // STORE: [ptrty,ptr,val, align, vol
|
||||
@ -352,6 +352,7 @@ namespace bitc {
|
||||
FUNC_CODE_INST_STOREATOMIC = 45, // STORE: [ptrty,ptr,val, align, vol
|
||||
FUNC_CODE_INST_CMPXCHG = 46, // CMPXCHG: [ptrty,ptr,valty,cmp,new, align,
|
||||
// vol,ordering,synchscope]
|
||||
FUNC_CODE_INST_LANDINGPAD = 47, // LANDINGPAD: [ty,val,num,id0,val0...]
|
||||
};
|
||||
|
||||
enum UseListCodes {
|
||||
@ -403,7 +404,8 @@ namespace bitc {
|
||||
ATTR_KIND_JUMP_TABLE = 40,
|
||||
ATTR_KIND_DEREFERENCEABLE = 41,
|
||||
ATTR_KIND_DEREFERENCEABLE_OR_NULL = 42,
|
||||
ATTR_KIND_CONVERGENT = 43
|
||||
ATTR_KIND_CONVERGENT = 43,
|
||||
ATTR_KIND_SAFESTACK = 44,
|
||||
};
|
||||
|
||||
enum ComdatSelectionKindCodes {
|
||||
@ -414,7 +416,7 @@ namespace bitc {
|
||||
COMDAT_SELECTION_KIND_SAME_SIZE = 5,
|
||||
};
|
||||
|
||||
} // End bitc namespace
|
||||
} // End llvm namespace
|
||||
} // namespace bitc
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define LLVM_BITCODE_READERWRITER_H
|
||||
|
||||
#include "llvm/IR/DiagnosticInfo.h"
|
||||
#include "llvm/Support/Endian.h"
|
||||
#include "llvm/Support/ErrorOr.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
#include <memory>
|
||||
@ -32,7 +33,7 @@ namespace llvm {
|
||||
/// deserialization of function bodies. If ShouldLazyLoadMetadata is true,
|
||||
/// lazily load metadata as well. If successful, this moves Buffer. On
|
||||
/// error, this *does not* move Buffer.
|
||||
ErrorOr<Module *>
|
||||
ErrorOr<std::unique_ptr<Module>>
|
||||
getLazyBitcodeModule(std::unique_ptr<MemoryBuffer> &&Buffer,
|
||||
LLVMContext &Context,
|
||||
DiagnosticHandlerFunction DiagnosticHandler = nullptr,
|
||||
@ -41,7 +42,8 @@ namespace llvm {
|
||||
/// Read the header of the specified stream and prepare for lazy
|
||||
/// deserialization and streaming of function bodies.
|
||||
ErrorOr<std::unique_ptr<Module>> getStreamedBitcodeModule(
|
||||
StringRef Name, DataStreamer *Streamer, LLVMContext &Context,
|
||||
StringRef Name, std::unique_ptr<DataStreamer> Streamer,
|
||||
LLVMContext &Context,
|
||||
DiagnosticHandlerFunction DiagnosticHandler = nullptr);
|
||||
|
||||
/// Read the header of the specified bitcode buffer and extract just the
|
||||
@ -52,7 +54,7 @@ namespace llvm {
|
||||
DiagnosticHandlerFunction DiagnosticHandler = nullptr);
|
||||
|
||||
/// Read the specified bitcode file, returning the module.
|
||||
ErrorOr<Module *>
|
||||
ErrorOr<std::unique_ptr<Module>>
|
||||
parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context,
|
||||
DiagnosticHandlerFunction DiagnosticHandler = nullptr);
|
||||
|
||||
@ -132,14 +134,8 @@ namespace llvm {
|
||||
// Must contain the header!
|
||||
if (BufEnd-BufPtr < KnownHeaderSize) return true;
|
||||
|
||||
unsigned Offset = ( BufPtr[OffsetField ] |
|
||||
(BufPtr[OffsetField+1] << 8) |
|
||||
(BufPtr[OffsetField+2] << 16) |
|
||||
(BufPtr[OffsetField+3] << 24));
|
||||
unsigned Size = ( BufPtr[SizeField ] |
|
||||
(BufPtr[SizeField +1] << 8) |
|
||||
(BufPtr[SizeField +2] << 16) |
|
||||
(BufPtr[SizeField +3] << 24));
|
||||
unsigned Offset = support::endian::read32le(&BufPtr[OffsetField]);
|
||||
unsigned Size = support::endian::read32le(&BufPtr[SizeField]);
|
||||
|
||||
// Verify that Offset+Size fits in the file.
|
||||
if (VerifyBufferSize && Offset+Size > unsigned(BufEnd-BufPtr))
|
||||
@ -170,7 +166,7 @@ namespace llvm {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
template <> struct is_error_code_enum<llvm::BitcodeError> : std::true_type {};
|
||||
|
@ -115,6 +115,6 @@ bool returnTypeIsEligibleForTailCall(const Function *F,
|
||||
// or we are in LTO.
|
||||
bool canBeOmittedFromSymbolTable(const GlobalValue *GV);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -418,16 +418,17 @@ class AsmPrinter : public MachineFunctionPass {
|
||||
/// Emit reference to a ttype global with a specified encoding.
|
||||
void EmitTTypeReference(const GlobalValue *GV, unsigned Encoding) const;
|
||||
|
||||
/// Emit the 4-byte offset of Label from the start of its section. This can
|
||||
/// be done with a special directive if the target supports it (e.g. cygwin)
|
||||
/// or by emitting it as an offset from a label at the start of the section.
|
||||
void emitSectionOffset(const MCSymbol *Label) const;
|
||||
/// Emit a reference to a symbol for use in dwarf. Different object formats
|
||||
/// represent this in different ways. Some use a relocation others encode
|
||||
/// the label offset in its section.
|
||||
void emitDwarfSymbolReference(const MCSymbol *Label,
|
||||
bool ForceOffset = false) const;
|
||||
|
||||
/// Emit the 4-byte offset of a string from the start of its section.
|
||||
///
|
||||
/// When possible, emit a DwarfStringPool section offset without any
|
||||
/// relocations, and without using the symbol. Otherwise, defers to \a
|
||||
/// emitSectionOffset().
|
||||
/// emitDwarfSymbolReference().
|
||||
void emitDwarfStringOffset(DwarfStringPoolEntryRef S) const;
|
||||
|
||||
/// Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
|
||||
@ -534,6 +535,6 @@ class AsmPrinter : public MachineFunctionPass {
|
||||
void EmitXXStructorList(const Constant *List, bool isCtor);
|
||||
GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy &C);
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -830,6 +830,6 @@ class BasicTTIImpl : public BasicTTIImplBase<BasicTTIImpl> {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -74,6 +74,6 @@ namespace llvm {
|
||||
const MachineBlockFrequencyInfo &MBFI,
|
||||
VirtRegAuxInfo::NormalizingFn norm =
|
||||
normalizeSpillWeight);
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif // LLVM_CODEGEN_CALCSPILLWEIGHTS_H
|
||||
|
@ -16,6 +16,7 @@
|
||||
#ifndef LLVM_CODEGEN_COMMANDFLAGS_H
|
||||
#define LLVM_CODEGEN_COMMANDFLAGS_H
|
||||
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/MC/MCTargetOptionsCommandFlags.h"
|
||||
#include "llvm//MC/SubtargetFeature.h"
|
||||
@ -150,7 +151,7 @@ FuseFPOps("fp-contract",
|
||||
clEnumValN(FPOpFusion::Standard, "on",
|
||||
"Only fuse 'blessed' FP ops."),
|
||||
clEnumValN(FPOpFusion::Strict, "off",
|
||||
"Only fuse FP ops when the result won't be effected."),
|
||||
"Only fuse FP ops when the result won't be affected."),
|
||||
clEnumValEnd));
|
||||
|
||||
cl::list<std::string>
|
||||
@ -247,7 +248,6 @@ static inline TargetOptions InitTargetOptionsFromCodeGenFlags() {
|
||||
Options.FloatABIType = FloatABIForCalls;
|
||||
Options.NoZerosInBSS = DontPlaceZerosInBSS;
|
||||
Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
|
||||
Options.DisableTailCalls = DisableTailCalls;
|
||||
Options.StackAlignmentOverride = OverrideStackAlignment;
|
||||
Options.TrapFuncName = TrapFuncName;
|
||||
Options.PositionIndependentExecutable = EnablePIE;
|
||||
@ -315,6 +315,11 @@ static inline void setFunctionAttributes(StringRef CPU, StringRef Features,
|
||||
"no-frame-pointer-elim",
|
||||
DisableFPElim ? "true" : "false");
|
||||
|
||||
if (DisableTailCalls.getNumOccurrences() > 0)
|
||||
NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex,
|
||||
"disable-tail-calls",
|
||||
toStringRef(DisableTailCalls));
|
||||
|
||||
// Let NewAttrs override Attrs.
|
||||
NewAttrs = Attrs.addAttributes(Ctx, AttributeSet::FunctionIndex, NewAttrs);
|
||||
F.setAttributes(NewAttrs);
|
||||
|
@ -159,6 +159,6 @@ class VLIWPacketizerList {
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -635,6 +635,6 @@ class DIEBlock : public DIE {
|
||||
#endif
|
||||
};
|
||||
|
||||
} // end llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
73
contrib/llvm/include/llvm/CodeGen/FaultMaps.h
Normal file
73
contrib/llvm/include/llvm/CodeGen/FaultMaps.h
Normal file
@ -0,0 +1,73 @@
|
||||
//===------------------- FaultMaps.h - StackMaps ----------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CODEGEN_FAULTMAPS_H
|
||||
#define LLVM_CODEGEN_FAULTMAPS_H
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class AsmPrinter;
|
||||
class MCExpr;
|
||||
class MCSymbol;
|
||||
class MCStreamer;
|
||||
|
||||
class FaultMaps {
|
||||
public:
|
||||
enum FaultKind { FaultingLoad = 1, FaultKindMax };
|
||||
|
||||
static const char *faultTypeToString(FaultKind);
|
||||
|
||||
explicit FaultMaps(AsmPrinter &AP);
|
||||
|
||||
void recordFaultingOp(FaultKind FaultTy, const MCSymbol *HandlerLabel);
|
||||
void serializeToFaultMapSection();
|
||||
|
||||
private:
|
||||
static const char *WFMP;
|
||||
|
||||
struct FaultInfo {
|
||||
FaultKind Kind;
|
||||
const MCExpr *FaultingOffsetExpr;
|
||||
const MCExpr *HandlerOffsetExpr;
|
||||
|
||||
FaultInfo()
|
||||
: Kind(FaultKindMax), FaultingOffsetExpr(nullptr),
|
||||
HandlerOffsetExpr(nullptr) {}
|
||||
|
||||
explicit FaultInfo(FaultMaps::FaultKind Kind, const MCExpr *FaultingOffset,
|
||||
const MCExpr *HandlerOffset)
|
||||
: Kind(Kind), FaultingOffsetExpr(FaultingOffset),
|
||||
HandlerOffsetExpr(HandlerOffset) {}
|
||||
};
|
||||
|
||||
typedef std::vector<FaultInfo> FunctionFaultInfos;
|
||||
|
||||
// We'd like to keep a stable iteration order for FunctionInfos to help
|
||||
// FileCheck based testing.
|
||||
struct MCSymbolComparator {
|
||||
bool operator()(const MCSymbol *LHS, const MCSymbol *RHS) const {
|
||||
return LHS->getName() < RHS->getName();
|
||||
}
|
||||
};
|
||||
|
||||
std::map<const MCSymbol *, FunctionFaultInfos, MCSymbolComparator>
|
||||
FunctionInfos;
|
||||
AsmPrinter &AP;
|
||||
|
||||
void emitFunctionInfo(const MCSymbol *FnLabel, const FunctionFaultInfos &FFI);
|
||||
};
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
@ -201,6 +201,6 @@ class GCModuleInfo : public ImmutablePass {
|
||||
/// will soon change.
|
||||
GCFunctionInfo &getFunctionInfo(const Function &F);
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -59,6 +59,6 @@ class GCMetadataPrinter {
|
||||
|
||||
virtual ~GCMetadataPrinter();
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user