summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/CodeGen/MachineBasicBlock.h2
-rw-r--r--llvm/lib/CodeGen/CodeGen.cpp1
-rw-r--r--llvm/lib/CodeGen/MachineBasicBlock.cpp2
-rw-r--r--llvm/lib/CodeGen/MachineRegionInfo.cpp20
-rw-r--r--llvm/test/CodeGen/X86/machine-region-info.mir86
5 files changed, 101 insertions, 10 deletions
diff --git a/llvm/include/llvm/CodeGen/MachineBasicBlock.h b/llvm/include/llvm/CodeGen/MachineBasicBlock.h
index ff9544c94ab..6f3f4ff4563 100644
--- a/llvm/include/llvm/CodeGen/MachineBasicBlock.h
+++ b/llvm/include/llvm/CodeGen/MachineBasicBlock.h
@@ -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.
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp
index 9fb796a6d20..25a865a0119 100644
--- a/llvm/lib/CodeGen/CodeGen.cpp
+++ b/llvm/lib/CodeGen/CodeGen.cpp
@@ -58,6 +58,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
initializeMachineModuleInfoPass(Registry);
initializeMachinePipelinerPass(Registry);
initializeMachinePostDominatorTreePass(Registry);
+ initializeMachineRegionInfoPassPass(Registry);
initializeMachineSchedulerPass(Registry);
initializeMachineSinkingPass(Registry);
initializeMachineVerifierPassPass(Registry);
diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp
index 4e91bb07aed..cbb69702269 100644
--- a/llvm/lib/CodeGen/MachineBasicBlock.cpp
+++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp
@@ -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.
diff --git a/llvm/lib/CodeGen/MachineRegionInfo.cpp b/llvm/lib/CodeGen/MachineRegionInfo.cpp
index fc32183c7f6..254eb44d991 100644
--- a/llvm/lib/CodeGen/MachineRegionInfo.cpp
+++ b/llvm/lib/CodeGen/MachineRegionInfo.cpp
@@ -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/llvm/test/CodeGen/X86/machine-region-info.mir b/llvm/test/CodeGen/X86/machine-region-info.mir
new file mode 100644
index 00000000000..b2037d4f6f0
--- /dev/null
+++ b/llvm/test/CodeGen/X86/machine-region-info.mir
@@ -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
OpenPOWER on IntegriCloud