parser/AST.cpp
mlir/MLIRGen.cpp
mlir/Dialect.cpp
- mlir/DeadFunctionEliminationPass.cpp
mlir/ShapeInferencePass.cpp
mlir/ToyCombine.cpp
)
namespace toy {
std::unique_ptr<Pass> createShapeInferencePass();
-std::unique_ptr<Pass> createDeadFunctionEliminationPass();
} // end namespace toy
} // end namespace mlir
+++ /dev/null
-//===- DeadFunctionEliminationPass.cpp - Eliminate inlined functions ------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements a Module level pass performing dead function
-// elimination. This is required as a post-processing step after function
-// inlining.
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Analysis/Verifier.h"
-#include "mlir/IR/BlockAndValueMapping.h"
-#include "mlir/IR/Builders.h"
-#include "mlir/IR/MLIRContext.h"
-#include "mlir/IR/OpDefinition.h"
-#include "mlir/IR/StandardTypes.h"
-#include "mlir/Pass/Pass.h"
-#include "mlir/Support/LogicalResult.h"
-#include "toy/Passes.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringSet.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
-
-namespace {
-/// This is a simple function DCE pass that deletes all non-main functions after
-/// inlining.
-/// TODO(riverriddle) This is only necessary because MLIR currently does not
-/// have generic DCE support for functions.
-class DeadFunctionEliminationPass
- : public mlir::ModulePass<DeadFunctionEliminationPass> {
-public:
- void runOnModule() override {
- mlir::ModuleOp module = getModule();
- mlir::SymbolTable moduleSymTable(module);
-
- // Eliminate non-main functions.
- auto mainFn = moduleSymTable.lookup<mlir::FuncOp>("main");
- for (mlir::FuncOp func :
- llvm::make_early_inc_range(module.getOps<mlir::FuncOp>())) {
- if (func != mainFn)
- func.erase();
- }
- }
-};
-} // end anonymous namespace
-
-/// Create a pass that eliminates inlined functions in toy.
-std::unique_ptr<mlir::Pass> mlir::toy::createDeadFunctionEliminationPass() {
- return std::make_unique<DeadFunctionEliminationPass>();
-}
getType(VarType{})));
}
+ // If this function isn't main, then set the visibility to private.
+ if (funcAST.getProto()->getName() != "main")
+ function.setVisibility(mlir::FuncOp::Visibility::Private);
+
return function;
}
// Inline all functions into main and then delete them.
pm.addPass(mlir::createInlinerPass());
- pm.addPass(mlir::toy::createDeadFunctionEliminationPass());
+ pm.addPass(mlir::createSymbolDCEPass());
// Now that there is only one function, we can infer the shapes of each of
// the operations.
parser/AST.cpp
mlir/MLIRGen.cpp
mlir/Dialect.cpp
- mlir/DeadFunctionEliminationPass.cpp
mlir/LowerToAffineLoops.cpp
mlir/ShapeInferencePass.cpp
mlir/ToyCombine.cpp
class Pass;
namespace toy {
-std::unique_ptr<Pass> createDeadFunctionEliminationPass();
std::unique_ptr<Pass> createShapeInferencePass();
/// Create a pass for lowering to operations in the `Affine` and `Std` dialects,
+++ /dev/null
-//===- DeadFunctionEliminationPass.cpp - Eliminate inlined functions ------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements a Module level pass performing dead function
-// elimination. This is required as a post-processing step after function
-// inlining.
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Analysis/Verifier.h"
-#include "mlir/IR/BlockAndValueMapping.h"
-#include "mlir/IR/Builders.h"
-#include "mlir/IR/MLIRContext.h"
-#include "mlir/IR/OpDefinition.h"
-#include "mlir/IR/StandardTypes.h"
-#include "mlir/Pass/Pass.h"
-#include "mlir/Support/LogicalResult.h"
-#include "toy/Passes.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringSet.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
-
-namespace {
-/// This is a simple function DCE pass that deletes all non-main functions after
-/// inlining.
-/// TODO(riverriddle) This is only necessary because MLIR currently does not
-/// have generic DCE support for functions.
-class DeadFunctionEliminationPass
- : public mlir::ModulePass<DeadFunctionEliminationPass> {
-public:
- void runOnModule() override {
- mlir::ModuleOp module = getModule();
- mlir::SymbolTable moduleSymTable(module);
-
- // Eliminate non-main functions.
- auto mainFn = moduleSymTable.lookup<mlir::FuncOp>("main");
- for (mlir::FuncOp func :
- llvm::make_early_inc_range(module.getOps<mlir::FuncOp>())) {
- if (func != mainFn)
- func.erase();
- }
- }
-};
-} // end anonymous namespace
-
-/// Create a pass that eliminates inlined functions in toy.
-std::unique_ptr<mlir::Pass> mlir::toy::createDeadFunctionEliminationPass() {
- return std::make_unique<DeadFunctionEliminationPass>();
-}
getType(VarType{})));
}
+ // If this function isn't main, then set the visibility to private.
+ if (funcAST.getProto()->getName() != "main")
+ function.setVisibility(mlir::FuncOp::Visibility::Private);
+
return function;
}
if (enableOpt || isLoweringToAffine) {
// Inline all functions into main and then delete them.
pm.addPass(mlir::createInlinerPass());
- pm.addPass(mlir::toy::createDeadFunctionEliminationPass());
+ pm.addPass(mlir::createSymbolDCEPass());
// Now that there is only one function, we can infer the shapes of each of
// the operations.
parser/AST.cpp
mlir/MLIRGen.cpp
mlir/Dialect.cpp
- mlir/DeadFunctionEliminationPass.cpp
mlir/LowerToAffineLoops.cpp
mlir/LowerToLLVM.cpp
mlir/ShapeInferencePass.cpp
class Pass;
namespace toy {
-std::unique_ptr<Pass> createDeadFunctionEliminationPass();
std::unique_ptr<Pass> createShapeInferencePass();
/// Create a pass for lowering to operations in the `Affine` and `Std` dialects,
+++ /dev/null
-//===- DeadFunctionEliminationPass.cpp - Eliminate inlined functions ------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements a Module level pass performing dead function
-// elimination. This is required as a post-processing step after function
-// inlining.
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Analysis/Verifier.h"
-#include "mlir/IR/BlockAndValueMapping.h"
-#include "mlir/IR/Builders.h"
-#include "mlir/IR/MLIRContext.h"
-#include "mlir/IR/OpDefinition.h"
-#include "mlir/IR/StandardTypes.h"
-#include "mlir/Pass/Pass.h"
-#include "mlir/Support/LogicalResult.h"
-#include "toy/Passes.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringSet.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
-
-namespace {
-/// This is a simple function DCE pass that deletes all non-main functions after
-/// inlining.
-/// TODO(riverriddle) This is only necessary because MLIR currently does not
-/// have generic DCE support for functions.
-class DeadFunctionEliminationPass
- : public mlir::ModulePass<DeadFunctionEliminationPass> {
-public:
- void runOnModule() override {
- mlir::ModuleOp module = getModule();
- mlir::SymbolTable moduleSymTable(module);
-
- // Eliminate non-main functions.
- auto mainFn = moduleSymTable.lookup<mlir::FuncOp>("main");
- for (mlir::FuncOp func :
- llvm::make_early_inc_range(module.getOps<mlir::FuncOp>())) {
- if (func != mainFn)
- func.erase();
- }
- }
-};
-} // end anonymous namespace
-
-/// Create a pass that eliminates inlined functions in toy.
-std::unique_ptr<mlir::Pass> mlir::toy::createDeadFunctionEliminationPass() {
- return std::make_unique<DeadFunctionEliminationPass>();
-}
getType(VarType{})));
}
+ // If this function isn't main, then set the visibility to private.
+ if (funcAST.getProto()->getName() != "main")
+ function.setVisibility(mlir::FuncOp::Visibility::Private);
+
return function;
}
if (enableOpt || isLoweringToAffine) {
// Inline all functions into main and then delete them.
pm.addPass(mlir::createInlinerPass());
- pm.addPass(mlir::toy::createDeadFunctionEliminationPass());
+ pm.addPass(mlir::createSymbolDCEPass());
// Now that there is only one function, we can infer the shapes of each of
// the operations.
parser/AST.cpp
mlir/MLIRGen.cpp
mlir/Dialect.cpp
- mlir/DeadFunctionEliminationPass.cpp
mlir/LowerToAffineLoops.cpp
mlir/LowerToLLVM.cpp
mlir/ShapeInferencePass.cpp
class Pass;
namespace toy {
-std::unique_ptr<Pass> createDeadFunctionEliminationPass();
std::unique_ptr<Pass> createShapeInferencePass();
/// Create a pass for lowering to operations in the `Affine` and `Std` dialects,
+++ /dev/null
-//===- DeadFunctionEliminationPass.cpp - Eliminate inlined functions ------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements a Module level pass performing dead function
-// elimination. This is required as a post-processing step after function
-// inlining.
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Analysis/Verifier.h"
-#include "mlir/IR/BlockAndValueMapping.h"
-#include "mlir/IR/Builders.h"
-#include "mlir/IR/MLIRContext.h"
-#include "mlir/IR/OpDefinition.h"
-#include "mlir/IR/StandardTypes.h"
-#include "mlir/Pass/Pass.h"
-#include "mlir/Support/LogicalResult.h"
-#include "toy/Passes.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringSet.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
-
-namespace {
-/// This is a simple function DCE pass that deletes all non-main functions after
-/// inlining.
-/// TODO(riverriddle) This is only necessary because MLIR currently does not
-/// have generic DCE support for functions.
-class DeadFunctionEliminationPass
- : public mlir::ModulePass<DeadFunctionEliminationPass> {
-public:
- void runOnModule() override {
- mlir::ModuleOp module = getModule();
- mlir::SymbolTable moduleSymTable(module);
-
- // Eliminate non-main functions.
- auto mainFn = moduleSymTable.lookup<mlir::FuncOp>("main");
- for (mlir::FuncOp func :
- llvm::make_early_inc_range(module.getOps<mlir::FuncOp>())) {
- if (func != mainFn)
- func.erase();
- }
- }
-};
-} // end anonymous namespace
-
-/// Create a pass that eliminates inlined functions in toy.
-std::unique_ptr<mlir::Pass> mlir::toy::createDeadFunctionEliminationPass() {
- return std::make_unique<DeadFunctionEliminationPass>();
-}
*returnOp.operand_type_begin()));
}
+ // If this function isn't main, then set the visibility to private.
+ if (funcAST.getProto()->getName() != "main")
+ function.setVisibility(mlir::FuncOp::Visibility::Private);
+
return function;
}
if (enableOpt || isLoweringToAffine) {
// Inline all functions into main and then delete them.
pm.addPass(mlir::createInlinerPass());
- pm.addPass(mlir::toy::createDeadFunctionEliminationPass());
+ pm.addPass(mlir::createSymbolDCEPass());
// Now that there is only one function, we can infer the shapes of each of
// the operations.
// Check the result of inlining+shape inference on an input module.
-func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64> {
+func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64>
+ attributes { sym_visibility = "private" } {
%0 = "toy.transpose"(%arg0) : (tensor<*xf64>) -> tensor<*xf64>
%1 = "toy.transpose"(%arg1) : (tensor<*xf64>) -> tensor<*xf64>
%2 = "toy.mul"(%0, %1) : (tensor<*xf64>, tensor<*xf64>) -> tensor<*xf64>
// Check the result of inlining+shape inference on an input module.
-func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64> {
+func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64>
+ attributes { sym_visibility = "private" } {
%0 = "toy.transpose"(%arg0) : (tensor<*xf64>) -> tensor<*xf64>
%1 = "toy.transpose"(%arg1) : (tensor<*xf64>) -> tensor<*xf64>
%2 = "toy.mul"(%0, %1) : (tensor<*xf64>, tensor<*xf64>) -> tensor<*xf64>
// Check the result of inlining+shape inference on an input module.
-func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64> {
+func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64>
+ attributes { sym_visibility = "private" } {
%0 = "toy.transpose"(%arg0) : (tensor<*xf64>) -> tensor<*xf64>
%1 = "toy.transpose"(%arg1) : (tensor<*xf64>) -> tensor<*xf64>
%2 = "toy.mul"(%0, %1) : (tensor<*xf64>, tensor<*xf64>) -> tensor<*xf64>
// Check the result of inlining+shape inference on an input module.
-func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64> {
+func @multiply_transpose(%arg0: tensor<*xf64>, %arg1: tensor<*xf64>) -> tensor<*xf64>
+ attributes { sym_visibility = "private" } {
%0 = "toy.transpose"(%arg0) : (tensor<*xf64>) -> tensor<*xf64>
%1 = "toy.transpose"(%arg1) : (tensor<*xf64>) -> tensor<*xf64>
%2 = "toy.mul"(%0, %1) : (tensor<*xf64>, tensor<*xf64>) -> tensor<*xf64>
-# RUN: toyc-ch7 %s -emit=mlir 2>&1
+# RUN: toyc-ch7 %s -emit=mlir 2>&1 | FileCheck %s
# RUN: toyc-ch7 %s -emit=mlir -opt 2>&1 | FileCheck %s --check-prefix=OPT
struct Struct {
# CHECK-LABEL: func @multiply_transpose(
# CHECK-SAME: [[VAL_0:%.*]]: !toy.struct<tensor<*xf64>, tensor<*xf64>>) -> tensor<*xf64>
+# CHECK-SAME: attributes {sym_visibility = "private"}
# CHECK-NEXT: [[VAL_1:%.*]] = "toy.struct_access"([[VAL_0]]) {index = 0 : i64} : (!toy.struct<tensor<*xf64>, tensor<*xf64>>) -> tensor<*xf64>
# CHECK-NEXT: [[VAL_2:%.*]] = "toy.transpose"([[VAL_1]]) : (tensor<*xf64>) -> tensor<*xf64>
# CHECK-NEXT: [[VAL_3:%.*]] = "toy.struct_access"([[VAL_0]]) {index = 1 : i64} : (!toy.struct<tensor<*xf64>, tensor<*xf64>>) -> tensor<*xf64>