OSDN Git Service

MachineRegionInfo: Fix pass initialization
authorMatthias Braun <matze@braunis.de>
Sat, 18 Feb 2017 00:41:16 +0000 (00:41 +0000)
committerMatthias Braun <matze@braunis.de>
Sat, 18 Feb 2017 00:41:16 +0000 (00:41 +0000)
- Adapt MachineBasicBlock::getName() to have the same behavior as the IR
  BasicBlock (Value::getName()).
- Add it to lib/CodeGen/CodeGen.cpp::initializeCodeGen so that it is linked in
  the CodeGen library.
- MachineRegionInfoPass's name conflicts with RegionInfoPass's name ("region").
- MachineRegionInfo should depend on MachineDominatorTree,
  MachinePostDominatorTree and MachineDominanceFrontier instead of their
  respective IR versions.
- Since there were no tests for this, add a X86 MIR test.

Patch by Francis Visoiu Mistrih<fvisoiumistrih@apple.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295518 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineBasicBlock.h
lib/CodeGen/CodeGen.cpp
lib/CodeGen/MachineBasicBlock.cpp
lib/CodeGen/MachineRegionInfo.cpp
test/CodeGen/X86/machine-region-info.mir [new file with mode: 0644]

index ff9544c..6f3f4ff 100644 (file)
@@ -128,7 +128,7 @@ public:
   /// to an LLVM basic block.
   const BasicBlock *getBasicBlock() const { return BB; }
 
-  /// Return the name of the corresponding LLVM basic block, or "(null)".
+  /// Return the name of the corresponding LLVM basic block, or an empty string.
   StringRef getName() const;
 
   /// Return a formatted string to identify this block and its parent function.
index 9fb796a..25a865a 100644 (file)
@@ -58,6 +58,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
   initializeMachineModuleInfoPass(Registry);
   initializeMachinePipelinerPass(Registry);
   initializeMachinePostDominatorTreePass(Registry);
+  initializeMachineRegionInfoPassPass(Registry);
   initializeMachineSchedulerPass(Registry);
   initializeMachineSinkingPass(Registry);
   initializeMachineVerifierPassPass(Registry);
index 4e91bb0..cbb6970 100644 (file)
@@ -232,7 +232,7 @@ StringRef MachineBasicBlock::getName() const {
   if (const BasicBlock *LBB = getBasicBlock())
     return LBB->getName();
   else
-    return "(null)";
+    return StringRef("", 0);
 }
 
 /// Return a hopefully unique identifier for this block.
index fc32183..254eb44 100644 (file)
@@ -4,7 +4,7 @@
 #include "llvm/Analysis/RegionInfoImpl.h"
 #include "llvm/CodeGen/MachinePostDominators.h"
 
-#define DEBUG_TYPE "region"
+#define DEBUG_TYPE "machine-region-info"
 
 using namespace llvm;
 
@@ -86,6 +86,9 @@ bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
   auto DF = &getAnalysis<MachineDominanceFrontier>();
 
   RI.recalculate(F, DT, PDT, DF);
+
+  DEBUG(RI.dump());
+
   return false;
 }
 
@@ -103,9 +106,10 @@ void MachineRegionInfoPass::verifyAnalysis() const {
 
 void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesAll();
-  AU.addRequiredTransitive<DominatorTreeWrapperPass>();
-  AU.addRequired<PostDominatorTreeWrapperPass>();
-  AU.addRequired<DominanceFrontierWrapperPass>();
+  AU.addRequired<MachineDominatorTree>();
+  AU.addRequired<MachinePostDominatorTree>();
+  AU.addRequired<MachineDominanceFrontier>();
+  MachineFunctionPass::getAnalysisUsage(AU);
 }
 
 void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
@@ -120,13 +124,13 @@ LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const {
 
 char MachineRegionInfoPass::ID = 0;
 
-INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, "regions",
-                "Detect single entry single exit regions", true, true)
+INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
+                      "Detect single entry single exit regions", true, true)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
 INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
 INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
-INITIALIZE_PASS_END(MachineRegionInfoPass, "regions",
-                "Detect single entry single exit regions", true, true)
+INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
+                    "Detect single entry single exit regions", true, true)
 
 // Create methods available outside of this file, to use them
 // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
diff --git a/test/CodeGen/X86/machine-region-info.mir b/test/CodeGen/X86/machine-region-info.mir
new file mode 100644 (file)
index 0000000..b2037d4
--- /dev/null
@@ -0,0 +1,86 @@
+# RUN: llc -run-pass=machine-region-info %s -debug-only=machine-region-info -o /dev/null 2>&1 | FileCheck %s
+
+--- |
+  define void @fun() { ret void }
+...
+---
+name:            fun
+body:             |
+  bb.0:
+    successors: %bb.1(0x40000000), %bb.7(0x40000000)
+
+    CMP32ri8 %edi, 40, implicit-def %eflags
+    JNE_1 %bb.7, implicit killed %eflags
+    JMP_1 %bb.1
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.11(0x40000000)
+
+    CMP32ri8 %edi, 1, implicit-def %eflags
+    JNE_1 %bb.11, implicit killed %eflags
+    JMP_1 %bb.2
+
+  bb.2:
+    successors: %bb.3(0x40000000), %bb.5(0x40000000)
+
+    CMP32ri8 %edi, 2, implicit-def %eflags
+    JNE_1 %bb.5, implicit killed %eflags
+    JMP_1 %bb.3
+
+  bb.3:
+    successors: %bb.4(0x40000000), %bb.5(0x40000000)
+
+    CMP32ri8 %edi, 90, implicit-def %eflags
+    JNE_1 %bb.5, implicit killed %eflags
+    JMP_1 %bb.4
+
+  bb.4:
+    successors: %bb.5(0x80000000)
+
+  bb.5:
+    successors: %bb.6(0x40000000), %bb.11(0x40000000)
+
+    CMP32ri8 %edi, 4, implicit-def %eflags
+    JNE_1 %bb.11, implicit killed %eflags
+    JMP_1 %bb.6
+
+  bb.6:
+    successors: %bb.11(0x80000000)
+
+    JMP_1 %bb.11
+
+  bb.7:
+    successors: %bb.9(0x40000000), %bb.8(0x40000000)
+
+    CMP32ri8 %edi, 5, implicit-def %eflags
+    JE_1 %bb.9, implicit killed %eflags
+    JMP_1 %bb.8
+
+  bb.8:
+    successors: %bb.9(0x80000000)
+
+  bb.9:
+    successors: %bb.11(0x40000000), %bb.10(0x40000000)
+
+    CMP32ri8 %edi, 6, implicit-def %eflags
+    JE_1 %bb.11, implicit killed %eflags
+    JMP_1 %bb.10
+
+  bb.10:
+    successors: %bb.11(0x80000000)
+
+  bb.11:
+    RET 0
+
+...
+
+# CHECK: Region tree:
+# CHECK-NEXT: [0] BB#0 => <Function Return>
+# CHECK-NEXT:   [1] BB#0 => BB#11
+# CHECK-NEXT:     [2] BB#1 => BB#11
+# CHECK-NEXT:       [3] BB#2 => BB#5
+# CHECK-NEXT:         [4] BB#3 => BB#5
+# CHECK-NEXT:       [3] BB#5 => BB#11
+# CHECK-NEXT:     [2] BB#7 => BB#9
+# CHECK-NEXT:     [2] BB#9 => BB#11
+# CHECK-NEXT: End region tree