[PATCH] D111502: [TableGen] Fix both sides of '&&' are same
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 11 10:25:32 PDT 2021
craig.topper updated this revision to Diff 378722.
craig.topper added a comment.
Improve comments. Add asserts. Handle as a special case in the if structure to make it more readable.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D111502/new/
https://reviews.llvm.org/D111502
Files:
llvm/utils/TableGen/CodeGenDAGPatterns.cpp
llvm/utils/TableGen/CodeGenDAGPatterns.h
Index: llvm/utils/TableGen/CodeGenDAGPatterns.h
===================================================================
--- llvm/utils/TableGen/CodeGenDAGPatterns.h
+++ llvm/utils/TableGen/CodeGenDAGPatterns.h
@@ -298,8 +298,11 @@
/// unchanged.
bool EnforceAny(TypeSetByHwMode &Out);
/// Make sure that for each type in \p Small, there exists a larger type
- /// in \p Big.
- bool EnforceSmallerThan(TypeSetByHwMode &Small, TypeSetByHwMode &Big);
+ /// in \p Big. \p SmallIsVT indicates that this is being called for
+ /// SDTCisVTSmallerThanOp. In that case the TypeSetByHwMode is re-created for
+ /// each call and needs special consideration in how we detect changes.
+ bool EnforceSmallerThan(TypeSetByHwMode &Small, TypeSetByHwMode &Big,
+ bool SmallIsVT = false);
/// 1. Ensure that for each type T in \p Vec, T is a vector type, and that
/// for each type U in \p Elem, U is a scalar type.
/// 2. Ensure that for each (scalar) type U in \p Elem, there exists a
Index: llvm/utils/TableGen/CodeGenDAGPatterns.cpp
===================================================================
--- llvm/utils/TableGen/CodeGenDAGPatterns.cpp
+++ llvm/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -451,13 +451,16 @@
}
/// Make sure that for each type in Small, there exists a larger type in Big.
-bool TypeInfer::EnforceSmallerThan(TypeSetByHwMode &Small,
- TypeSetByHwMode &Big) {
+bool TypeInfer::EnforceSmallerThan(TypeSetByHwMode &Small, TypeSetByHwMode &Big,
+ bool SmallIsVT) {
ValidateOnExit _1(Small, *this), _2(Big, *this);
if (TP.hasError())
return false;
bool Changed = false;
+ assert((!SmallIsVT || !Small.empty()) &&
+ "Small should not be empty for SDTCisVTSmallerThanOp");
+
if (Small.empty())
Changed |= EnforceAny(Small);
if (Big.empty())
@@ -476,7 +479,9 @@
TypeSetByHwMode::SetType &S = Small.get(M);
TypeSetByHwMode::SetType &B = Big.get(M);
- if (any_of(S, isIntegerOrPtr) && any_of(S, isIntegerOrPtr)) {
+ assert((!SmallIsVT || !S.empty()) && "Expected non-empty type");
+
+ if (any_of(S, isIntegerOrPtr) && any_of(B, isIntegerOrPtr)) {
auto NotInt = [](MVT VT) { return !isIntegerOrPtr(VT); };
Changed |= berase_if(S, NotInt);
Changed |= berase_if(B, NotInt);
@@ -484,6 +489,11 @@
auto NotFP = [](MVT VT) { return !isFloatingPoint(VT); };
Changed |= berase_if(S, NotFP);
Changed |= berase_if(B, NotFP);
+ } else if (SmallIsVT && B.empty()) {
+ // B is empty and since S is a specific VT, it will never be empty. Don't
+ // report this as a change, just clear S and continue. This prevents an
+ // infinite loop.
+ S.clear();
} else if (S.empty() || B.empty()) {
Changed = !S.empty() || !B.empty();
S.clear();
@@ -1637,7 +1647,8 @@
getOperandNum(x.SDTCisVTSmallerThanOp_Info.OtherOperandNum, N, NodeInfo,
OResNo);
- return TI.EnforceSmallerThan(TypeListTmp, OtherNode->getExtType(OResNo));
+ return TI.EnforceSmallerThan(TypeListTmp, OtherNode->getExtType(OResNo),
+ /*SmallIsVT*/ true);
}
case SDTCisOpSmallerThanOp: {
unsigned BResNo = 0;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111502.378722.patch
Type: text/x-patch
Size: 3291 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211011/1c8e5439/attachment.bin>
More information about the llvm-commits
mailing list