re-commit r109220, the compile error has already been fixed

Simplifying use_iterators by dereferencing
is not a good idea. The codebase does not depend
in this any more, and it may introduce hidden
runtime cost. If you get compile errors, please
dereference your iterator before passing to cast<>
(and friends).

Also: please consider caching the result of
operator* and reusing that instead of dereferencing
many times.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109425 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Gabor Greif 2010-07-26 18:48:07 +00:00
parent cfa7fb6df5
commit 05006e2813
2 changed files with 5 additions and 24 deletions

View File

@ -318,6 +318,11 @@ expose new optimization opportunities:</p>
To be portable across releases, resort to <tt>CallSite</tt> and the
high-level accessors, such as <tt>getCalledValue</tt> and <tt>setUnwindDest</tt>.
</li>
<li>
You can no longer pass use_iterators directly to cast<> (and similar), because
these routines tend to perform costly dereference operations more than once. You
have to dereference the iterators yourself and pass them in.
</li>
</ul>

View File

@ -210,30 +210,6 @@ public:
unsigned getOperandNo() const;
};
template<> struct simplify_type<value_use_iterator<User> > {
typedef User* SimpleType;
static SimpleType getSimplifiedValue(const value_use_iterator<User> &Val) {
return *Val;
}
};
template<> struct simplify_type<const value_use_iterator<User> >
: public simplify_type<value_use_iterator<User> > {};
template<> struct simplify_type<value_use_iterator<const User> > {
typedef const User* SimpleType;
static SimpleType getSimplifiedValue(const
value_use_iterator<const User> &Val) {
return *Val;
}
};
template<> struct simplify_type<const value_use_iterator<const User> >
: public simplify_type<value_use_iterator<const User> > {};
} // End llvm namespace
#endif