aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEd Schouten <ed@FreeBSD.org>2009-06-23 14:50:01 +0000
committerEd Schouten <ed@FreeBSD.org>2009-06-23 14:50:01 +0000
commit0408e1d309a743aca4ed4592cf2c712a71537901 (patch)
tree6be075b410677415707e0987e3a49123130cef22 /include
parentb2f21fb044b6b5c52cff6227f9f79ca4ed42b18f (diff)
downloadsrc-0408e1d309a743aca4ed4592cf2c712a71537901.tar.gz
src-0408e1d309a743aca4ed4592cf2c712a71537901.zip
Import LLVM r73954.vendor/llvm/llvm-r73954
Notes
Notes: svn path=/vendor/llvm/dist/; revision=194710 svn path=/vendor/llvm/llvm-r73954/; revision=194712; tag=vendor/llvm/llvm-r73954
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Analysis/IVUsers.h16
-rw-r--r--include/llvm/Analysis/LoopVR.h4
-rw-r--r--include/llvm/Analysis/ScalarEvolution.h283
-rw-r--r--include/llvm/Analysis/ScalarEvolutionExpander.h9
-rw-r--r--include/llvm/Analysis/ScalarEvolutionExpressions.h145
-rw-r--r--include/llvm/CodeGen/BinaryObject.h6
-rw-r--r--include/llvm/Intrinsics.td1
-rw-r--r--include/llvm/IntrinsicsARM.td295
-rw-r--r--include/llvm/Support/Timer.h1
-rw-r--r--include/llvm/Target/TargetELFWriterInfo.h23
10 files changed, 511 insertions, 272 deletions
diff --git a/include/llvm/Analysis/IVUsers.h b/include/llvm/Analysis/IVUsers.h
index ac785d5c54a9..30a457ace811 100644
--- a/include/llvm/Analysis/IVUsers.h
+++ b/include/llvm/Analysis/IVUsers.h
@@ -34,7 +34,7 @@ class IVUsersOfOneStride;
class IVStrideUse : public CallbackVH, public ilist_node<IVStrideUse> {
public:
IVStrideUse(IVUsersOfOneStride *parent,
- const SCEVHandle &offset,
+ const SCEV* offset,
Instruction* U, Value *O)
: CallbackVH(U), Parent(parent), Offset(offset),
OperandValToReplace(O),
@@ -58,10 +58,10 @@ public:
/// getOffset - Return the offset to add to a theoeretical induction
/// variable that starts at zero and counts up by the stride to compute
/// the value for the use. This always has the same type as the stride.
- SCEVHandle getOffset() const { return Offset; }
+ const SCEV* getOffset() const { return Offset; }
/// setOffset - Assign a new offset to this use.
- void setOffset(SCEVHandle Val) {
+ void setOffset(const SCEV* Val) {
Offset = Val;
}
@@ -96,7 +96,7 @@ private:
IVUsersOfOneStride *Parent;
/// Offset - The offset to add to the base induction expression.
- SCEVHandle Offset;
+ const SCEV* Offset;
/// OperandValToReplace - The Value of the operand in the user instruction
/// that this IVStrideUse is representing.
@@ -158,7 +158,7 @@ public:
/// initial value and the operand that uses the IV.
ilist<IVStrideUse> Users;
- void addUser(const SCEVHandle &Offset, Instruction *User, Value *Operand) {
+ void addUser(const SCEV* Offset, Instruction *User, Value *Operand) {
Users.push_back(new IVStrideUse(this, Offset, User, Operand));
}
};
@@ -178,12 +178,12 @@ public:
/// IVUsesByStride - A mapping from the strides in StrideOrder to the
/// uses in IVUses.
- std::map<SCEVHandle, IVUsersOfOneStride*> IVUsesByStride;
+ std::map<const SCEV*, IVUsersOfOneStride*> IVUsesByStride;
/// StrideOrder - An ordering of the keys in IVUsesByStride that is stable:
/// We use this to iterate over the IVUsesByStride collection without being
/// dependent on random ordering of pointers in the process.
- SmallVector<SCEVHandle, 16> StrideOrder;
+ SmallVector<const SCEV*, 16> StrideOrder;
private:
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
@@ -203,7 +203,7 @@ public:
/// getReplacementExpr - Return a SCEV expression which computes the
/// value of the OperandValToReplace of the given IVStrideUse.
- SCEVHandle getReplacementExpr(const IVStrideUse &U) const;
+ const SCEV* getReplacementExpr(const IVStrideUse &U) const;
void print(raw_ostream &OS, const Module* = 0) const;
virtual void print(std::ostream &OS, const Module* = 0) const;
diff --git a/include/llvm/Analysis/LoopVR.h b/include/llvm/Analysis/LoopVR.h
index 1d806f83aa92..36b62152f86b 100644
--- a/include/llvm/Analysis/LoopVR.h
+++ b/include/llvm/Analysis/LoopVR.h
@@ -78,9 +78,9 @@ public:
private:
ConstantRange compute(Value *V);
- ConstantRange getRange(SCEVHandle S, Loop *L, ScalarEvolution &SE);
+ ConstantRange getRange(const SCEV* S, Loop *L, ScalarEvolution &SE);
- ConstantRange getRange(SCEVHandle S, SCEVHandle T, ScalarEvolution &SE);
+ ConstantRange getRange(const SCEV* S, const SCEV* T, ScalarEvolution &SE);
std::map<Value *, ConstantRange *> Map;
};
diff --git a/include/llvm/Analysis/ScalarEvolution.h b/include/llvm/Analysis/ScalarEvolution.h
index 8d5136cea2c3..1c1298a9a15a 100644
--- a/include/llvm/Analysis/ScalarEvolution.h
+++ b/include/llvm/Analysis/ScalarEvolution.h
@@ -32,10 +32,16 @@ namespace llvm {
class APInt;
class ConstantInt;
class Type;
- class SCEVHandle;
class ScalarEvolution;
class TargetData;
- template<> struct DenseMapInfo<SCEVHandle>;
+ class SCEVConstant;
+ class SCEVTruncateExpr;
+ class SCEVZeroExtendExpr;
+ class SCEVCommutativeExpr;
+ class SCEVUDivExpr;
+ class SCEVSignExtendExpr;
+ class SCEVAddRecExpr;
+ class SCEVUnknown;
/// SCEV - This class represents an analyzed expression in the program. These
/// are reference-counted opaque objects that the client is not allowed to
@@ -43,25 +49,14 @@ namespace llvm {
///
class SCEV {
const unsigned SCEVType; // The SCEV baseclass this node corresponds to
- mutable unsigned RefCount;
-
- friend class SCEVHandle;
- friend class DenseMapInfo<SCEVHandle>;
- void addRef() const { ++RefCount; }
- void dropRef() const {
- if (--RefCount == 0)
- delete this;
- }
-
- const ScalarEvolution* parent;
SCEV(const SCEV &); // DO NOT IMPLEMENT
void operator=(const SCEV &); // DO NOT IMPLEMENT
protected:
virtual ~SCEV();
public:
- explicit SCEV(unsigned SCEVTy, const ScalarEvolution* p) :
- SCEVType(SCEVTy), RefCount(0), parent(p) {}
+ explicit SCEV(unsigned SCEVTy) :
+ SCEVType(SCEVTy) {}
unsigned getSCEVType() const { return SCEVType; }
@@ -92,9 +87,9 @@ namespace llvm {
/// the same value, but which uses the concrete value Conc instead of the
/// symbolic value. If this SCEV does not use the symbolic value, it
/// returns itself.
- virtual SCEVHandle
- replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ virtual const SCEV*
+ replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const = 0;
/// dominates - Return true if elements that makes up this SCEV dominates
@@ -129,17 +124,16 @@ namespace llvm {
/// None of the standard SCEV operations are valid on this class, it is just a
/// marker.
struct SCEVCouldNotCompute : public SCEV {
- SCEVCouldNotCompute(const ScalarEvolution* p);
- ~SCEVCouldNotCompute();
+ SCEVCouldNotCompute();
// None of these methods are valid for this object.
virtual bool isLoopInvariant(const Loop *L) const;
virtual const Type *getType() const;
virtual bool hasComputableLoopEvolution(const Loop *L) const;
virtual void print(raw_ostream &OS) const;
- virtual SCEVHandle
- replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ virtual const SCEV*
+ replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const;
virtual bool dominates(BasicBlock *BB, DominatorTree *DT) const {
@@ -151,83 +145,6 @@ namespace llvm {
static bool classof(const SCEV *S);
};
- /// SCEVHandle - This class is used to maintain the SCEV object's refcounts,
- /// freeing the objects when the last reference is dropped.
- class SCEVHandle {
- const SCEV *S;
- SCEVHandle(); // DO NOT IMPLEMENT
- public:
- SCEVHandle(const SCEV *s) : S(s) {
- assert(S && "Cannot create a handle to a null SCEV!");
- S->addRef();
- }
- SCEVHandle(const SCEVHandle &RHS) : S(RHS.S) {
- S->addRef();
- }
- ~SCEVHandle() { S->dropRef(); }
-
- operator const SCEV*() const { return S; }
-
- const SCEV &operator*() const { return *S; }
- const SCEV *operator->() const { return S; }
-
- bool operator==(const SCEV *RHS) const { return S == RHS; }
- bool operator!=(const SCEV *RHS) const { return S != RHS; }
-
- const SCEVHandle &operator=(SCEV *RHS) {
- if (S != RHS) {
- S->dropRef();
- S = RHS;
- S->addRef();
- }
- return *this;
- }
-
- const SCEVHandle &operator=(const SCEVHandle &RHS) {
- if (S != RHS.S) {
- S->dropRef();
- S = RHS.S;
- S->addRef();
- }
- return *this;
- }
- };
-
- template<typename From> struct simplify_type;
- template<> struct simplify_type<const SCEVHandle> {
- typedef const SCEV* SimpleType;
- static SimpleType getSimplifiedValue(const SCEVHandle &Node) {
- return Node;
- }
- };
- template<> struct simplify_type<SCEVHandle>
- : public simplify_type<const SCEVHandle> {};
-
- // Specialize DenseMapInfo for SCEVHandle so that SCEVHandle may be used
- // as a key in DenseMaps.
- template<>
- struct DenseMapInfo<SCEVHandle> {
- static inline SCEVHandle getEmptyKey() {
- static SCEVCouldNotCompute Empty(0);
- if (Empty.RefCount == 0)
- Empty.addRef();
- return &Empty;
- }
- static inline SCEVHandle getTombstoneKey() {
- static SCEVCouldNotCompute Tombstone(0);
- if (Tombstone.RefCount == 0)
- Tombstone.addRef();
- return &Tombstone;
- }
- static unsigned getHashValue(const SCEVHandle &Val) {
- return DenseMapInfo<const SCEV *>::getHashValue(Val);
- }
- static bool isEqual(const SCEVHandle &LHS, const SCEVHandle &RHS) {
- return LHS == RHS;
- }
- static bool isPod() { return false; }
- };
-
/// ScalarEvolution - This class is the main scalar evolution driver. Because
/// client code (intentionally) can't do much with the SCEV objects directly,
/// they must ask this class for services.
@@ -260,11 +177,11 @@ namespace llvm {
/// CouldNotCompute - This SCEV is used to represent unknown trip
/// counts and things.
- SCEVHandle CouldNotCompute;
+ const SCEV* CouldNotCompute;
/// Scalars - This is a cache of the scalars we have analyzed so far.
///
- std::map<SCEVCallbackVH, SCEVHandle> Scalars;
+ std::map<SCEVCallbackVH, const SCEV*> Scalars;
/// BackedgeTakenInfo - Information about the backedge-taken count
/// of a loop. This currently inclues an exact count and a maximum count.
@@ -272,19 +189,16 @@ namespace llvm {
struct BackedgeTakenInfo {
/// Exact - An expression indicating the exact backedge-taken count of
/// the loop if it is known, or a SCEVCouldNotCompute otherwise.
- SCEVHandle Exact;
+ const SCEV* Exact;
/// Exact - An expression indicating the least maximum backedge-taken
/// count of the loop that is known, or a SCEVCouldNotCompute.
- SCEVHandle Max;
+ const SCEV* Max;
- /*implicit*/ BackedgeTakenInfo(SCEVHandle exact) :
+ /*implicit*/ BackedgeTakenInfo(const SCEV* exact) :
Exact(exact), Max(exact) {}
- /*implicit*/ BackedgeTakenInfo(const SCEV *exact) :
- Exact(exact), Max(exact) {}
-
- BackedgeTakenInfo(SCEVHandle exact, SCEVHandle max) :
+ BackedgeTakenInfo(const SCEV* exact, const SCEV* max) :
Exact(exact), Max(max) {}
/// hasAnyInfo - Test whether this BackedgeTakenInfo contains any
@@ -314,30 +228,30 @@ namespace llvm {
/// createSCEV - We know that there is no SCEV for the specified value.
/// Analyze the expression.
- SCEVHandle createSCEV(Value *V);
+ const SCEV* createSCEV(Value *V);
/// createNodeForPHI - Provide the special handling we need to analyze PHI
/// SCEVs.
- SCEVHandle createNodeForPHI(PHINode *PN);
+ const SCEV* createNodeForPHI(PHINode *PN);
/// createNodeForGEP - Provide the special handling we need to analyze GEP
/// SCEVs.
- SCEVHandle createNodeForGEP(User *GEP);
+ const SCEV* createNodeForGEP(User *GEP);
/// ReplaceSymbolicValueWithConcrete - This looks up the computed SCEV value
/// for the specified instruction and replaces any references to the
/// symbolic value SymName with the specified value. This is used during
/// PHI resolution.
void ReplaceSymbolicValueWithConcrete(Instruction *I,
- const SCEVHandle &SymName,
- const SCEVHandle &NewVal);
+ const SCEV* SymName,
+ const SCEV* NewVal);
/// getBECount - Subtract the end and start values and divide by the step,
/// rounding up, to get the number of times the backedge is executed. Return
/// CouldNotCompute if an intermediate computation overflows.
- SCEVHandle getBECount(const SCEVHandle &Start,
- const SCEVHandle &End,
- const SCEVHandle &Step);
+ const SCEV* getBECount(const SCEV* Start,
+ const SCEV* End,
+ const SCEV* Step);
/// getBackedgeTakenInfo - Return the BackedgeTakenInfo for the given
/// loop, lazily computing new values if the loop hasn't been analyzed
@@ -375,7 +289,7 @@ namespace llvm {
/// ComputeLoadConstantCompareBackedgeTakenCount - Given an exit condition
/// of 'icmp op load X, cst', try to see if we can compute the trip count.
- SCEVHandle
+ const SCEV*
ComputeLoadConstantCompareBackedgeTakenCount(LoadInst *LI,
Constant *RHS,
const Loop *L,
@@ -386,18 +300,18 @@ namespace llvm {
/// try to evaluate a few iterations of the loop until we get the exit
/// condition gets a value of ExitWhen (true or false). If we cannot
/// evaluate the trip count of the loop, return CouldNotCompute.
- SCEVHandle ComputeBackedgeTakenCountExhaustively(const Loop *L, Value *Cond,
+ const SCEV* ComputeBackedgeTakenCountExhaustively(const Loop *L, Value *Cond,
bool ExitWhen);
/// HowFarToZero - Return the number of times a backedge comparing the
/// specified value to zero will execute. If not computable, return
/// CouldNotCompute.
- SCEVHandle HowFarToZero(const SCEV *V, const Loop *L);
+ const SCEV* HowFarToZero(const SCEV *V, const Loop *L);
/// HowFarToNonZero - Return the number of times a backedge checking the
/// specified value for nonzero will execute. If not computable, return
/// CouldNotCompute.
- SCEVHandle HowFarToNonZero(const SCEV *V, const Loop *L);
+ const SCEV* HowFarToNonZero(const SCEV *V, const Loop *L);
/// HowManyLessThans - Return the number of times a backedge containing the
/// specified less-than comparison will execute. If not computable, return
@@ -449,109 +363,115 @@ namespace llvm {
/// getSCEV - Return a SCEV expression handle for the full generality of the
/// specified expression.
- SCEVHandle getSCEV(Value *V);
-
- SCEVHandle getConstant(ConstantInt *V);
- SCEVHandle getConstant(const APInt& Val);
- SCEVHandle getConstant(const Type *Ty, uint64_t V, bool isSigned = false);
- SCEVHandle getTruncateExpr(const SCEVHandle &Op, const Type *Ty);
- SCEVHandle getZeroExtendExpr(const SCEVHandle &Op, const Type *Ty);
- SCEVHandle getSignExtendExpr(const SCEVHandle &Op, const Type *Ty);
- SCEVHandle getAnyExtendExpr(const SCEVHandle &Op, const Type *Ty);
- SCEVHandle getAddExpr(SmallVectorImpl<SCEVHandle> &Ops);
- SCEVHandle getAddExpr(const SCEVHandle &LHS, const SCEVHandle &RHS) {
- SmallVector<SCEVHandle, 2> Ops;
+ const SCEV* getSCEV(Value *V);
+
+ const SCEV* getConstant(ConstantInt *V);
+ const SCEV* getConstant(const APInt& Val);
+ const SCEV* getConstant(const Type *Ty, uint64_t V, bool isSigned = false);
+ const SCEV* getTruncateExpr(const SCEV* Op, const Type *Ty);
+ const SCEV* getZeroExtendExpr(const SCEV* Op, const Type *Ty);
+ const SCEV* getSignExtendExpr(const SCEV* Op, const Type *Ty);
+ const SCEV* getAnyExtendExpr(const SCEV* Op, const Type *Ty);
+ const SCEV* getAddExpr(SmallVectorImpl<const SCEV*> &Ops);
+ const SCEV* getAddExpr(const SCEV* LHS, const SCEV* RHS) {
+ SmallVector<const SCEV*, 2> Ops;
Ops.push_back(LHS);
Ops.push_back(RHS);
return getAddExpr(Ops);
}
- SCEVHandle getAddExpr(const SCEVHandle &Op0, const SCEVHandle &Op1,
- const SCEVHandle &Op2) {
- SmallVector<SCEVHandle, 3> Ops;
+ const SCEV* getAddExpr(const SCEV* Op0, const SCEV* Op1,
+ const SCEV* Op2) {
+ SmallVector<const SCEV*, 3> Ops;
Ops.push_back(Op0);
Ops.push_back(Op1);
Ops.push_back(Op2);
return getAddExpr(Ops);
}
- SCEVHandle getMulExpr(SmallVectorImpl<SCEVHandle> &Ops);
- SCEVHandle getMulExpr(const SCEVHandle &LHS, const SCEVHandle &RHS) {
- SmallVector<SCEVHandle, 2> Ops;
+ const SCEV* getMulExpr(SmallVectorImpl<const SCEV*> &Ops);
+ const SCEV* getMulExpr(const SCEV* LHS, const SCEV* RHS) {
+ SmallVector<const SCEV*, 2> Ops;
Ops.push_back(LHS);
Ops.push_back(RHS);
return getMulExpr(Ops);
}
- SCEVHandle getUDivExpr(const SCEVHandle &LHS, const SCEVHandle &RHS);
- SCEVHandle getAddRecExpr(const SCEVHandle &Start, const SCEVHandle &Step,
+ const SCEV* getUDivExpr(const SCEV* LHS, const SCEV* RHS);
+ const SCEV* getAddRecExpr(const SCEV* Start, const SCEV* Step,
const Loop *L);
- SCEVHandle getAddRecExpr(SmallVectorImpl<SCEVHandle> &Operands,
+ const SCEV* getAddRecExpr(SmallVectorImpl<const SCEV*> &Operands,
const Loop *L);
- SCEVHandle getAddRecExpr(const SmallVectorImpl<SCEVHandle> &Operands,
+ const SCEV* getAddRecExpr(const SmallVectorImpl<const SCEV*> &Operands,
const Loop *L) {
- SmallVector<SCEVHandle, 4> NewOp(Operands.begin(), Operands.end());
+ SmallVector<const SCEV*, 4> NewOp(Operands.begin(), Operands.end());
return getAddRecExpr(NewOp, L);
}
- SCEVHandle getSMaxExpr(const SCEVHandle &LHS, const SCEVHandle &RHS);
- SCEVHandle getSMaxExpr(SmallVectorImpl<SCEVHandle> &Operands);
- SCEVHandle getUMaxExpr(const SCEVHandle &LHS, const SCEVHandle &RHS);
- SCEVHandle getUMaxExpr(SmallVectorImpl<SCEVHandle> &Operands);
- SCEVHandle getSMinExpr(const SCEVHandle &LHS, const SCEVHandle &RHS);
- SCEVHandle getUMinExpr(const SCEVHandle &LHS, const SCEVHandle &RHS);
- SCEVHandle getUnknown(Value *V);
- SCEVHandle getCouldNotCompute();
+ const SCEV* getSMaxExpr(const SCEV* LHS, const SCEV* RHS);
+ const SCEV* getSMaxExpr(SmallVectorImpl<const SCEV*> &Operands);
+ const SCEV* getUMaxExpr(const SCEV* LHS, const SCEV* RHS);
+ const SCEV* getUMaxExpr(SmallVectorImpl<const SCEV*> &Operands);
+ const SCEV* getSMinExpr(const SCEV* LHS, const SCEV* RHS);
+ const SCEV* getUMinExpr(const SCEV* LHS, const SCEV* RHS);
+ const SCEV* getUnknown(Value *V);
+ const SCEV* getCouldNotCompute();
/// getNegativeSCEV - Return the SCEV object corresponding to -V.
///
- SCEVHandle getNegativeSCEV(const SCEVHandle &V);
+ const SCEV* getNegativeSCEV(const SCEV* V);
/// getNotSCEV - Return the SCEV object corresponding to ~V.
///
- SCEVHandle getNotSCEV(const SCEVHandle &V);
+ const SCEV* getNotSCEV(const SCEV* V);
/// getMinusSCEV - Return LHS-RHS.
///
- SCEVHandle getMinusSCEV(const SCEVHandle &LHS,
- const SCEVHandle &RHS);
+ const SCEV* getMinusSCEV(const SCEV* LHS,
+ const SCEV* RHS);
/// getTruncateOrZeroExtend - Return a SCEV corresponding to a conversion
/// of the input value to the specified type. If the type must be
/// extended, it is zero extended.
- SCEVHandle getTruncateOrZeroExtend(const SCEVHandle &V, const Type *Ty);
+ const SCEV* getTruncateOrZeroExtend(const SCEV* V, const Type *Ty);
/// getTruncateOrSignExtend - Return a SCEV corresponding to a conversion
/// of the input value to the specified type. If the type must be
/// extended, it is sign extended.
- SCEVHandle getTruncateOrSignExtend(const SCEVHandle &V, const Type *Ty);
+ const SCEV* getTruncateOrSignExtend(const SCEV* V, const Type *Ty);
/// getNoopOrZeroExtend - Return a SCEV corresponding to a conversion of
/// the input value to the specified type. If the type must be extended,
/// it is zero extended. The conversion must not be narrowing.
- SCEVHandle getNoopOrZeroExtend(const SCEVHandle &V, const Type *Ty);
+ const SCEV* getNoopOrZeroExtend(const SCEV* V, const Type *Ty);
/// getNoopOrSignExtend - Return a SCEV corresponding to a conversion of
/// the input value to the specified type. If the type must be extended,
/// it is sign extended. The conversion must not be narrowing.
- SCEVHandle getNoopOrSignExtend(const SCEVHandle &V, const Type *Ty);
+ const SCEV* getNoopOrSignExtend(const SCEV* V, const Type *Ty);
/// getNoopOrAnyExtend - Return a SCEV corresponding to a conversion of
/// the input value to the specified type. If the type must be extended,
/// it is extended with unspecified bits. The conversion must not be
/// narrowing.
- SCEVHandle getNoopOrAnyExtend(const SCEVHandle &V, const Type *Ty);
+ const SCEV* getNoopOrAnyExtend(const SCEV* V, const Type *Ty);
/// getTruncateOrNoop - Return a SCEV corresponding to a conversion of the
/// input value to the specified type. The conversion must not be
/// widening.
- SCEVHandle getTruncateOrNoop(const SCEVHandle &V, const Type *Ty);
+ const SCEV* getTruncateOrNoop(const SCEV* V, const Type *Ty);
/// getIntegerSCEV - Given an integer or FP type, create a constant for the
/// specified signed integer value and return a SCEV for the constant.
- SCEVHandle getIntegerSCEV(int Val, const Type *Ty);
+ const SCEV* getIntegerSCEV(int Val, const Type *Ty);
/// getUMaxFromMismatchedTypes - Promote the operands to the wider of
/// the types using zero-extension, and then perform a umax operation
/// with them.
- SCEVHandle getUMaxFromMismatchedTypes(const SCEVHandle &LHS,
- const SCEVHandle &RHS);
+ const SCEV* getUMaxFromMismatchedTypes(const SCEV* LHS,
+ const SCEV* RHS);
+
+ /// getUMinFromMismatchedTypes - Promote the operands to the wider of
+ /// the types using zero-extension, and then perform a umin operation
+ /// with them.
+ const SCEV* getUMinFromMismatchedTypes(const SCEV* LHS,
+ const SCEV* RHS);
/// hasSCEV - Return true if the SCEV for this value has already been
/// computed.
@@ -559,7 +479,7 @@ namespace llvm {
/// setSCEV - Insert the specified SCEV into the map of current SCEVs for
/// the specified value.
- void setSCEV(Value *V, const SCEVHandle &H);
+ void setSCEV(Value *V, const SCEV* H);
/// getSCEVAtScope - Return a SCEV expression handle for the specified value
/// at the specified scope in the program. The L value specifies a loop
@@ -571,11 +491,11 @@ namespace llvm {
///
/// In the case that a relevant loop exit value cannot be computed, the
/// original value V is returned.
- SCEVHandle getSCEVAtScope(const SCEV *S, const Loop *L);
+ const SCEV* getSCEVAtScope(const SCEV *S, const Loop *L);
/// getSCEVAtScope - This is a convenience function which does
/// getSCEVAtScope(getSCEV(V), L).
- SCEVHandle getSCEVAtScope(Value *V, const Loop *L);
+ const SCEV* getSCEVAtScope(Value *V, const Loop *L);
/// isLoopGuardedByCond - Test whether entry to the loop is protected by
/// a conditional between LHS and RHS. This is used to help avoid max
@@ -594,12 +514,12 @@ namespace llvm {
/// loop-invariant backedge-taken count (see
/// hasLoopInvariantBackedgeTakenCount).
///
- SCEVHandle getBackedgeTakenCount(const Loop *L);
+ const SCEV* getBackedgeTakenCount(const Loop *L);
/// getMaxBackedgeTakenCount - Similar to getBackedgeTakenCount, except
/// return the least SCEV value that is known never to be less than the
/// actual backedge taken count.
- SCEVHandle getMaxBackedgeTakenCount(const Loop *L);
+ const SCEV* getMaxBackedgeTakenCount(const Loop *L);
/// hasLoopInvariantBackedgeTakenCount - Return true if the specified loop
/// has an analyzable loop-invariant backedge-taken count.
@@ -615,15 +535,15 @@ namespace llvm {
/// guaranteed to end in (at every loop iteration). It is, at the same time,
/// the minimum number of times S is divisible by 2. For example, given {4,+,8}
/// it returns 2. If S is guaranteed to be 0, it returns the bitwidth of S.
- uint32_t GetMinTrailingZeros(const SCEVHandle &S);
+ uint32_t GetMinTrailingZeros(const SCEV* S);
/// GetMinLeadingZeros - Determine the minimum number of zero bits that S is
/// guaranteed to begin with (at every loop iteration).
- uint32_t GetMinLeadingZeros(const SCEVHandle &S);
+ uint32_t GetMinLeadingZeros(const SCEV* S);
/// GetMinSignBits - Determine the minimum number of sign bits that S is
/// guaranteed to begin with.
- uint32_t GetMinSignBits(const SCEVHandle &S);
+ uint32_t GetMinSignBits(const SCEV* S);
virtual bool runOnFunction(Function &F);
virtual void releaseMemory();
@@ -633,6 +553,23 @@ namespace llvm {
void print(std::ostream *OS, const Module* M = 0) const {
if (OS) print(*OS, M);
}
+
+ private:
+ // Uniquing tables.
+ std::map<ConstantInt*, SCEVConstant*> SCEVConstants;
+ std::map<std::pair<const SCEV*, const Type*>,
+ SCEVTruncateExpr*> SCEVTruncates;
+ std::map<std::pair<const SCEV*, const Type*>,
+ SCEVZeroExtendExpr*> SCEVZeroExtends;
+ std::map<std::pair<unsigned, std::vector<const SCEV*> >,
+ SCEVCommutativeExpr*> SCEVCommExprs;
+ std::map<std::pair<const SCEV*, const SCEV*>,
+ SCEVUDivExpr*> SCEVUDivs;
+ std::map<std::pair<const SCEV*, const Type*>,
+ SCEVSignExtendExpr*> SCEVSignExtends;
+ std::map<std::pair<const Loop *, std::vector<const SCEV*> >,
+ SCEVAddRecExpr*> SCEVAddRecExprs;
+ std::map<Value*, SCEVUnknown*> SCEVUnknowns;
};
}
diff --git a/include/llvm/Analysis/ScalarEvolutionExpander.h b/include/llvm/Analysis/ScalarEvolutionExpander.h
index b40fbf06f9c8..730c97fff4d7 100644
--- a/include/llvm/Analysis/ScalarEvolutionExpander.h
+++ b/include/llvm/Analysis/ScalarEvolutionExpander.h
@@ -28,7 +28,7 @@ namespace llvm {
/// memory.
struct SCEVExpander : public SCEVVisitor<SCEVExpander, Value*> {
ScalarEvolution &SE;
- std::map<SCEVHandle, AssertingVH<Value> > InsertedExpressions;
+ std::map<const SCEV*, AssertingVH<Value> > InsertedExpressions;
std::set<Value*> InsertedValues;
BasicBlock::iterator InsertPt;
@@ -77,12 +77,12 @@ namespace llvm {
/// expression into the program. The inserted code is inserted into the
/// SCEVExpander's current insertion point. If a type is specified, the
/// result will be expanded to have that type, with a cast if necessary.
- Value *expandCodeFor(SCEVHandle SH, const Type *Ty = 0);
+ Value *expandCodeFor(const SCEV* SH, const Type *Ty = 0);
/// expandCodeFor - Insert code to directly compute the specified SCEV
/// expression into the program. The inserted code is inserted into the
/// specified block.
- Value *expandCodeFor(SCEVHandle SH, const Type *Ty,
+ Value *expandCodeFor(const SCEV* SH, const Type *Ty,
BasicBlock::iterator IP) {
setInsertionPoint(IP);
return expandCodeFor(SH, Ty);
@@ -105,7 +105,8 @@ namespace llvm {
private:
/// expandAddToGEP - Expand a SCEVAddExpr with a pointer type into a GEP
/// instead of using ptrtoint+arithmetic+inttoptr.
- Value *expandAddToGEP(const SCEVHandle *op_begin, const SCEVHandle *op_end,
+ Value *expandAddToGEP(const SCEV* const *op_begin,
+ const SCEV* const *op_end,
const PointerType *PTy, const Type *Ty, Value *V);
Value *expand(const SCEV *S);
diff --git a/include/llvm/Analysis/ScalarEvolutionExpressions.h b/include/llvm/Analysis/ScalarEvolutionExpressions.h
index 28423569d2e3..8be1a934bc13 100644
--- a/include/llvm/Analysis/ScalarEvolutionExpressions.h
+++ b/include/llvm/Analysis/ScalarEvolutionExpressions.h
@@ -36,10 +36,8 @@ namespace llvm {
friend class ScalarEvolution;
ConstantInt *V;
- explicit SCEVConstant(ConstantInt *v, const ScalarEvolution* p) :
- SCEV(scConstant, p), V(v) {}
-
- virtual ~SCEVConstant();
+ explicit SCEVConstant(ConstantInt *v) :
+ SCEV(scConstant), V(v) {}
public:
ConstantInt *getValue() const { return V; }
@@ -53,8 +51,8 @@ namespace llvm {
virtual const Type *getType() const;
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const {
return this;
}
@@ -77,15 +75,13 @@ namespace llvm {
///
class SCEVCastExpr : public SCEV {
protected:
- SCEVHandle Op;
+ const SCEV* Op;
const Type *Ty;
- SCEVCastExpr(unsigned SCEVTy, const SCEVHandle &op, const Type *ty,
- const ScalarEvolution* p);
- virtual ~SCEVCastExpr();
+ SCEVCastExpr(unsigned SCEVTy, const SCEV* op, const Type *ty);
public:
- const SCEVHandle &getOperand() const { return Op; }
+ const SCEV* getOperand() const { return Op; }
virtual const Type *getType() const { return Ty; }
virtual bool isLoopInvariant(const Loop *L) const {
@@ -114,15 +110,13 @@ namespace llvm {
class SCEVTruncateExpr : public SCEVCastExpr {
friend class ScalarEvolution;
- SCEVTruncateExpr(const SCEVHandle &op, const Type *ty,
- const ScalarEvolution* p);
- virtual ~SCEVTruncateExpr();
+ SCEVTruncateExpr(const SCEV* op, const Type *ty);
public:
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const {
- SCEVHandle H = Op->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
+ const SCEV* H = Op->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
if (H == Op)
return this;
return SE.getTruncateExpr(H, Ty);
@@ -144,15 +138,13 @@ namespace llvm {
class SCEVZeroExtendExpr : public SCEVCastExpr {
friend class ScalarEvolution;
- SCEVZeroExtendExpr(const SCEVHandle &op, const Type *ty,
- const ScalarEvolution* p);
- virtual ~SCEVZeroExtendExpr();
+ SCEVZeroExtendExpr(const SCEV* op, const Type *ty);
public:
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const {
- SCEVHandle H = Op->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
+ const SCEV* H = Op->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
if (H == Op)
return this;
return SE.getZeroExtendExpr(H, Ty);
@@ -174,15 +166,13 @@ namespace llvm {
class SCEVSignExtendExpr : public SCEVCastExpr {
friend class ScalarEvolution;
- SCEVSignExtendExpr(const SCEVHandle &op, const Type *ty,
- const ScalarEvolution* p);
- virtual ~SCEVSignExtendExpr();
+ SCEVSignExtendExpr(const SCEV* op, const Type *ty);
public:
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const {
- SCEVHandle H = Op->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
+ const SCEV* H = Op->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
if (H == Op)
return this;
return SE.getSignExtendExpr(H, Ty);
@@ -204,22 +194,20 @@ namespace llvm {
///
class SCEVNAryExpr : public SCEV {
protected:
- SmallVector<SCEVHandle, 8> Operands;
+ SmallVector<const SCEV*, 8> Operands;
- SCEVNAryExpr(enum SCEVTypes T, const SmallVectorImpl<SCEVHandle> &ops,
- const ScalarEvolution* p)
- : SCEV(T, p), Operands(ops.begin(), ops.end()) {}
- virtual ~SCEVNAryExpr() {}
+ SCEVNAryExpr(enum SCEVTypes T, const SmallVectorImpl<const SCEV*> &ops)
+ : SCEV(T), Operands(ops.begin(), ops.end()) {}
public:
unsigned getNumOperands() const { return (unsigned)Operands.size(); }
- const SCEVHandle &getOperand(unsigned i) const {
+ const SCEV* getOperand(unsigned i) const {
assert(i < Operands.size() && "Operand index out of range!");
return Operands[i];
}
- const SmallVectorImpl<SCEVHandle> &getOperands() const { return Operands; }
- typedef SmallVectorImpl<SCEVHandle>::const_iterator op_iterator;
+ const SmallVectorImpl<const SCEV*> &getOperands() const { return Operands; }
+ typedef SmallVectorImpl<const SCEV*>::const_iterator op_iterator;
op_iterator op_begin() const { return Operands.begin(); }
op_iterator op_end() const { return Operands.end(); }
@@ -266,14 +254,12 @@ namespace llvm {
class SCEVCommutativeExpr : public SCEVNAryExpr {
protected:
SCEVCommutativeExpr(enum SCEVTypes T,
- const SmallVectorImpl<SCEVHandle> &ops,
- const ScalarEvolution* p)
- : SCEVNAryExpr(T, ops, p) {}
- ~SCEVCommutativeExpr();
+ const SmallVectorImpl<const SCEV*> &ops)
+ : SCEVNAryExpr(T, ops) {}
public:
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const;
virtual const char *getOperationStr() const = 0;
@@ -297,9 +283,8 @@ namespace llvm {
class SCEVAddExpr : public SCEVCommutativeExpr {
friend class ScalarEvolution;
- explicit SCEVAddExpr(const SmallVectorImpl<SCEVHandle> &ops,
- const ScalarEvolution* p)
- : SCEVCommutativeExpr(scAddExpr, ops, p) {
+ explicit SCEVAddExpr(const SmallVectorImpl<const SCEV*> &ops)
+ : SCEVCommutativeExpr(scAddExpr, ops) {
}
public:
@@ -318,9 +303,8 @@ namespace llvm {
class SCEVMulExpr : public SCEVCommutativeExpr {
friend class ScalarEvolution;
- explicit SCEVMulExpr(const SmallVectorImpl<SCEVHandle> &ops,
- const ScalarEvolution* p)
- : SCEVCommutativeExpr(scMulExpr, ops, p) {
+ explicit SCEVMulExpr(const SmallVectorImpl<const SCEV*> &ops)
+ : SCEVCommutativeExpr(scMulExpr, ops) {
}
public:
@@ -340,15 +324,14 @@ namespace llvm {
class SCEVUDivExpr : public SCEV {
friend class ScalarEvolution;
- SCEVHandle LHS, RHS;
- SCEVUDivExpr(const SCEVHandle &lhs, const SCEVHandle &rhs,
- const ScalarEvolution* p)
- : SCEV(scUDivExpr, p), LHS(lhs), RHS(rhs) {}
+ const SCEV* LHS;
+ const SCEV* RHS;
+ SCEVUDivExpr(const SCEV* lhs, const SCEV* rhs)
+ : SCEV(scUDivExpr), LHS(lhs), RHS(rhs) {}
- virtual ~SCEVUDivExpr();
public:
- const SCEVHandle &getLHS() const { return LHS; }
- const SCEVHandle &getRHS() const { return RHS; }
+ const SCEV* getLHS() const { return LHS; }
+ const SCEV* getRHS() const { return RHS; }
virtual bool isLoopInvariant(const Loop *L) const {
return LHS->isLoopInvariant(L) && RHS->isLoopInvariant(L);
@@ -359,11 +342,11 @@ namespace llvm {
RHS->hasComputableLoopEvolution(L);
}
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const {
- SCEVHandle L = LHS->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
- SCEVHandle R = RHS->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
+ const SCEV* L = LHS->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
+ const SCEV* R = RHS->replaceSymbolicValuesWithConcrete(Sym, Conc, SE);
if (L == LHS && R == RHS)
return this;
else
@@ -398,25 +381,23 @@ namespace llvm {
const Loop *L;
- SCEVAddRecExpr(const SmallVectorImpl<SCEVHandle> &ops, const Loop *l,
- const ScalarEvolution* p)
- : SCEVNAryExpr(scAddRecExpr, ops, p), L(l) {
+ SCEVAddRecExpr(const SmallVectorImpl<const SCEV*> &ops, const Loop *l)
+ : SCEVNAryExpr(scAddRecExpr, ops), L(l) {
for (size_t i = 0, e = Operands.size(); i != e; ++i)
assert(Operands[i]->isLoopInvariant(l) &&
"Operands of AddRec must be loop-invariant!");
}
- ~SCEVAddRecExpr();
public:
- const SCEVHandle &getStart() const { return Operands[0]; }
+ const SCEV* getStart() const { return Operands[0]; }
const Loop *getLoop() const { return L; }
/// getStepRecurrence - This method constructs and returns the recurrence
/// indicating how much this expression steps by. If this is a polynomial
/// of degree N, it returns a chrec of degree N-1.
- SCEVHandle getStepRecurrence(ScalarEvolution &SE) const {
+ const SCEV* getStepRecurrence(ScalarEvolution &SE) const {
if (isAffine()) return getOperand(1);
- return SE.getAddRecExpr(SmallVector<SCEVHandle, 3>(op_begin()+1,op_end()),
+ return SE.getAddRecExpr(SmallVector<const SCEV*, 3>(op_begin()+1,op_end()),
getLoop());
}
@@ -444,7 +425,7 @@ namespace llvm {
/// evaluateAtIteration - Return the value of this chain of recurrences at
/// the specified iteration number.
- SCEVHandle evaluateAtIteration(SCEVHandle It, ScalarEvolution &SE) const;
+ const SCEV* evaluateAtIteration(const SCEV* It, ScalarEvolution &SE) const;
/// getNumIterationsInRange - Return the number of iterations of this loop
/// that produce values in the specified constant range. Another way of
@@ -452,11 +433,11 @@ namespace llvm {
/// value is not in the condition, thus computing the exit count. If the
/// iteration count can't be computed, an instance of SCEVCouldNotCompute is
/// returned.
- SCEVHandle getNumIterationsInRange(ConstantRange Range,
+ const SCEV* getNumIterationsInRange(ConstantRange Range,
ScalarEvolution &SE) const;
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const;
virtual void print(raw_ostream &OS) const;
@@ -475,9 +456,8 @@ namespace llvm {
class SCEVSMaxExpr : public SCEVCommutativeExpr {
friend class ScalarEvolution;
- explicit SCEVSMaxExpr(const SmallVectorImpl<SCEVHandle> &ops,
- const ScalarEvolution* p)
- : SCEVCommutativeExpr(scSMaxExpr, ops, p) {
+ explicit SCEVSMaxExpr(const SmallVectorImpl<const SCEV*> &ops)
+ : SCEVCommutativeExpr(scSMaxExpr, ops) {
}
public:
@@ -497,9 +477,8 @@ namespace llvm {
class SCEVUMaxExpr : public SCEVCommutativeExpr {
friend class ScalarEvolution;
- explicit SCEVUMaxExpr(const SmallVectorImpl<SCEVHandle> &ops,
- const ScalarEvolution* p)
- : SCEVCommutativeExpr(scUMaxExpr, ops, p) {
+ explicit SCEVUMaxExpr(const SmallVectorImpl<const SCEV*> &ops)
+ : SCEVCommutativeExpr(scUMaxExpr, ops) {
}
public:
@@ -522,11 +501,9 @@ namespace llvm {
friend class ScalarEvolution;
Value *V;
- explicit SCEVUnknown(Value *v, const ScalarEvolution* p) :
- SCEV(scUnknown, p), V(v) {}
-
- protected:
- ~SCEVUnknown();
+ explicit SCEVUnknown(Value *v) :
+ SCEV(scUnknown), V(v) {}
+
public:
Value *getValue() const { return V; }
@@ -535,8 +512,8 @@ namespace llvm {
return false; // not computable
}
- SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym,
- const SCEVHandle &Conc,
+ const SCEV* replaceSymbolicValuesWithConcrete(const SCEV* Sym,
+ const SCEV* Conc,
ScalarEvolution &SE) const {
if (&*Sym == this) return Conc;
return this;
diff --git a/include/llvm/CodeGen/BinaryObject.h b/include/llvm/CodeGen/BinaryObject.h
index 0780cd6ab4f4..4b66fe85678c 100644
--- a/include/llvm/CodeGen/BinaryObject.h
+++ b/include/llvm/CodeGen/BinaryObject.h
@@ -61,6 +61,11 @@ public:
return Relocations;
}
+ /// hasRelocations - Return true if 'Relocations' is not empty
+ bool hasRelocations() const {
+ return !Relocations.empty();
+ }
+
/// emitByte - This callback is invoked when a byte needs to be
/// written to the data stream.
inline void emitByte(uint8_t B) {
@@ -317,6 +322,7 @@ public:
void addRelocation(const MachineRelocation& relocation) {
Relocations.push_back(relocation);
}
+
};
} // end namespace llvm
diff --git a/include/llvm/Intrinsics.td b/include/llvm/Intrinsics.td
index bce3ce098f1b..5ed2f7734a75 100644
--- a/include/llvm/Intrinsics.td
+++ b/include/llvm/Intrinsics.td
@@ -116,6 +116,7 @@ def llvm_v2i64_ty : LLVMType<v2i64>; // 2 x i64
def llvm_v2i32_ty : LLVMType<v2i32>; // 2 x i32
def llvm_v1i64_ty : LLVMType<v1i64>; // 1 x i64
def llvm_v4i32_ty : LLVMType<v4i32>; // 4 x i32
+def llvm_v2f32_ty : LLVMType<v2f32>; // 2 x float
def llvm_v4f32_ty : LLVMType<v4f32>; // 4 x float
def llvm_v2f64_ty : LLVMType<v2f64>; // 2 x double
diff --git a/include/llvm/IntrinsicsARM.td b/include/llvm/IntrinsicsARM.td
index e574938c72e3..a73dc458025b 100644
--- a/include/llvm/IntrinsicsARM.td
+++ b/include/llvm/IntrinsicsARM.td
@@ -19,3 +19,298 @@ let TargetPrefix = "arm" in { // All intrinsics start with "llvm.arm.".
def int_arm_thread_pointer : GCCBuiltin<"__builtin_thread_pointer">,
Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
}
+
+//===----------------------------------------------------------------------===//
+// Advanced SIMD (NEON)
+
+let TargetPrefix = "arm" in { // All intrinsics start with "llvm.arm.".
+
+ // The following classes do not correspond directly to GCC builtins.
+ class Neon_1Arg_Intrinsic
+ : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
+ class Neon_1Arg_Float_Intrinsic
+ : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
+ class Neon_1Arg_Narrow_Intrinsic
+ : Intrinsic<[llvm_anyint_ty],
+ [LLVMExtendedElementVectorType<0>], [IntrNoMem]>;
+ class Neon_1Arg_Long_Intrinsic
+ : Intrinsic<[llvm_anyint_ty],
+ [LLVMTruncatedElementVectorType<0>], [IntrNoMem]>;
+ class Neon_2Arg_Intrinsic
+ : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
+ [IntrNoMem]>;
+ class Neon_2Arg_Float_Intrinsic
+ : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
+ [IntrNoMem]>;
+ class Neon_2Arg_Narrow_Intrinsic
+ : Intrinsic<[llvm_anyint_ty],
+ [LLVMExtendedElementVectorType<0>,
+ LLVMExtendedElementVectorType<0>],
+ [IntrNoMem]>;
+ class Neon_2Arg_Long_Intrinsic
+ : Intrinsic<[llvm_anyint_ty],
+ [LLVMTruncatedElementVectorType<0>,
+ LLVMTruncatedElementVectorType<0>],
+ [IntrNoMem]>;
+ class Neon_2Arg_Wide_Intrinsic
+ : Intrinsic<[llvm_anyint_ty],
+ [LLVMMatchType<0>, LLVMTruncatedElementVectorType<0>],
+ [IntrNoMem]>;
+ class Neon_3Arg_Intrinsic
+ : Intrinsic<[llvm_anyint_ty],
+ [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
+ [IntrNoMem]>;
+ class Neon_3Arg_Long_Intrinsic
+ : Intrinsic<[llvm_anyint_ty],
+ [LLVMMatchType<0>,
+ LLVMTruncatedElementVectorType<0>,
+ LLVMTruncatedElementVectorType<0>],
+ [IntrNoMem]>;
+ class Neon_CvtFxToFP_Intrinsic
+ : Intrinsic<[llvm_anyfloat_ty], [llvm_anyint_ty, llvm_i32_ty], [IntrNoMem]>;
+ class Neon_CvtFPToFx_Intrinsic
+ : Intrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty, llvm_i32_ty], [IntrNoMem]>;
+}
+
+// Arithmetic ops
+
+let Properties = [IntrNoMem, Commutative] in {
+
+ // Vector Add.
+ def int_arm_neon_vhadds : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vhaddu : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vrhadds : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vrhaddu : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vqadds : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vqaddu : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vaddhn : Neon_2Arg_Narrow_Intrinsic;
+ def int_arm_neon_vraddhn : Neon_2Arg_Narrow_Intrinsic;
+ def int_arm_neon_vaddls : Neon_2Arg_Long_Intrinsic;
+ def int_arm_neon_vaddlu : Neon_2Arg_Long_Intrinsic;
+ def int_arm_neon_vaddws : Neon_2Arg_Wide_Intrinsic;
+ def int_arm_neon_vaddwu : Neon_2Arg_Wide_Intrinsic;
+
+ // Vector Multiply.
+ def int_arm_neon_vmulp : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vqdmulh : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vqrdmulh : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vmulls : Neon_2Arg_Long_Intrinsic;
+ def int_arm_neon_vmullu : Neon_2Arg_Long_Intrinsic;
+ def int_arm_neon_vmullp : Neon_2Arg_Long_Intrinsic;
+ def int_arm_neon_vqdmull : Neon_2Arg_Long_Intrinsic;
+
+ // Vector Multiply and Accumulate/Subtract.
+ def int_arm_neon_vmlals : Neon_3Arg_Long_Intrinsic;
+ def int_arm_neon_vmlalu : Neon_3Arg_Long_Intrinsic;
+ def int_arm_neon_vmlsls : Neon_3Arg_Long_Intrinsic;
+ def int_arm_neon_vmlslu : Neon_3Arg_Long_Intrinsic;
+ def int_arm_neon_vqdmlal : Neon_3Arg_Long_Intrinsic;
+ def int_arm_neon_vqdmlsl : Neon_3Arg_Long_Intrinsic;
+
+ // Vector Maximum.
+ def int_arm_neon_vmaxs : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vmaxu : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vmaxf : Neon_2Arg_Float_Intrinsic;
+
+ // Vector Minimum.
+ def int_arm_neon_vmins : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vminu : Neon_2Arg_Intrinsic;
+ def int_arm_neon_vminf : Neon_2Arg_Float_Intrinsic;
+
+ // Vector Reciprocal Step.
+ def int_arm_neon_vrecps : Neon_2Arg_Float_Intrinsic;
+
+ // Vector Reciprocal Square Root Step.
+ def int_arm_neon_vrsqrts : Neon_2Arg_Float_Intrinsic;
+}
+
+// Vector Subtract.
+def int_arm_neon_vhsubs : Neon_2Arg_Intrinsic;
+def int_arm_neon_vhsubu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vqsubs : Neon_2Arg_Intrinsic;
+def int_arm_neon_vqsubu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vsubhn : Neon_2Arg_Narrow_Intrinsic;
+def int_arm_neon_vrsubhn : Neon_2Arg_Narrow_Intrinsic;
+def int_arm_neon_vsubls : Neon_2Arg_Long_Intrinsic;
+def int_arm_neon_vsublu : Neon_2Arg_Long_Intrinsic;
+def int_arm_neon_vsubws : Neon_2Arg_Wide_Intrinsic;
+def int_arm_neon_vsubwu : Neon_2Arg_Wide_Intrinsic;
+
+// Vector Absolute Compare.
+let TargetPrefix = "arm" in {
+ def int_arm_neon_vacged : Intrinsic<[llvm_v2i32_ty],
+ [llvm_v2f32_ty, llvm_v2f32_ty],
+ [IntrNoMem]>;
+ def int_arm_neon_vacgeq : Intrinsic<[llvm_v4i32_ty],
+ [llvm_v4f32_ty, llvm_v4f32_ty],
+ [IntrNoMem]>;
+ def int_arm_neon_vacgtd : Intrinsic<[llvm_v2i32_ty],
+ [llvm_v2f32_ty, llvm_v2f32_ty],
+ [IntrNoMem]>;
+ def int_arm_neon_vacgtq : Intrinsic<[llvm_v4i32_ty],
+ [llvm_v4f32_ty, llvm_v4f32_ty],
+ [IntrNoMem]>;
+}
+
+// Vector Absolute Differences.
+def int_arm_neon_vabds : Neon_2Arg_Intrinsic;
+def int_arm_neon_vabdu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vabdf : Neon_2Arg_Float_Intrinsic;
+def int_arm_neon_vabdls : Neon_2Arg_Long_Intrinsic;
+def int_arm_neon_vabdlu : Neon_2Arg_Long_Intrinsic;
+
+// Vector Absolute Difference and Accumulate.
+def int_arm_neon_vabas : Neon_3Arg_Intrinsic;
+def int_arm_neon_vabau : Neon_3Arg_Intrinsic;
+def int_arm_neon_vabals : Neon_3Arg_Long_Intrinsic;
+def int_arm_neon_vabalu : Neon_3Arg_Long_Intrinsic;
+
+// Vector Pairwise Add.
+def int_arm_neon_vpaddi : Neon_2Arg_Intrinsic;
+def int_arm_neon_vpaddf : Neon_2Arg_Float_Intrinsic;
+
+// Vector Pairwise Add Long.
+// Note: This is different than the other "long" NEON intrinsics because
+// the result vector has half as many elements as the source vector.
+// The source and destination vector types must be specified separately.
+let TargetPrefix = "arm" in {
+ def int_arm_neon_vpaddls : Intrinsic<[llvm_anyint_ty], [llvm_anyint_ty],
+ [IntrNoMem]>;
+ def int_arm_neon_vpaddlu : Intrinsic<[llvm_anyint_ty], [llvm_anyint_ty],
+ [IntrNoMem]>;
+}
+
+// Vector Pairwise Add and Accumulate Long.
+// Note: This is similar to vpaddl but the destination vector also appears
+// as the first argument.
+let TargetPrefix = "arm" in {
+ def int_arm_neon_vpadals : Intrinsic<[llvm_anyint_ty],
+ [LLVMMatchType<0>, llvm_anyint_ty],
+ [IntrNoMem]>;
+ def int_arm_neon_vpadalu : Intrinsic<[llvm_anyint_ty],
+ [LLVMMatchType<0>, llvm_anyint_ty],
+ [IntrNoMem]>;
+}
+
+// Vector Pairwise Maximum and Minimum.
+def int_arm_neon_vpmaxs : Neon_2Arg_Intrinsic;
+def int_arm_neon_vpmaxu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vpmaxf : Neon_2Arg_Float_Intrinsic;
+def int_arm_neon_vpmins : Neon_2Arg_Intrinsic;
+def int_arm_neon_vpminu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vpminf : Neon_2Arg_Float_Intrinsic;
+
+// Vector Shifts:
+//
+// The various saturating and rounding vector shift operations need to be
+// represented by intrinsics in LLVM, and even the basic VSHL variable shift
+// operation cannot be safely translated to LLVM's shift operators. VSHL can
+// be used for both left and right shifts, or even combinations of the two,
+// depending on the signs of the shift amounts. It also has well-defined
+// behavior for shift amounts that LLVM leaves undefined. Only basic shifts
+// by constants can be represented with LLVM's shift operators.
+//
+// The shift counts for these intrinsics are always vectors, even for constant
+// shifts, where the constant is replicated. For consistency with VSHL (and
+// other variable shift instructions), left shifts have positive shift counts
+// and right shifts have negative shift counts. This convention is also used
+// for constant right shift intrinsics, and to help preserve sanity, the
+// intrinsic names use "shift" instead of either "shl" or "shr". Where
+// applicable, signed and unsigned versions of the intrinsics are
+// distinguished with "s" and "u" suffixes. A few NEON shift instructions,
+// such as VQSHLU, take signed operands but produce unsigned results; these
+// use a "su" suffix.
+
+// Vector Shift.
+def int_arm_neon_vshifts : Neon_2Arg_Intrinsic;
+def int_arm_neon_vshiftu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vshiftls : Neon_2Arg_Long_Intrinsic;
+def int_arm_neon_vshiftlu : Neon_2Arg_Long_Intrinsic;
+def int_arm_neon_vshiftn : Neon_2Arg_Narrow_Intrinsic;
+
+// Vector Rounding Shift.
+def int_arm_neon_vrshifts : Neon_2Arg_Intrinsic;
+def int_arm_neon_vrshiftu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vrshiftn : Neon_2Arg_Narrow_Intrinsic;
+
+// Vector Saturating Shift.
+def int_arm_neon_vqshifts : Neon_2Arg_Intrinsic;
+def int_arm_neon_vqshiftu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vqshiftsu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vqshiftns : Neon_2Arg_Narrow_Intrinsic;
+def int_arm_neon_vqshiftnu : Neon_2Arg_Narrow_Intrinsic;
+def int_arm_neon_vqshiftnsu : Neon_2Arg_Narrow_Intrinsic;
+
+// Vector Saturating Rounding Shift.
+def int_arm_neon_vqrshifts : Neon_2Arg_Intrinsic;
+def int_arm_neon_vqrshiftu : Neon_2Arg_Intrinsic;
+def int_arm_neon_vqrshiftns : Neon_2Arg_Narrow_Intrinsic;
+def int_arm_neon_vqrshiftnu : Neon_2Arg_Narrow_Intrinsic;
+def int_arm_neon_vqrshiftnsu : Neon_2Arg_Narrow_Intrinsic;
+
+// Vector Shift and Insert.
+def int_arm_neon_vshiftins : Neon_3Arg_Intrinsic;
+
+// Vector Absolute Value and Saturating Absolute Value.
+def int_arm_neon_vabs : Neon_1Arg_Intrinsic;
+def int_arm_neon_vabsf : Neon_1Arg_Float_Intrinsic;
+def int_arm_neon_vqabs : Neon_1Arg_Intrinsic;
+
+// Vector Saturating Negate.
+def int_arm_neon_vqneg : Neon_1Arg_Intrinsic;
+
+// Vector Count Leading Sign/Zero Bits.
+def int_arm_neon_vcls : Neon_1Arg_Intrinsic;
+def int_arm_neon_vclz : Neon_1Arg_Intrinsic;
+
+// Vector Count One Bits.
+def int_arm_neon_vcnt : Neon_1Arg_Intrinsic;
+
+// Vector Reciprocal Estimate.
+def int_arm_neon_vrecpe : Neon_1Arg_Intrinsic;
+def int_arm_neon_vrecpef : Neon_1Arg_Float_Intrinsic;
+
+// Vector Reciprocal Square Root Estimate.
+def int_arm_neon_vrsqrte : Neon_1Arg_Intrinsic;
+def int_arm_neon_vrsqrtef : Neon_1Arg_Float_Intrinsic;
+
+// Vector Conversions Between Floating-point and Fixed-point.
+def int_arm_neon_vcvtfp2fxs : Neon_CvtFPToFx_Intrinsic;
+def int_arm_neon_vcvtfp2fxu : Neon_CvtFPToFx_Intrinsic;
+def int_arm_neon_vcvtfxs2fp : Neon_CvtFxToFP_Intrinsic;
+def int_arm_neon_vcvtfxu2fp : Neon_CvtFxToFP_Intrinsic;
+
+// Narrowing and Lengthening Vector Moves.
+def int_arm_neon_vmovn : Neon_1Arg_Narrow_Intrinsic;
+def int_arm_neon_vqmovns : Neon_1Arg_Narrow_Intrinsic;
+def int_arm_neon_vqmovnu : Neon_1Arg_Narrow_Intrinsic;
+def int_arm_neon_vqmovnsu : Neon_1Arg_Narrow_Intrinsic;
+def int_arm_neon_vmovls : Neon_1Arg_Long_Intrinsic;
+def int_arm_neon_vmovlu : Neon_1Arg_Long_Intrinsic;
+
+let TargetPrefix = "arm" in {
+
+ // De-interleaving vector loads from N-element structures.
+ def int_arm_neon_vld3i : Intrinsic<[llvm_anyint_ty],
+ [llvm_ptr_ty], [IntrReadArgMem]>;
+ def int_arm_neon_vld3f : Intrinsic<[llvm_anyfloat_ty],
+ [llvm_ptr_ty], [IntrReadArgMem]>;
+ def int_arm_neon_vld4i : Intrinsic<[llvm_anyint_ty],
+ [llvm_ptr_ty], [IntrReadArgMem]>;
+ def int_arm_neon_vld4f : Intrinsic<[llvm_anyfloat_ty],
+ [llvm_ptr_ty], [IntrReadArgMem]>;
+
+ // Interleaving vector stores from N-element structures.
+ def int_arm_neon_vst3i : Intrinsic<[llvm_void_ty],
+ [llvm_anyint_ty, llvm_ptr_ty],
+ [IntrWriteArgMem]>;
+ def int_arm_neon_vst3f : Intrinsic<[llvm_void_ty],
+ [llvm_anyfloat_ty, llvm_ptr_ty],
+ [IntrWriteArgMem]>;
+ def int_arm_neon_vst4i : Intrinsic<[llvm_void_ty],
+ [llvm_anyint_ty, llvm_ptr_ty],
+ [IntrWriteArgMem]>;
+ def int_arm_neon_vst4f : Intrinsic<[llvm_void_ty],
+ [llvm_anyfloat_ty, llvm_ptr_ty],
+ [IntrWriteArgMem]>;
+}
diff --git a/include/llvm/Support/Timer.h b/include/llvm/Support/Timer.h
index 584199f44007..9a8247071c34 100644
--- a/include/llvm/Support/Timer.h
+++ b/include/llvm/Support/Timer.h
@@ -152,6 +152,7 @@ class TimerGroup {
unsigned NumTimers;
std::vector<Timer> TimersToPrint;
public:
+ TimerGroup() : Name("Miscellaneous Ungrouped Timers"), NumTimers(0) {}
explicit TimerGroup(const std::string &name) : Name(name), NumTimers(0) {}
~TimerGroup() {
assert(NumTimers == 0 &&
diff --git a/include/llvm/Target/TargetELFWriterInfo.h b/include/llvm/Target/TargetELFWriterInfo.h
index f7e3392577d9..c1f54d201a0e 100644
--- a/include/llvm/Target/TargetELFWriterInfo.h
+++ b/include/llvm/Target/TargetELFWriterInfo.h
@@ -78,11 +78,32 @@ namespace llvm {
/// Symbol Table Info
unsigned getSymTabEntrySize() const { return is64Bit ? 24 : 16; }
- unsigned getSymTabAlignment() const { return is64Bit ? 8 : 4; }
+
+ /// getPrefELFAlignment - Returns the preferred alignment for ELF. This
+ /// is used to align some sections.
+ unsigned getPrefELFAlignment() const { return is64Bit ? 8 : 4; }
+
+ /// getRelocationEntrySize - Entry size used in the relocation section
+ unsigned getRelocationEntrySize() const {
+ return is64Bit ? (hasRelocationAddend() ? 24 : 16)
+ : (hasRelocationAddend() ? 12 : 8);
+ }
/// getFunctionAlignment - Returns the alignment for function 'F', targets
/// with different alignment constraints should overload this method
virtual unsigned getFunctionAlignment(const Function *F) const;
+
+ /// getRelocationType - Returns the target specific ELF Relocation type.
+ /// 'MachineRelTy' contains the object code independent relocation type
+ virtual unsigned getRelocationType(unsigned MachineRelTy) const = 0;
+
+ /// hasRelocationAddend - True if the target uses an addend in the
+ /// ELF relocation entry.
+ virtual bool hasRelocationAddend() const = 0;
+
+ /// getAddendForRelTy - Gets the addend value for an ELF relocation entry
+ /// based on the target relocation type. If addend is not used returns 0.
+ virtual long int getAddendForRelTy(unsigned RelTy) const = 0;
};
} // end llvm namespace