PHIElimination.cpp revision 4d7af65903cbc858464362e70a6adf499982ec8a
1bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner//===-- PhiElimination.cpp - Eliminate PHI nodes by inserting copies ------===//
2b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under
6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
9bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner//
10bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner// This pass eliminates machine instruction PHI nodes by inserting copy
11bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner// instructions.  This destroys SSA information, but is the desired input for
12bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner// some register allocators.
13bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner//
14bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner//===----------------------------------------------------------------------===//
15bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
16bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "llvm/CodeGen/MachineFunctionPass.h"
17bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "llvm/CodeGen/MachineInstr.h"
18bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "llvm/CodeGen/SSARegMap.h"
19bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "llvm/CodeGen/LiveVariables.h"
203501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h"
21bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "llvm/Target/TargetMachine.h"
22572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner#include "llvm/Support/CFG.h"
23bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
26bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattnernamespace {
27bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  struct PNE : public MachineFunctionPass {
28bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    bool runOnMachineFunction(MachineFunction &Fn) {
29bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      bool Changed = false;
30bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
31bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      // Eliminate PHI instructions by inserting copies into predecessor blocks.
32bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      //
33bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
34bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner	Changed |= EliminatePHINodes(Fn, *I);
35bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
36bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      //std::cerr << "AFTER PHI NODE ELIM:\n";
37bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      //Fn.dump();
38bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      return Changed;
39bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    }
40bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
41bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
42bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      AU.addPreserved<LiveVariables>();
43bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      MachineFunctionPass::getAnalysisUsage(AU);
44bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    }
45bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
46bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  private:
47bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    /// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions
48bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    /// in predecessor basic blocks.
49bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    ///
50bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    bool EliminatePHINodes(MachineFunction &MF, MachineBasicBlock &MBB);
51bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  };
52bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
53bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  RegisterPass<PNE> X("phi-node-elimination",
54bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner		      "Eliminate PHI nodes for register allocation");
55bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner}
56bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
57d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
58bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattnerconst PassInfo *PHIEliminationID = X.getPassInfo();
59bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
60bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner/// EliminatePHINodes - Eliminate phi nodes by inserting copy instructions in
61bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner/// predecessor basic blocks.
62bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner///
63bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattnerbool PNE::EliminatePHINodes(MachineFunction &MF, MachineBasicBlock &MBB) {
640416d2a70aea644c3e0c06301c29f3b81ec1e42dChris Lattner  if (MBB.empty() || MBB.front()->getOpcode() != TargetInstrInfo::PHI)
65bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    return false;   // Quick exit for normal case...
66bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
67bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  LiveVariables *LV = getAnalysisToUpdate<LiveVariables>();
68bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  const TargetInstrInfo &MII = MF.getTarget().getInstrInfo();
69bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  const MRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
70bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
71bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  while (MBB.front()->getOpcode() == TargetInstrInfo::PHI) {
72bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    MachineInstr *MI = MBB.front();
73bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    // Unlink the PHI node from the basic block... but don't delete the PHI yet
74bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    MBB.erase(MBB.begin());
75bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
76bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    assert(MI->getOperand(0).isVirtualRegister() &&
77bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner           "PHI node doesn't write virt reg?");
78bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
79bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    unsigned DestReg = MI->getOperand(0).getAllocatedRegNum();
80bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
81bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    // Create a new register for the incoming PHI arguments
82bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    const TargetRegisterClass *RC = MF.getSSARegMap()->getRegClass(DestReg);
83bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    unsigned IncomingReg = MF.getSSARegMap()->createVirtualRegister(RC);
84bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
85927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner    // Insert a register to register copy in the top of the current block (but
86bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    // after any remaining phi nodes) which copies the new incoming register
87bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    // into the phi node destination.
88bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    //
89bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    MachineBasicBlock::iterator AfterPHIsIt = MBB.begin();
90a13f0d3f4159b1f54bcfc733ccd94977b020ea56Chris Lattner    while (AfterPHIsIt != MBB.end() &&
91a13f0d3f4159b1f54bcfc733ccd94977b020ea56Chris Lattner           (*AfterPHIsIt)->getOpcode() == TargetInstrInfo::PHI)
92a13f0d3f4159b1f54bcfc733ccd94977b020ea56Chris Lattner      ++AfterPHIsIt;    // Skip over all of the PHI nodes...
93bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    RegInfo->copyRegToReg(MBB, AfterPHIsIt, DestReg, IncomingReg, RC);
94927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner
95927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner    // Update live variable information if there is any...
96927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner    if (LV) {
97927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      MachineInstr *PHICopy = *(AfterPHIsIt-1);
98927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner
99927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      // Add information to LiveVariables to know that the incoming value is
100b52e0241c03a257f96bd9c77788eff5b1a7fd437Chris Lattner      // killed.  Note that because the value is defined in several places (once
101b52e0241c03a257f96bd9c77788eff5b1a7fd437Chris Lattner      // each for each incoming block), the "def" block and instruction fields
102b52e0241c03a257f96bd9c77788eff5b1a7fd437Chris Lattner      // for the VarInfo is not filled in.
103927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      //
104b52e0241c03a257f96bd9c77788eff5b1a7fd437Chris Lattner      LV->addVirtualRegisterKilled(IncomingReg, &MBB, PHICopy);
105bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
106927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      // Since we are going to be deleting the PHI node, if it is the last use
107927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      // of any registers, or if the value itself is dead, we need to move this
108927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      // information over to the new copy we just inserted...
109927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      //
110927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      std::pair<LiveVariables::killed_iterator, LiveVariables::killed_iterator>
111927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner        RKs = LV->killed_range(MI);
112572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner      std::vector<std::pair<MachineInstr*, unsigned> > Range;
113927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      if (RKs.first != RKs.second) {
114572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        // Copy the range into a vector...
115572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        Range.assign(RKs.first, RKs.second);
116572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner
117572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        // Delete the range...
118927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner        LV->removeVirtualRegistersKilled(RKs.first, RKs.second);
119572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner
120572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        // Add all of the kills back, which will update the appropriate info...
121572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        for (unsigned i = 0, e = Range.size(); i != e; ++i)
122572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          LV->addVirtualRegisterKilled(Range[i].second, &MBB, PHICopy);
123927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      }
124927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner
125927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      RKs = LV->dead_range(MI);
126927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      if (RKs.first != RKs.second) {
127572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        // Works as above...
128572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        Range.assign(RKs.first, RKs.second);
129927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner        LV->removeVirtualRegistersDead(RKs.first, RKs.second);
130572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        for (unsigned i = 0, e = Range.size(); i != e; ++i)
131572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          LV->addVirtualRegisterDead(Range[i].second, &MBB, PHICopy);
132927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      }
133927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner    }
134bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
135927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner    // Now loop over all of the incoming arguments, changing them to copy into
136bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    // the IncomingReg register in the corresponding predecessor basic block.
137bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    //
138bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    for (int i = MI->getNumOperands() - 1; i >= 2; i-=2) {
139bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      MachineOperand &opVal = MI->getOperand(i-1);
140bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
141bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      // Get the MachineBasicBlock equivalent of the BasicBlock that is the
142927ce5dfaea00453889080cd1c6daf3eb197ad74Chris Lattner      // source path the PHI.
143bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      MachineBasicBlock &opBlock = *MI->getOperand(i).getMachineBasicBlock();
144bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
14598719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      // Figure out where to insert the copy, which is at the end of the
14698719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      // predecessor basic block, but before any terminator/branch
14798719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      // instructions...
14898719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      MachineBasicBlock::iterator I = opBlock.end();
14998719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      if (I != opBlock.begin()) {  // Handle empty blocks
15098719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        --I;
15198719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        // must backtrack over ALL the branches in the previous block
15298719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        while (MII.isTerminatorInstr((*I)->getOpcode()) &&
15398719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner               I != opBlock.begin())
15498719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner          --I;
15598719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner
15698719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        // move back to the first branch instruction so new instructions
15798719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        // are inserted right in front of it and not in front of a non-branch
15898719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        if (!MII.isTerminatorInstr((*I)->getOpcode()))
15998719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner          ++I;
16098719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      }
16198719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner
162bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      // Check to make sure we haven't already emitted the copy for this block.
163bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      // This can happen because PHI nodes may have multiple entries for the
164bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      // same basic block.  It doesn't matter which entry we use though, because
165bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      // all incoming values are guaranteed to be the same for a particular bb.
166bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      //
16798719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      // If we emitted a copy for this basic block already, it will be right
16898719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      // where we want to insert one now.  Just check for a definition of the
16998719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      // register we are interested in!
170bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      //
171bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      bool HaveNotEmitted = true;
17298719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner
17398719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      if (I != opBlock.begin()) {
17498719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        MachineInstr *PrevInst = *(I-1);
17598719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        for (unsigned i = 0, e = PrevInst->getNumOperands(); i != e; ++i) {
17698719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner          MachineOperand &MO = PrevInst->getOperand(i);
17798719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner          if (MO.isVirtualRegister() && MO.getReg() == IncomingReg)
1784d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos            if (MO.isDef()) {
17998719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner              HaveNotEmitted = false;
18098719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner              break;
18198719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner            }
182bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner        }
18398719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner      }
184bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
185572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner      if (HaveNotEmitted) { // If the copy has not already been emitted, do it.
18698719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner        assert(opVal.isVirtualRegister() &&
18798719d7cdc693c077d179fe3461ce625d6faef34Chris Lattner               "Machine PHI Operands must all be virtual registers!");
188572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        unsigned SrcReg = opVal.getReg();
189572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        RegInfo->copyRegToReg(opBlock, I, IncomingReg, SrcReg, RC);
190572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner
191572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        // Now update live variable information if we have it.
192572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        if (LV) {
193572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // We want to be able to insert a kill of the register if this PHI
194572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // (aka, the copy we just inserted) is the last use of the source
195572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // value.  Live variable analysis conservatively handles this by
196572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // saying that the value is live until the end of the block the PHI
197572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // entry lives in.  If the value really is dead at the PHI copy, there
198572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // will be no successor blocks which have the value live-in.
199572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          //
200572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // Check to see if the copy is the last use, and if so, update the
201572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // live variables information so that it knows the copy source
202572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // instruction kills the incoming value.
203572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          //
204572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          LiveVariables::VarInfo &InRegVI = LV->getVarInfo(SrcReg);
205572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner
20608d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner          // Loop over all of the successors of the basic block, checking to see
20708d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner          // if the value is either live in the block, or if it is killed in the
20808d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner          // block.  Also check to see if this register is in use by another PHI
20908d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner          // node which has not yet been eliminated.  If so, it will be killed
21008d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner          // at an appropriate point later.
211572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          //
212572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          bool ValueIsLive = false;
2139e2dd8f8d7c995721584d8c7add309e5d9cb1051Chris Lattner          const BasicBlock *BB = opBlock.getBasicBlock();
2149e2dd8f8d7c995721584d8c7add309e5d9cb1051Chris Lattner          for (succ_const_iterator SI = succ_begin(BB), E = succ_end(BB);
21508d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner               SI != E && !ValueIsLive; ++SI) {
216572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            const std::pair<MachineBasicBlock*, unsigned> &
217572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner              SuccInfo = LV->getBasicBlockInfo(*SI);
218572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner
219572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            // Is it alive in this successor?
220572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            unsigned SuccIdx = SuccInfo.second;
221572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            if (SuccIdx < InRegVI.AliveBlocks.size() &&
222572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner                InRegVI.AliveBlocks[SuccIdx]) {
223572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner              ValueIsLive = true;
224572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner              break;
225572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            }
226572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner
227572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            // Is it killed in this successor?
228572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            MachineBasicBlock *MBB = SuccInfo.first;
229572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            for (unsigned i = 0, e = InRegVI.Kills.size(); i != e; ++i)
230572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner              if (InRegVI.Kills[i].first == MBB) {
231572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner                ValueIsLive = true;
232572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner                break;
233572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner              }
23408d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner
23508d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner            // Is it used by any PHI instructions in this block?
23608d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner            if (ValueIsLive) break;
23708d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner
23808d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner            // Loop over all of the PHIs in this successor, checking to see if
23908d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner            // the register is being used...
24008d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner            for (MachineBasicBlock::iterator BBI = MBB->begin(), E=MBB->end();
24108d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner                 BBI != E && (*BBI)->getOpcode() == TargetInstrInfo::PHI;
24208d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner                 ++BBI)
24308d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner              for (unsigned i = 1, e = (*BBI)->getNumOperands(); i < e; i += 2)
24408d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner                if ((*BBI)->getOperand(i).getReg() == SrcReg) {
24508d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner                  ValueIsLive = true;
24608d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner                  break;
24708d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner                }
248572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          }
249572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner
250572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // Okay, if we now know that the value is not live out of the block,
251572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // we can add a kill marker to the copy we inserted saying that it
252572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          // kills the incoming value!
253572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner          //
25408d2e4e09adc53aa93c08c8327d2f5f2814acb74Chris Lattner          if (!ValueIsLive)
255572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner            LV->addVirtualRegisterKilled(SrcReg, &opBlock, *(I-1));
256572c77066808fc0e9ee1d212dab227f28bf5e28aChris Lattner        }
257bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner      }
258bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    }
259bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
260bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    // really delete the PHI instruction now!
261bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner    delete MI;
262bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  }
263bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner
264bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner  return true;
265bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner}
266d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
267d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
268