From 3d06829f6f427a54529b3e1c904209044ac78eb1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Staff=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Thu, 6 Dec 2018 08:38:32 +0900 Subject: [PATCH] [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 --- .../src/Transforms/IdenticalObjectReduction.cpp | 7 +++-- .../Transforms/IdenticalObjectReduction.test.cpp | 32 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 contrib/enco/core/src/Transforms/IdenticalObjectReduction.test.cpp 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); +} -- 2.7.4