From 0ab1559a3d92aad896aebaf7912ee6789d6bef06 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sun, 9 Apr 2023 00:42:35 -0700 Subject: [PATCH] [TableGen] Reorder some checks in TreePatternNode::isIsomorphicTo to speedup -gen-dag-isel for RISC-V. Comparing types is quite expensive when hardware modes are being used. Checking the operator first can let us detect mismatches earlier without checking types. --- llvm/utils/TableGen/CodeGenDAGPatterns.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index 6b7922e..e1327c9 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -1974,7 +1974,17 @@ void TreePatternNode::dump() const { bool TreePatternNode::isIsomorphicTo(const TreePatternNode *N, const MultipleUseVarSet &DepVars) const { if (N == this) return true; - if (N->isLeaf() != isLeaf() || getExtTypes() != N->getExtTypes() || + if (N->isLeaf() != isLeaf()) + return false; + + // Check operator of non-leaves early since it can be cheaper than checking + // types. + if (!isLeaf()) + if (N->getOperator() != getOperator() || + N->getNumChildren() != getNumChildren()) + return false; + + if (getExtTypes() != N->getExtTypes() || getPredicateCalls() != N->getPredicateCalls() || getTransformFn() != N->getTransformFn()) return false; @@ -1989,8 +1999,6 @@ bool TreePatternNode::isIsomorphicTo(const TreePatternNode *N, return getLeafValue() == N->getLeafValue(); } - if (N->getOperator() != getOperator() || - N->getNumChildren() != getNumChildren()) return false; for (unsigned i = 0, e = getNumChildren(); i != e; ++i) if (!getChild(i)->isIsomorphicTo(N->getChild(i), DepVars)) return false; -- 2.7.4