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.

llvm-svn: 109425
This commit is contained in:
Gabor Greif 2010-07-26 18:48:07 +00:00
parent 12ab6162bf
commit 7ae22e4471
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