[llvm-commits] [llvm] r43542 - in /llvm/trunk: include/llvm/CodeGen/Passes.h lib/CodeGen/StrongPHIElimination.cpp
Owen Anderson
resistor at mac.com
Tue Oct 30 20:37:57 PDT 2007
Author: resistor
Date: Tue Oct 30 22:37:57 2007
New Revision: 43542
URL: http://llvm.org/viewvc/llvm-project?rev=43542&view=rev
Log:
Add the skeleton of a better PHI elimination pass.
Added:
llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Modified:
llvm/trunk/include/llvm/CodeGen/Passes.h
Modified: llvm/trunk/include/llvm/CodeGen/Passes.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/Passes.h?rev=43542&r1=43541&r2=43542&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/Passes.h (original)
+++ llvm/trunk/include/llvm/CodeGen/Passes.h Tue Oct 30 22:37:57 2007
@@ -44,6 +44,14 @@
/// these register allocator like this: AU.addRequiredID(PHIEliminationID);
///
extern const PassInfo *PHIEliminationID;
+
+ /// StrongPHIElimination pass - This pass eliminates machine instruction PHI
+ /// nodes by inserting copy instructions. This destroys SSA information, but
+ /// is the desired input for some register allocators. This pass is
+ /// "required" by these register allocator like this:
+ /// AU.addRequiredID(PHIEliminationID);
+ /// This pass is still in development
+ extern const PassInfo *StrongPHIEliminationID;
/// SimpleRegisterCoalescing pass. Aggressively coalesces every register
/// copy it can.
Added: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp?rev=43542&view=auto
==============================================================================
--- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (added)
+++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Oct 30 22:37:57 2007
@@ -0,0 +1,112 @@
+//===- StrongPhiElimination.cpp - Eliminate PHI nodes by inserting copies -===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Owen Anderson and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This pass eliminates machine instruction PHI nodes by inserting copy
+// instructions, using an intelligent copy-folding technique based on
+// dominator information. This is technique is derived from:
+//
+// Budimlic, et al. Fast copy coalescing and live-range identification.
+// In Proceedings of the ACM SIGPLAN 2002 Conference on Programming Language
+// Design and Implementation (Berlin, Germany, June 17 - 19, 2002).
+// PLDI '02. ACM, New York, NY, 25-32.
+// DOI= http://doi.acm.org/10.1145/512529.512534
+//
+//===----------------------------------------------------------------------===//
+
+#define DEBUG_TYPE "strongphielim"
+#include "llvm/CodeGen/Passes.h"
+#include "llvm/CodeGen/MachineDominators.h"
+#include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/Support/Compiler.h"
+using namespace llvm;
+
+
+namespace {
+ struct VISIBILITY_HIDDEN StrongPHIElimination : public MachineFunctionPass {
+ static char ID; // Pass identification, replacement for typeid
+ StrongPHIElimination() : MachineFunctionPass((intptr_t)&ID) {}
+
+ bool runOnMachineFunction(MachineFunction &Fn) {
+ computeDFS(Fn);
+
+
+ return false;
+ }
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<MachineDominatorTree>();
+ MachineFunctionPass::getAnalysisUsage(AU);
+ }
+
+ virtual void releaseMemory() {
+ preorder.clear();
+ maxpreorder.clear();
+ }
+
+ private:
+ DenseMap<MachineBasicBlock*, unsigned> preorder;
+ DenseMap<MachineBasicBlock*, unsigned> maxpreorder;
+
+ void computeDFS(MachineFunction& MF);
+ };
+
+ char StrongPHIElimination::ID = 0;
+ RegisterPass<StrongPHIElimination> X("strong-phi-node-elimination",
+ "Eliminate PHI nodes for register allocation, intelligently");
+}
+
+const PassInfo *llvm::StrongPHIEliminationID = X.getPassInfo();
+
+/// computeDFS - Computes the DFS-in and DFS-out numbers of the dominator tree
+/// of the given MachineFunction. These numbers are then used in other parts
+/// of the PHI elimination process.
+void StrongPHIElimination::computeDFS(MachineFunction& MF) {
+ SmallPtrSet<MachineDomTreeNode*, 8> frontier;
+ SmallPtrSet<MachineDomTreeNode*, 8> visited;
+
+ unsigned time = 0;
+
+ MachineDominatorTree& DT = getAnalysis<MachineDominatorTree>();
+
+ MachineDomTreeNode* node = DT.getRootNode();
+
+ std::vector<MachineDomTreeNode*> worklist;
+ worklist.push_back(node);
+
+ while (!worklist.empty()) {
+ MachineDomTreeNode* currNode = worklist.back();
+
+ if (!frontier.count(currNode)) {
+ frontier.insert(currNode);
+ ++time;
+ preorder.insert(std::make_pair(currNode->getBlock(), time));
+ }
+
+ bool inserted = false;
+ for (MachineDomTreeNode::iterator I = node->begin(), E = node->end();
+ I != E; ++I)
+ if (!frontier.count(*I) && !visited.count(*I)) {
+ worklist.push_back(*I);
+ inserted = true;
+ break;
+ }
+
+ if (!inserted) {
+ frontier.erase(currNode);
+ visited.insert(currNode);
+ maxpreorder.insert(std::make_pair(currNode->getBlock(), time));
+
+ worklist.pop_back();
+ }
+ }
+}
\ No newline at end of file
More information about the llvm-commits
mailing list