| @@ -234,6 +234,7 @@ set(pnnx_pass_ncnn_SRCS | |||||
| pass_ncnn/solve_batch_index.cpp | pass_ncnn/solve_batch_index.cpp | ||||
| pass_ncnn/eliminate_noop.cpp | pass_ncnn/eliminate_noop.cpp | ||||
| pass_ncnn/eliminate_tail_reshape_permute.cpp | |||||
| pass_ncnn/fuse_convolution_activation.cpp | pass_ncnn/fuse_convolution_activation.cpp | ||||
| pass_ncnn/fuse_convolution1d_activation.cpp | pass_ncnn/fuse_convolution1d_activation.cpp | ||||
| pass_ncnn/fuse_convolutiondepthwise_activation.cpp | pass_ncnn/fuse_convolutiondepthwise_activation.cpp | ||||
| @@ -27,6 +27,7 @@ | |||||
| #include "pass_ncnn/solve_batch_index.h" | #include "pass_ncnn/solve_batch_index.h" | ||||
| #include "pass_ncnn/eliminate_noop.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_convolution_activation.h" | ||||
| #include "pass_ncnn/fuse_convolution1d_activation.h" | #include "pass_ncnn/fuse_convolution1d_activation.h" | ||||
| #include "pass_ncnn/fuse_convolutiondepthwise_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_deconvolution_activation(g); | ||||
| ncnn::fuse_deconvolutiondepthwise_activation(g); | ncnn::fuse_deconvolutiondepthwise_activation(g); | ||||
| ncnn::fuse_innerproduct_activation(g); | ncnn::fuse_innerproduct_activation(g); | ||||
| ncnn::eliminate_tail_reshape_permute(g); | |||||
| dead_code_elimination(g); | dead_code_elimination(g); | ||||
| @@ -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 <algorithm> | |||||
| 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 | |||||
| @@ -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 | |||||