summaryrefslogtreecommitdiffstats
path: root/mlir/lib/TableGen/Operator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/TableGen/Operator.cpp')
-rw-r--r--mlir/lib/TableGen/Operator.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/mlir/lib/TableGen/Operator.cpp b/mlir/lib/TableGen/Operator.cpp
index 4529208a39c..3825363bec0 100644
--- a/mlir/lib/TableGen/Operator.cpp
+++ b/mlir/lib/TableGen/Operator.cpp
@@ -23,6 +23,7 @@
#include "mlir/TableGen/OpTrait.h"
#include "mlir/TableGen/Predicate.h"
#include "mlir/TableGen/Type.h"
+#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
@@ -293,12 +294,18 @@ void tblgen::Operator::populateOpStructure() {
results.push_back({name, TypeConstraint(resultDef)});
}
- auto traitListInit = def.getValueAsListInit("traits");
- if (!traitListInit)
- return;
- traits.reserve(traitListInit->size());
- for (auto traitInit : *traitListInit)
- traits.push_back(OpTrait::create(traitInit));
+ // Create list of traits, skipping over duplicates: appending to lists in
+ // tablegen is easy, making them unique less so, so dedupe here.
+ if (auto traitList = def.getValueAsListInit("traits")) {
+ // This is uniquing based on pointers of the trait.
+ SmallPtrSet<const llvm::Init *, 32> traitSet;
+ traits.reserve(traitSet.size());
+ for (auto traitInit : *traitList) {
+ // Keep traits in the same order while skipping over duplicates.
+ if (traitSet.insert(traitInit).second)
+ traits.push_back(OpTrait::create(traitInit));
+ }
+ }
// Handle regions
auto *regionsDag = def.getValueAsDag("regions");
OpenPOWER on IntegriCloud