[PatternMatch] Improve m_Deferred() documentation (NFC)
authorNikita Popov <nikita.ppv@gmail.com>
Sat, 24 Apr 2021 18:58:33 +0000 (20:58 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Sat, 24 Apr 2021 19:00:24 +0000 (21:00 +0200)
m_Deferred() has nothing to do with commutative matchers, it needs
to be used whenever the value to match is determinde as part of
the same match expression.

llvm/include/llvm/IR/PatternMatch.h

index cdc8d27..a67e666 100644 (file)
@@ -811,7 +811,12 @@ template <typename Class> struct deferredval_ty {
   template <typename ITy> bool match(ITy *const V) { return V == Val; }
 };
 
-/// A commutative-friendly version of m_Specific().
+/// Like m_Specific(), but works if the specific value to match is determined
+/// as part of the same match() expression. For example:
+/// m_Add(m_Value(X), m_Specific(X)) is incorrect, because m_Specific() will
+/// bind X before the pattern match starts.
+/// m_Add(m_Value(X), m_Deferred(X)) is correct, and will check against
+/// whichever value m_Value(X) populated.
 inline deferredval_ty<Value> m_Deferred(Value *const &V) { return V; }
 inline deferredval_ty<const Value> m_Deferred(const Value *const &V) {
   return V;