diff options
author | River Riddle <riddleriver@gmail.com> | 2020-03-12 14:06:41 -0700 |
---|---|---|
committer | River Riddle <riddleriver@gmail.com> | 2020-03-12 14:26:15 -0700 |
commit | 0ddba0bd59c337f16b51a00cb205ecfda46f97fa (patch) | |
tree | be1aaf1254f0c625d48ba66270d69b0db8b38a2e /mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp | |
parent | 907403f342fe661b590f930a83f940c67b3ff855 (diff) | |
download | llvm-0ddba0bd59c337f16b51a00cb205ecfda46f97fa.zip llvm-0ddba0bd59c337f16b51a00cb205ecfda46f97fa.tar.gz llvm-0ddba0bd59c337f16b51a00cb205ecfda46f97fa.tar.bz2 |
[mlir][SideEffects] Replace HasNoSideEffect with the memory effect interfaces.
HasNoSideEffect can now be implemented using the MemoryEffectInterface, removing the need to check multiple things for the same information. This also removes an easy foot-gun for users as 'Operation::hasNoSideEffect' would ignore operations that dynamically, or recursively, have no side effects. This also leads to an immediate improvement in some of the existing users, such as DCE, now that they have access to more information.
Differential Revision: https://reviews.llvm.org/D76036
Diffstat (limited to 'mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp')
-rw-r--r-- | mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp index 853f399..8953bcbc 100644 --- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp +++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp @@ -1184,15 +1184,21 @@ void OpEmitter::genSideEffectInterfaceMethods() { unsigned index, unsigned kind) { for (auto decorator : decorators) if (SideEffect *effect = dyn_cast<SideEffect>(&decorator)) - interfaceEffects[effect->getInterfaceTrait()].push_back( + interfaceEffects[effect->getBaseEffectName()].push_back( EffectLocation{*effect, index, kind}); }; // Collect effects that were specified via: /// Traits. - for (const auto &trait : op.getTraits()) - if (const auto *opTrait = dyn_cast<tblgen::SideEffectTrait>(&trait)) - resolveDecorators(opTrait->getEffects(), /*index=*/0, EffectKind::Static); + for (const auto &trait : op.getTraits()) { + const auto *opTrait = dyn_cast<tblgen::SideEffectTrait>(&trait); + if (!opTrait) + continue; + auto &effects = interfaceEffects[opTrait->getBaseEffectName()]; + for (auto decorator : opTrait->getEffects()) + effects.push_back(EffectLocation{cast<SideEffect>(decorator), + /*index=*/0, EffectKind::Static}); + } /// Operands. for (unsigned i = 0, operandIt = 0, e = op.getNumArgs(); i != e; ++i) { if (op.getArg(i).is<NamedTypeConstraint *>()) { @@ -1205,11 +1211,10 @@ void OpEmitter::genSideEffectInterfaceMethods() { resolveDecorators(op.getResultDecorators(i), i, EffectKind::Result); for (auto &it : interfaceEffects) { - StringRef baseEffect = it.second.front().effect.getBaseName(); auto effectsParam = llvm::formatv( "SmallVectorImpl<SideEffects::EffectInstance<{0}>> &effects", - baseEffect) + it.first()) .str(); // Generate the 'getEffects' method. |