diff --git a/tools/pnnx/src/CMakeLists.txt b/tools/pnnx/src/CMakeLists.txt index 8a614b970..f8cbfdc72 100644 --- a/tools/pnnx/src/CMakeLists.txt +++ b/tools/pnnx/src/CMakeLists.txt @@ -234,6 +234,7 @@ set(pnnx_pass_ncnn_SRCS pass_ncnn/solve_batch_index.cpp pass_ncnn/eliminate_noop.cpp + pass_ncnn/eliminate_tail_reshape_permute.cpp pass_ncnn/fuse_convolution_activation.cpp pass_ncnn/fuse_convolution1d_activation.cpp pass_ncnn/fuse_convolutiondepthwise_activation.cpp diff --git a/tools/pnnx/src/pass_ncnn.cpp b/tools/pnnx/src/pass_ncnn.cpp index f19fb1dd0..a6f8c275e 100644 --- a/tools/pnnx/src/pass_ncnn.cpp +++ b/tools/pnnx/src/pass_ncnn.cpp @@ -27,6 +27,7 @@ #include "pass_ncnn/solve_batch_index.h" #include "pass_ncnn/eliminate_noop.h" +#include "pass_ncnn/eliminate_tail_reshape_permute.h" #include "pass_ncnn/fuse_convolution_activation.h" #include "pass_ncnn/fuse_convolution1d_activation.h" #include "pass_ncnn/fuse_convolutiondepthwise_activation.h" @@ -95,6 +96,7 @@ void pass_ncnn(Graph& g) ncnn::fuse_deconvolution_activation(g); ncnn::fuse_deconvolutiondepthwise_activation(g); ncnn::fuse_innerproduct_activation(g); + ncnn::eliminate_tail_reshape_permute(g); dead_code_elimination(g); diff --git a/tools/pnnx/src/pass_ncnn/eliminate_tail_reshape_permute.cpp b/tools/pnnx/src/pass_ncnn/eliminate_tail_reshape_permute.cpp new file mode 100644 index 000000000..180895717 --- /dev/null +++ b/tools/pnnx/src/pass_ncnn/eliminate_tail_reshape_permute.cpp @@ -0,0 +1,82 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// 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 "eliminate_tail_reshape_permute.h" + +#include + +namespace pnnx { + +namespace ncnn { + +void eliminate_tail_reshape_permute(Graph& graph) +{ + for (;;) + { + bool need_eliminate = false; + + for (int i = (int)graph.ops.size() - 1; i >= 0; i--) + { + Operator* op = graph.ops[i]; + + if (op->type != "Reshape" && op->type != "Permute") + continue; + + Operand* op_out = op->outputs[0]; + + if (op_out->consumers.size() != 1) + continue; + + Operator* op2 = op_out->consumers[0]; + + if (op2->type != "pnnx.Output") + continue; + + need_eliminate = true; + + op->inputs[0]->remove_consumer(op); + + op->inputs[0]->params = op_out->params; + + for (size_t j = 0; j < op2->inputs.size(); j++) + { + if (op2->inputs[j] == op_out) + op2->inputs[j] = op->inputs[0]; + } + + op->inputs[0]->consumers.push_back(op2); + + op_out->producer = 0; + op_out->consumers.clear(); + + graph.operands.erase(std::find(graph.operands.begin(), graph.operands.end(), op_out)); + delete op_out; + + op->inputs.clear(); + op->outputs.clear(); + + graph.ops.erase(graph.ops.begin() + i); + delete op; + + break; + } + + if (!need_eliminate) + break; + } +} + +} // namespace ncnn + +} // namespace pnnx diff --git a/tools/pnnx/src/pass_ncnn/eliminate_tail_reshape_permute.h b/tools/pnnx/src/pass_ncnn/eliminate_tail_reshape_permute.h new file mode 100644 index 000000000..0f1a0db38 --- /dev/null +++ b/tools/pnnx/src/pass_ncnn/eliminate_tail_reshape_permute.h @@ -0,0 +1,26 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// 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 "pass_ncnn.h" + +namespace pnnx { + +namespace ncnn { + +void eliminate_tail_reshape_permute(Graph& graph); + +} // namespace ncnn + +} // namespace pnnx +