瀏覽代碼

[spirv] Use llvm::ilist to store instructions in BB. (#2011)

Ehsan 6 年之前
父節點
當前提交
d9d2f211dd

+ 11 - 1
tools/clang/include/clang/SPIRV/SpirvBasicBlock.h

@@ -15,12 +15,22 @@
 #include "clang/SPIRV/SpirvInstruction.h"
 #include "clang/SPIRV/SpirvInstruction.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/ilist.h"
+#include "llvm/ADT/ilist_node.h"
 
 
 namespace clang {
 namespace clang {
 namespace spirv {
 namespace spirv {
 
 
 class SpirvVisitor;
 class SpirvVisitor;
 
 
+class SpirvInstructionNode : public llvm::ilist_node<SpirvInstructionNode> {
+public:
+  SpirvInstructionNode() : instruction(nullptr) {}
+  SpirvInstructionNode(SpirvInstruction *instr) : instruction(instr) {}
+
+  SpirvInstruction *instruction;
+};
+
 /// The class representing a SPIR-V basic block in memory.
 /// The class representing a SPIR-V basic block in memory.
 class SpirvBasicBlock {
 class SpirvBasicBlock {
 public:
 public:
@@ -85,7 +95,7 @@ private:
   std::string labelName; ///< The label's debug name
   std::string labelName; ///< The label's debug name
 
 
   /// Instructions belonging to this basic block.
   /// Instructions belonging to this basic block.
-  std::vector<SpirvInstruction *> instructions;
+  llvm::ilist<SpirvInstructionNode> instructions;
 
 
   /// Successors to this basic block.
   /// Successors to this basic block.
   llvm::SmallVector<SpirvBasicBlock *, 2> successors;
   llvm::SmallVector<SpirvBasicBlock *, 2> successors;

+ 8 - 6
tools/clang/lib/SPIRV/SpirvBasicBlock.cpp

@@ -18,7 +18,8 @@ SpirvBasicBlock::SpirvBasicBlock(llvm::StringRef name)
       continueTarget(nullptr) {}
       continueTarget(nullptr) {}
 
 
 bool SpirvBasicBlock::hasTerminator() const {
 bool SpirvBasicBlock::hasTerminator() const {
-  return !instructions.empty() && isa<SpirvTerminator>(instructions.back());
+  return !instructions.empty() &&
+         isa<SpirvTerminator>(instructions.back().instruction);
 }
 }
 
 
 bool SpirvBasicBlock::invokeVisitor(Visitor *visitor,
 bool SpirvBasicBlock::invokeVisitor(Visitor *visitor,
@@ -28,9 +29,9 @@ bool SpirvBasicBlock::invokeVisitor(Visitor *visitor,
     return false;
     return false;
 
 
   if (reverseOrder) {
   if (reverseOrder) {
-    for (auto inst = instructions.rbegin(); inst != instructions.rend();
-         ++inst) {
-      if (!(*inst)->invokeVisitor(visitor))
+    for (auto iter = instructions.rbegin(); iter != instructions.rend();
+         ++iter) {
+      if (!iter->instruction->invokeVisitor(visitor))
         return false;
         return false;
     }
     }
     // If a basic block is the first basic block of a function, it should
     // If a basic block is the first basic block of a function, it should
@@ -47,9 +48,10 @@ bool SpirvBasicBlock::invokeVisitor(Visitor *visitor,
         if (!var->invokeVisitor(visitor))
         if (!var->invokeVisitor(visitor))
           return false;
           return false;
 
 
-    for (auto *inst : instructions)
-      if (!inst->invokeVisitor(visitor))
+    for (auto iter = instructions.begin(); iter != instructions.end(); ++iter) {
+      if (!iter->instruction->invokeVisitor(visitor))
         return false;
         return false;
+    }
   }
   }
 
 
   if (!visitor->visit(this, Visitor::Phase::Done))
   if (!visitor->visit(this, Visitor::Phase::Done))

+ 1 - 1
tools/clang/unittests/SPIRV/SpirvBasicBlockTest.cpp

@@ -24,7 +24,7 @@ TEST(SpirvBasicBlockTest, CheckName) {
 TEST(SpirvBasicBlockTest, CheckResultId) {
 TEST(SpirvBasicBlockTest, CheckResultId) {
   SpirvBasicBlock bb("myBasicBlock");
   SpirvBasicBlock bb("myBasicBlock");
   bb.setResultId(5);
   bb.setResultId(5);
-  EXPECT_EQ(bb.getResultId(), 5);
+  EXPECT_EQ(bb.getResultId(), 5u);
 }
 }
 
 
 TEST(SpirvBasicBlockTest, CheckMergeTarget) {
 TEST(SpirvBasicBlockTest, CheckMergeTarget) {