Index: lib/CodeGen/CodeGen.cpp =================================================================== --- lib/CodeGen/CodeGen.cpp +++ lib/CodeGen/CodeGen.cpp @@ -58,6 +58,7 @@ initializeMachineModuleInfoPass(Registry); initializeMachinePipelinerPass(Registry); initializeMachinePostDominatorTreePass(Registry); + initializeMachineRegionInfoPassPass(Registry); initializeMachineSchedulerPass(Registry); initializeMachineSinkingPass(Registry); initializeMachineVerifierPassPass(Registry); Index: lib/CodeGen/MachineRegionInfo.cpp =================================================================== --- lib/CodeGen/MachineRegionInfo.cpp +++ 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 "machineregions" using namespace llvm; @@ -86,6 +86,9 @@ auto DF = &getAnalysis(); RI.recalculate(F, DT, PDT, DF); + + DEBUG(RI.dump()); + return false; } @@ -103,9 +106,10 @@ void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); - AU.addRequiredTransitive(); - AU.addRequired(); - AU.addRequired(); + AU.addRequired(); + AU.addRequired(); + AU.addRequired(); + MachineFunctionPass::getAnalysisUsage(AU); } void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const { @@ -120,12 +124,12 @@ char MachineRegionInfoPass::ID = 0; -INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, "regions", +INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, "machineregions", "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", +INITIALIZE_PASS_END(MachineRegionInfoPass, "machineregions", "Detect single entry single exit regions", true, true) // Create methods available outside of this file, to use them Index: test/CodeGen/MIR/Generic/machine-region-info.ll =================================================================== --- /dev/null +++ test/CodeGen/MIR/Generic/machine-region-info.ll @@ -0,0 +1,76 @@ +; RUN: llc -stop-after virtregrewriter %s -o %t.mir +; RUN: llc -run-pass=machineregions %t.mir -debug-only=machineregions 2>&1 | FileCheck %s + +define i32 @fun(i32 %a) { +A: + %cmp0 = icmp eq i32 %a, 40 + br i1 %cmp0, label %B, label %I + +B: + %cmp1 = icmp eq i32 %a, 1 + br i1 %cmp1, label %C, label %H + +C: + %cmp2 = icmp eq i32 %a, 2 + br i1 %cmp2, label %D, label %F + +D: + %cmp3 = icmp eq i32 %a, 90 + br i1 %cmp3, label %E, label %F + +E: + call void @fun1(i32 100) + br label %F + +F: + %cmp4 = icmp eq i32 %a, 4 + br i1 %cmp4, label %G, label %H + +G: + call void @fun1(i32 300) + br label %H + +H: + br label %P + +I: + %cmp5 = icmp eq i32 %a, 5 + br i1 %cmp5, label %J, label %K + +J: + br label %L + +K: + call void @fun1(i32 400) + br label %L + +L: + %cmp6 = icmp eq i32 %a, 6 + br i1 %cmp6, label %M, label %N + +M: + br label %O + +N: + call void @fun1(i32 500) + br label %O + +O: + br label %P + +P: + ret i32 %a +} + +declare void @fun1(i32 %a) + +; CHECK: Region tree: +; CHECK-NEXT: [0] A => +; CHECK-NEXT: [1] A => P +; CHECK-NEXT: [2] B => P +; CHECK-NEXT: [3] C => F +; CHECK-NEXT: [4] D => F +; CHECK-NEXT: [3] F => P +; CHECK-NEXT: [2] I => L +; CHECK-NEXT: [2] L => P +; CHECK-NEXT: End region tree