1c0b3abd1Sahmedsabie //===- TestTraits.cpp - Test trait folding --------------------------------===// 2c0b3abd1Sahmedsabie // 3c0b3abd1Sahmedsabie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c0b3abd1Sahmedsabie // See https://llvm.org/LICENSE.txt for license information. 5c0b3abd1Sahmedsabie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c0b3abd1Sahmedsabie // 7c0b3abd1Sahmedsabie //===----------------------------------------------------------------------===// 8c0b3abd1Sahmedsabie 9c0b3abd1Sahmedsabie #include "TestDialect.h" 10c0b3abd1Sahmedsabie #include "mlir/Pass/Pass.h" 11b6eb26fdSRiver Riddle #include "mlir/Transforms/GreedyPatternRewriteDriver.h" 12c0b3abd1Sahmedsabie 13c0b3abd1Sahmedsabie using namespace mlir; 147776b19eSStephen Neuendorffer using namespace test; 15c0b3abd1Sahmedsabie 16c0b3abd1Sahmedsabie //===----------------------------------------------------------------------===// 17c0b3abd1Sahmedsabie // Trait Folder. 18c0b3abd1Sahmedsabie //===----------------------------------------------------------------------===// 19c0b3abd1Sahmedsabie fold(ArrayRef<Attribute> operands)20c0b3abd1SahmedsabieOpFoldResult TestInvolutionTraitFailingOperationFolderOp::fold( 21c0b3abd1Sahmedsabie ArrayRef<Attribute> operands) { 22c0b3abd1Sahmedsabie // This failure should cause the trait fold to run instead. 23c0b3abd1Sahmedsabie return {}; 24c0b3abd1Sahmedsabie } 25c0b3abd1Sahmedsabie fold(ArrayRef<Attribute> operands)26c0b3abd1SahmedsabieOpFoldResult TestInvolutionTraitSuccesfulOperationFolderOp::fold( 27c0b3abd1Sahmedsabie ArrayRef<Attribute> operands) { 28b6eb26fdSRiver Riddle auto argumentOp = getOperand(); 29c0b3abd1Sahmedsabie // The success case should cause the trait fold to be supressed. 30b6eb26fdSRiver Riddle return argumentOp.getDefiningOp() ? argumentOp : OpFoldResult{}; 31c0b3abd1Sahmedsabie } 32c0b3abd1Sahmedsabie 33c0b3abd1Sahmedsabie namespace { 3441574554SRiver Riddle struct TestTraitFolder 35*58ceae95SRiver Riddle : public PassWrapper<TestTraitFolder, OperationPass<func::FuncOp>> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anon864ddab30111::TestTraitFolder365e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestTraitFolder) 375e50dd04SRiver Riddle 38b5e22e6dSMehdi Amini StringRef getArgument() const final { return "test-trait-folder"; } getDescription__anon864ddab30111::TestTraitFolder39b5e22e6dSMehdi Amini StringRef getDescription() const final { return "Run trait folding"; } runOnOperation__anon864ddab30111::TestTraitFolder4041574554SRiver Riddle void runOnOperation() override { 4141574554SRiver Riddle (void)applyPatternsAndFoldGreedily(getOperation(), 42dc4e913bSChris Lattner RewritePatternSet(&getContext())); 43c0b3abd1Sahmedsabie } 44c0b3abd1Sahmedsabie }; 45be0a7e9fSMehdi Amini } // namespace 46c0b3abd1Sahmedsabie 47c0b3abd1Sahmedsabie namespace mlir { registerTestTraitsPass()48b5e22e6dSMehdi Aminivoid registerTestTraitsPass() { PassRegistration<TestTraitFolder>(); } 49c0b3abd1Sahmedsabie } // namespace mlir 50