diff options
author | Gabor Greif <ggreif@gmail.com> | 2009-02-11 22:09:00 +0000 |
---|---|---|
committer | Gabor Greif <ggreif@gmail.com> | 2009-02-11 22:09:00 +0000 |
commit | 6cd093b56e80ed54a2062e789937a096ba3afe56 (patch) | |
tree | 9becf89b4e05b2bbcbec90863ad5517d33625517 | |
parent | fbef3101a50dac85ac18e09a304b187a4109d7ed (diff) | |
download | llvm-6cd093b56e80ed54a2062e789937a096ba3afe56.tar.gz llvm-6cd093b56e80ed54a2062e789937a096ba3afe56.tar.bz2 llvm-6cd093b56e80ed54a2062e789937a096ba3afe56.tar.xz |
Fill in a glaring omission in derived User classes, namely
add efficient versions of op_begin and op_end. Up to now always those from User have been
called, which in most cases follow an indirection (OperandList) even if the exact Instruction
type is known.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64331 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/OperandTraits.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/include/llvm/OperandTraits.h b/include/llvm/OperandTraits.h index 4c1c0382c8..a4b634c762 100644 --- a/include/llvm/OperandTraits.h +++ b/include/llvm/OperandTraits.h @@ -119,6 +119,10 @@ struct HungoffOperandTraits { public: \ inline VALUECLASS *getOperand(unsigned) const; \ inline void setOperand(unsigned, VALUECLASS*); \ + inline op_iterator op_begin(); \ + inline const_op_iterator op_begin() const; \ + inline op_iterator op_end(); \ + inline const_op_iterator op_end() const; \ protected: \ template <unsigned> inline Use &Op(); \ template <unsigned> inline const Use &Op() const; \ @@ -127,6 +131,18 @@ struct HungoffOperandTraits { /// Macro for generating out-of-class operand accessor definitions #define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS) \ +CLASS::op_iterator CLASS::op_begin() { \ + return OperandTraits<CLASS>::op_begin(this); \ +} \ +CLASS::const_op_iterator CLASS::op_begin() const { \ + return OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this)); \ +} \ +CLASS::op_iterator CLASS::op_end() { \ + return OperandTraits<CLASS>::op_end(this); \ +} \ +CLASS::const_op_iterator CLASS::op_end() const { \ + return OperandTraits<CLASS>::op_end(const_cast<CLASS*>(this)); \ +} \ VALUECLASS *CLASS::getOperand(unsigned i_nocapture) const { \ assert(i_nocapture < OperandTraits<CLASS>::operands(this) \ && "getOperand() out of range!"); \ @@ -153,6 +169,18 @@ template <unsigned Idx_nocapture> const Use &CLASS::Op() const { \ /// Macro for generating out-of-class operand accessor /// definitions with casted result #define DEFINE_TRANSPARENT_CASTED_OPERAND_ACCESSORS(CLASS, VALUECLASS) \ +CLASS::op_iterator CLASS::op_begin() { \ + return OperandTraits<CLASS>::op_begin(this); \ +} \ +CLASS::const_op_iterator CLASS::op_begin() const { \ + return OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this)); \ +} \ +CLASS::op_iterator CLASS::op_end() { \ + return OperandTraits<CLASS>::op_end(this); \ +} \ +CLASS::const_op_iterator CLASS::op_end() const { \ + return OperandTraits<CLASS>::op_end(const_cast<CLASS*>(this)); \ +} \ VALUECLASS *CLASS::getOperand(unsigned i_nocapture) const { \ assert(i_nocapture < OperandTraits<CLASS>::operands(this) \ && "getOperand() out of range!"); \ |