[enco] DataLayoutConversion with free Load op (#2531)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 6 Dec 2018 06:50:23 +0000 (15:50 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 6 Dec 2018 06:50:23 +0000 (15:50 +0900)
It is currently impossible to apply Data Layout Conversion if there is a free Load op.

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

index ce8da00..c53c11e 100644 (file)
@@ -74,9 +74,14 @@ coco::FeatureObject *clone_feature(const coco::FeatureObject *oldobj)
 
 /**
  * @brief Insert Copy before Load if necessary
+ *
+ * @require "load" should be bounded
  */
 void insert_copy_before_load(coco::Load *load)
 {
+  assert(load->parent() != nullptr);
+  assert(load->parent()->parent() != nullptr);
+
   if (auto obj = load->object())
   {
     if (auto ifm = obj->asFeature())
@@ -183,7 +188,7 @@ namespace
 {
 
 /**
- * @brief Return the set of all of allocated Load Op(s) in a given module
+ * @brief Return the set of all of bounded Load Op(s) in a given module
  */
 std::set<coco::Load *> loads(coco::Module *m)
 {
@@ -191,6 +196,18 @@ std::set<coco::Load *> loads(coco::Module *m)
 
   for (uint32_t n = 0; n < m->entity()->op()->size(); ++n)
   {
+    auto op = m->entity()->op()->at(n);
+
+    if (op->parent() == nullptr)
+    {
+      continue;
+    }
+
+    if (op->parent()->parent() == nullptr)
+    {
+      continue;
+    }
+
     if (auto load = m->entity()->op()->at(n)->asLoad())
     {
       res.insert(load);
diff --git a/contrib/enco/core/src/Transforms/DataLayoutConversion.test.cpp b/contrib/enco/core/src/Transforms/DataLayoutConversion.test.cpp
new file mode 100644 (file)
index 0000000..812e38a
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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 "DataLayoutConversion.h"
+
+#include <gtest/gtest.h>
+
+TEST(DataLayoutConversionTest, case_000)
+{
+  auto m = coco::Module::create();
+
+  // Create a "free" Load op
+  m->entity()->instr()->create<coco::Eval>();
+
+  enco::Code code{m.get(), nullptr};
+  ASSERT_EQ(m->entity()->instr()->size(), 1);
+
+  // "conver_data_layout" SHOULD NOT crash even if there is a "free" Load op
+  enco::convert_data_layout(&code);
+}