[llvm] 0ab1559 - [TableGen] Reorder some checks in TreePatternNode::isIsomorphicTo to speedup -gen-dag-isel for RISC-V.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 9 00:55:30 PDT 2023
Author: Craig Topper
Date: 2023-04-09T00:54:50-07:00
New Revision: 0ab1559a3d92aad896aebaf7912ee6789d6bef06
URL: https://github.com/llvm/llvm-project/commit/0ab1559a3d92aad896aebaf7912ee6789d6bef06
DIFF: https://github.com/llvm/llvm-project/commit/0ab1559a3d92aad896aebaf7912ee6789d6bef06.diff
LOG: [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.
Added:
Modified:
llvm/utils/TableGen/CodeGenDAGPatterns.cpp
Removed:
################################################################################
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
index 6b7922e834c4..e1327c9eb18d 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;
More information about the llvm-commits
mailing list