Files
paddlepaddle--paddle/paddle/cinn/optim/compute_inline_expand.cc
T
2026-07-13 12:40:42 +08:00

81 lines
2.4 KiB
C++

// Copyright (c) 2021 CINN Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "paddle/cinn/optim/compute_inline_expand.h"
#include <map>
#include <string>
#include "paddle/cinn/common/graph_utils.h"
#include "paddle/cinn/ir/ir_mutator.h"
#include "paddle/cinn/ir/utils/ir_copy.h"
#include "paddle/cinn/optim/replace_var_with_expr.h"
namespace cinn {
namespace optim {
namespace {
/*
* Replace a tensor(marked as compute_inline) to the expanded expression.
*/
struct SSANode : public cinn::common::GraphNode {
std::string id_;
explicit SSANode(const std::string &id) : id_(id) {}
std::string id() const override { return id_; }
const char *type_info() const override { return __type_info__; }
static constexpr char *__type_info__ = "optim::SSANode";
};
// TODO(Superjomn) the graph here is not a SSA now, it is flatten for the
// ir::CollectIRNodes method collects all the tensors recursively, so it can not
// reserve the level information, fix it.
struct SSABuilder : public ir::IRMutator<> {
cinn::common::Graph graph;
SSABuilder &operator()(Expr *expr) {
ir::IRMutator<>::Visit(expr, expr);
return *this;
}
void Visit(const ir::Store *op, Expr *expr) override {
auto *node = expr->As<ir::Store>();
auto *cur_graph_node = graph.RetrieveNode(node->tensor.as_tensor()->name);
if (!cur_graph_node) {
cur_graph_node =
graph.RegisterNode(node->tensor.as_tensor()->name,
new SSANode(node->tensor.as_tensor()->name));
}
auto deps_tensor_names = node->tensor.as_tensor()->GetDependTensorNames();
for (auto &t : deps_tensor_names) {
auto *n = graph.RetrieveNode(t);
if (!n) {
n = graph.RegisterNode(t, new SSANode(t));
}
n->Controls(cur_graph_node);
}
}
};
} // namespace
} // namespace optim
} // namespace cinn