mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:16:43 +00:00
[VPlan] Add m_Deferred. NFC (#133736)
This copies over the implementation of m_Deferred which allows matching values that were bound in the pattern, and uses it for the (X && Y) || (X && !Y) -> X simplifcation.
This commit is contained in:
parent
c63246645e
commit
b739a3cb65
@ -66,6 +66,24 @@ struct specificval_ty {
|
||||
|
||||
inline specificval_ty m_Specific(const VPValue *VPV) { return VPV; }
|
||||
|
||||
/// Stores a reference to the VPValue *, not the VPValue * itself,
|
||||
/// thus can be used in commutative matchers.
|
||||
struct deferredval_ty {
|
||||
VPValue *const &Val;
|
||||
|
||||
deferredval_ty(VPValue *const &V) : Val(V) {}
|
||||
|
||||
bool match(VPValue *const V) const { return V == Val; }
|
||||
};
|
||||
|
||||
/// Like m_Specific(), but works if the specific value to match is determined
|
||||
/// as part of the same match() expression. For example:
|
||||
/// m_Mul(m_VPValue(X), m_Specific(X)) is incorrect, because m_Specific() will
|
||||
/// bind X before the pattern match starts.
|
||||
/// m_Mul(m_VPValue(X), m_Deferred(X)) is correct, and will check against
|
||||
/// whichever value m_VPValue(X) populated.
|
||||
inline deferredval_ty m_Deferred(VPValue *const &V) { return V; }
|
||||
|
||||
/// Match a specified integer value or vector of all elements of that
|
||||
/// value. \p BitWidth optionally specifies the bitwidth the matched constant
|
||||
/// must have. If it is 0, the matched constant can have any bitwidth.
|
||||
|
@ -1053,11 +1053,10 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
|
||||
// TODO: Split up into simpler, modular combines: (X && Y) || (X && Z) into X
|
||||
// && (Y || Z) and (X || !X) into true. This requires queuing newly created
|
||||
// recipes to be visited during simplification.
|
||||
VPValue *X, *Y, *X1, *Y1;
|
||||
VPValue *X, *Y;
|
||||
if (match(&R,
|
||||
m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
|
||||
m_LogicalAnd(m_VPValue(X1), m_Not(m_VPValue(Y1))))) &&
|
||||
X == X1 && Y == Y1) {
|
||||
m_LogicalAnd(m_Deferred(X), m_Not(m_Deferred(Y)))))) {
|
||||
R.getVPSingleValue()->replaceAllUsesWith(X);
|
||||
R.eraseFromParent();
|
||||
return;
|
||||
|
Loading…
x
Reference in New Issue
Block a user