#pragma once // // This file is distributed under the MIT License. See LICENSE.md for details. // #include "mlir/IR/OpDefinition.h" namespace clift { namespace impl { mlir::LogicalResult verifyNoFallthroughTrait(mlir::Operation *Op); mlir::LogicalResult verifyAssignsLoopLabelsTrait(mlir::Operation *Op); } // namespace impl template class NoFallthrough : public mlir::OpTrait::TraitBase { using Base = mlir::OpTrait::TraitBase; public: static mlir::LogicalResult verifyTrait(mlir::Operation *const Op) { return impl::verifyNoFallthroughTrait(Op); } }; template class AssignsLoopLabels : public mlir::OpTrait::TraitBase { using Base = mlir::OpTrait::TraitBase; public: static mlir::LogicalResult verifyTrait(mlir::Operation *const Op) { return impl::verifyAssignsLoopLabelsTrait(Op); } unsigned getAssignedLabelCount() { auto Op = mlir::cast(this->getOperation()); return std::popcount(Op.getLabelMask()); } mlir::Value getAssignedLabel(unsigned Index) { return this->getOperation()->getOperand(Index); } }; template class ReturnsBoolean : public mlir::OpTrait::TraitBase { using Base = mlir::OpTrait::TraitBase; }; } // namespace clift