Deleted Added
full compact
PHIElimination.cpp (199481) PHIElimination.cpp (199511)
1//===-- PhiElimination.cpp - Eliminate PHI nodes by inserting copies ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//

--- 7 unchanged lines hidden (view full) ---

16#define DEBUG_TYPE "phielim"
17#include "PHIElimination.h"
18#include "llvm/CodeGen/LiveVariables.h"
19#include "llvm/CodeGen/Passes.h"
20#include "llvm/CodeGen/MachineDominators.h"
21#include "llvm/CodeGen/MachineInstr.h"
22#include "llvm/CodeGen/MachineInstrBuilder.h"
23#include "llvm/CodeGen/MachineRegisterInfo.h"
1//===-- PhiElimination.cpp - Eliminate PHI nodes by inserting copies ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//

--- 7 unchanged lines hidden (view full) ---

16#define DEBUG_TYPE "phielim"
17#include "PHIElimination.h"
18#include "llvm/CodeGen/LiveVariables.h"
19#include "llvm/CodeGen/Passes.h"
20#include "llvm/CodeGen/MachineDominators.h"
21#include "llvm/CodeGen/MachineInstr.h"
22#include "llvm/CodeGen/MachineInstrBuilder.h"
23#include "llvm/CodeGen/MachineRegisterInfo.h"
24#include "llvm/CodeGen/RegAllocRegistry.h"
25#include "llvm/Function.h"
26#include "llvm/Target/TargetMachine.h"
27#include "llvm/ADT/SmallPtrSet.h"
28#include "llvm/ADT/STLExtras.h"
29#include "llvm/ADT/Statistic.h"
30#include "llvm/Support/CommandLine.h"
31#include "llvm/Support/Compiler.h"
32#include "llvm/Support/Debug.h"
33#include <algorithm>
34#include <map>
35using namespace llvm;
36
37STATISTIC(NumAtomic, "Number of atomic phis lowered");
38STATISTIC(NumSplits, "Number of critical edges split on demand");
39
24#include "llvm/Function.h"
25#include "llvm/Target/TargetMachine.h"
26#include "llvm/ADT/SmallPtrSet.h"
27#include "llvm/ADT/STLExtras.h"
28#include "llvm/ADT/Statistic.h"
29#include "llvm/Support/CommandLine.h"
30#include "llvm/Support/Compiler.h"
31#include "llvm/Support/Debug.h"
32#include <algorithm>
33#include <map>
34using namespace llvm;
35
36STATISTIC(NumAtomic, "Number of atomic phis lowered");
37STATISTIC(NumSplits, "Number of critical edges split on demand");
38
40static cl::opt<bool>
41SplitEdges("split-phi-edges",
42 cl::desc("Split critical edges during phi elimination"),
43 cl::init(false), cl::Hidden);
44
45char PHIElimination::ID = 0;
46static RegisterPass<PHIElimination>
47X("phi-node-elimination", "Eliminate PHI nodes for register allocation");
48
49const PassInfo *const llvm::PHIEliminationID = &X;
50
39char PHIElimination::ID = 0;
40static RegisterPass<PHIElimination>
41X("phi-node-elimination", "Eliminate PHI nodes for register allocation");
42
43const PassInfo *const llvm::PHIEliminationID = &X;
44
51namespace llvm { FunctionPass *createLocalRegisterAllocator(); }
52
53// Should we run edge splitting?
54static bool shouldSplitEdges() {
55 // Edge splitting breaks the local register allocator. It cannot tolerate
56 // LiveVariables being run.
57 if (RegisterRegAlloc::getDefault() == createLocalRegisterAllocator)
58 return false;
59 return SplitEdges;
60}
61
62void llvm::PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const {
63 AU.addPreserved<LiveVariables>();
64 AU.addPreserved<MachineDominatorTree>();
45void llvm::PHIElimination::getAnalysisUsage(AnalysisUsage &AU) const {
46 AU.addPreserved<LiveVariables>();
47 AU.addPreserved<MachineDominatorTree>();
65 if (shouldSplitEdges()) {
66 AU.addRequired<LiveVariables>();
67 } else {
68 AU.setPreservesCFG();
69 AU.addPreservedID(MachineLoopInfoID);
70 }
48 // rdar://7401784 This would be nice:
49 // AU.addPreservedID(MachineLoopInfoID);
71 MachineFunctionPass::getAnalysisUsage(AU);
72}
73
74bool llvm::PHIElimination::runOnMachineFunction(MachineFunction &Fn) {
75 MRI = &Fn.getRegInfo();
76
77 PHIDefs.clear();
78 PHIKills.clear();
79 bool Changed = false;
80
81 // Split critical edges to help the coalescer
50 MachineFunctionPass::getAnalysisUsage(AU);
51}
52
53bool llvm::PHIElimination::runOnMachineFunction(MachineFunction &Fn) {
54 MRI = &Fn.getRegInfo();
55
56 PHIDefs.clear();
57 PHIKills.clear();
58 bool Changed = false;
59
60 // Split critical edges to help the coalescer
82 if (shouldSplitEdges())
61 if (LiveVariables *LV = getAnalysisIfAvailable<LiveVariables>())
83 for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
62 for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
84 Changed |= SplitPHIEdges(Fn, *I);
63 Changed |= SplitPHIEdges(Fn, *I, *LV);
85
86 // Populate VRegPHIUseCount
87 analyzePHINodes(Fn);
88
89 // Eliminate PHI instructions by inserting copies into predecessor blocks.
90 for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
91 Changed |= EliminatePHINodes(Fn, *I);
92

--- 263 unchanged lines hidden (view full) ---

356 for (MachineBasicBlock::const_iterator BBI = I->begin(), BBE = I->end();
357 BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI)
358 for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
359 ++VRegPHIUseCount[BBVRegPair(BBI->getOperand(i + 1).getMBB(),
360 BBI->getOperand(i).getReg())];
361}
362
363bool llvm::PHIElimination::SplitPHIEdges(MachineFunction &MF,
64
65 // Populate VRegPHIUseCount
66 analyzePHINodes(Fn);
67
68 // Eliminate PHI instructions by inserting copies into predecessor blocks.
69 for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
70 Changed |= EliminatePHINodes(Fn, *I);
71

--- 263 unchanged lines hidden (view full) ---

335 for (MachineBasicBlock::const_iterator BBI = I->begin(), BBE = I->end();
336 BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI)
337 for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
338 ++VRegPHIUseCount[BBVRegPair(BBI->getOperand(i + 1).getMBB(),
339 BBI->getOperand(i).getReg())];
340}
341
342bool llvm::PHIElimination::SplitPHIEdges(MachineFunction &MF,
364 MachineBasicBlock &MBB) {
343 MachineBasicBlock &MBB,
344 LiveVariables &LV) {
365 if (MBB.empty() || MBB.front().getOpcode() != TargetInstrInfo::PHI)
366 return false; // Quick exit for basic blocks without PHIs.
345 if (MBB.empty() || MBB.front().getOpcode() != TargetInstrInfo::PHI)
346 return false; // Quick exit for basic blocks without PHIs.
367 LiveVariables &LV = getAnalysis<LiveVariables>();
347
368 for (MachineBasicBlock::const_iterator BBI = MBB.begin(), BBE = MBB.end();
369 BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI) {
370 for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2) {
371 unsigned Reg = BBI->getOperand(i).getReg();
372 MachineBasicBlock *PreMBB = BBI->getOperand(i+1).getMBB();
373 // We break edges when registers are live out from the predecessor block
374 // (not considering PHI nodes). If the register is live in to this block
375 // anyway, we would gain nothing from splitting.

--- 117 unchanged lines hidden ---
348 for (MachineBasicBlock::const_iterator BBI = MBB.begin(), BBE = MBB.end();
349 BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI) {
350 for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2) {
351 unsigned Reg = BBI->getOperand(i).getReg();
352 MachineBasicBlock *PreMBB = BBI->getOperand(i+1).getMBB();
353 // We break edges when registers are live out from the predecessor block
354 // (not considering PHI nodes). If the register is live in to this block
355 // anyway, we would gain nothing from splitting.

--- 117 unchanged lines hidden ---