[enco] Introduce CodeIndex (#1678)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Mon, 1 Oct 2018 01:34:39 +0000 (10:34 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Mon, 1 Oct 2018 01:34:39 +0000 (10:34 +0900)
This commit introduces CodeIndex class (which is a pair of BlockIndex
and InstrIndex). This CodeIndex allows us to decide the order between
two instructions without building a sequence map.

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

diff --git a/contrib/enco/core/src/CodeIndex.h b/contrib/enco/core/src/CodeIndex.h
new file mode 100644 (file)
index 0000000..7f2da64
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+
+#ifndef __CODE_INDEX_H__
+#define __CODE_INDEX_H__
+
+#include <coco/IR/Block.h>
+#include <coco/IR/Instr.h>
+
+/**
+ * @brief A CodeIndex denotes the index of instruction inside the whole module
+ */
+class CodeIndex
+{
+public:
+  CodeIndex() = default;
+
+public:
+  CodeIndex(const coco::BlockIndex &blk_ind, const coco::InstrIndex &ins_ind)
+      : _blk_ind{blk_ind}, _ins_ind{ins_ind}
+  {
+  }
+
+public:
+  const coco::BlockIndex &block(void) const { return _blk_ind; }
+  const coco::InstrIndex &instr(void) const { return _ins_ind; }
+
+private:
+  coco::BlockIndex _blk_ind;
+  coco::InstrIndex _ins_ind;
+};
+
+static inline coco::BlockIndex block_index(const coco::Block *blk)
+{
+  if (blk == nullptr)
+  {
+    return coco::BlockIndex{};
+  }
+
+  return blk->index();
+}
+
+static inline CodeIndex code_index(const coco::Instr *ins)
+{
+  return CodeIndex{block_index(ins->parent()), ins->index()};
+}
+
+static inline bool operator<(const CodeIndex &lhs, const CodeIndex &rhs)
+{
+  if (lhs.block() < rhs.block())
+  {
+    return true;
+  }
+
+  if (lhs.block().value() > rhs.block().value())
+  {
+    return false;
+  }
+
+  return lhs.instr() < rhs.instr();
+}
+
+#endif // __CODE_INDEX_H__
index d4b4ad3..6331978 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "Optimizations.h"
+#include "CodeIndex.h"
 
 #include <cassert>
 
@@ -121,6 +122,7 @@ bool hoistable(const coco::Shuffle *shuffle)
   return true;
 }
 
+// TODO Remove unused method
 std::map<coco::Instr *, uint32_t> make_sequence_map(const coco::Module *m)
 {
   std::map<coco::Instr *, uint32_t> res;
@@ -217,13 +219,11 @@ void hoist_object(enco::Code *code)
   //
   // Case 2
   //
-  auto sequence_map = make_sequence_map(m);
-
   for (uint32_t n = 0; n < m->entity()->bag()->size(); ++n)
   {
     auto bag = m->entity()->bag()->at(n);
 
-    std::map<uint32_t, coco::Shuffle *> collected;
+    std::map<CodeIndex, coco::Shuffle *> collected;
 
     for (auto reader : coco::readers(bag))
     {
@@ -231,7 +231,7 @@ void hoist_object(enco::Code *code)
       {
         if (auto shuffle = ins->asShuffle())
         {
-          collected[sequence_map.at(shuffle)] = shuffle;
+          collected[code_index(shuffle)] = shuffle;
         }
       }
     }