From: 박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 Date: Wed, 5 Dec 2018 23:38:32 +0000 (+0900) Subject: [enco] Reduce Identical Objects with free instructions (#2505) X-Git-Tag: nncc_backup~1189 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3d06829f6f427a54529b3e1c904209044ac78eb1;p=platform%2Fcore%2Fml%2Fnnfw.git [enco] Reduce Identical Objects with free instructions (#2505) The current implementation of Reduce Identical Objects pass does not work correctly in the presence of free instructions. Signed-off-by: Jonghyun Park --- diff --git a/contrib/enco/core/src/Transforms/IdenticalObjectReduction.cpp b/contrib/enco/core/src/Transforms/IdenticalObjectReduction.cpp index 03df6ec..81751b9 100644 --- a/contrib/enco/core/src/Transforms/IdenticalObjectReduction.cpp +++ b/contrib/enco/core/src/Transforms/IdenticalObjectReduction.cpp @@ -28,9 +28,12 @@ void reduce_identical_object(enco::Code *code) std::set detached; - for (uint32_t n = 0; n < m->entity()->instr()->size(); ++n) + // Preceding optimizations may generate "free" instructions. + // - i.e. an instruction not linked to a block + // + // Let's iterates over only a sequence of "bounded" instructions. + for (auto ins : instr_sequence(m)) { - auto ins = m->entity()->instr()->at(n); assert(ins != nullptr); assert(ins->parent() != nullptr); diff --git a/contrib/enco/core/src/Transforms/IdenticalObjectReduction.test.cpp b/contrib/enco/core/src/Transforms/IdenticalObjectReduction.test.cpp new file mode 100644 index 0000000..772bea0 --- /dev/null +++ b/contrib/enco/core/src/Transforms/IdenticalObjectReduction.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. 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 "IdenticalObjectReduction.h" + +#include + +TEST(IdenticalObjectReductionTest, case_000) +{ + auto m = coco::Module::create(); + + // Create a "free" Eval instruction + m->entity()->instr()->create(); + + enco::Code code{m.get(), nullptr}; + + // NOTE This code SHOULD NOT crash + enco::reduce_identical_object(&code); +}