[enco] Reduce Identical Objects with free instructions (#2505)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Wed, 5 Dec 2018 23:38:32 +0000 (08:38 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Wed, 5 Dec 2018 23:38:32 +0000 (08:38 +0900)
The current implementation of Reduce Identical Objects pass does not
work correctly in the presence of free instructions.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/enco/core/src/Transforms/IdenticalObjectReduction.cpp
contrib/enco/core/src/Transforms/IdenticalObjectReduction.test.cpp [new file with mode: 0644]

index 03df6ec..81751b9 100644 (file)
@@ -28,9 +28,12 @@ void reduce_identical_object(enco::Code *code)
 
   std::set<coco::Copy *> 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 (file)
index 0000000..772bea0
--- /dev/null
@@ -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 <gtest/gtest.h>
+
+TEST(IdenticalObjectReductionTest, case_000)
+{
+  auto m = coco::Module::create();
+
+  // Create a "free" Eval instruction
+  m->entity()->instr()->create<coco::Eval>();
+
+  enco::Code code{m.get(), nullptr};
+
+  // NOTE This code SHOULD NOT crash
+  enco::reduce_identical_object(&code);
+}