rename PPC::COND_BRANCH to PPC::BCC
[oota-llvm.git] / lib / Target / PowerPC / PPCBranchSelector.cpp
1 //===-- PPCBranchSelector.cpp - Emit long conditional branches-----*- C++ -*-=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Nate Baegeman and is distributed under the
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains a pass that scans a machine function to determine which
11 // conditional branches need more than 16 bits of displacement to reach their
12 // target basic block.  It does this in two passes; a calculation of basic block
13 // positions pass, and a branch psuedo op to machine branch opcode pass.  This
14 // pass should be run last, just before the assembly printer.
15 //
16 //===----------------------------------------------------------------------===//
17
18 #include "PPC.h"
19 #include "PPCInstrBuilder.h"
20 #include "PPCInstrInfo.h"
21 #include "PPCPredicates.h"
22 #include "llvm/CodeGen/MachineFunctionPass.h"
23 #include "llvm/Target/TargetMachine.h"
24 #include "llvm/Target/TargetAsmInfo.h"
25 #include "llvm/ADT/Statistic.h"
26 #include "llvm/Support/Compiler.h"
27 using namespace llvm;
28
29 static Statistic<> NumExpanded("ppc-branch-select",
30                                "Num branches expanded to long format");
31
32 namespace {
33   struct VISIBILITY_HIDDEN PPCBSel : public MachineFunctionPass {
34     /// OffsetMap - Mapping between BB # and byte offset from start of function.
35     std::vector<unsigned> OffsetMap;
36
37     virtual bool runOnMachineFunction(MachineFunction &Fn);
38
39     virtual const char *getPassName() const {
40       return "PowerPC Branch Selection";
41     }
42   };
43 }
44
45 /// createPPCBranchSelectionPass - returns an instance of the Branch Selection
46 /// Pass
47 ///
48 FunctionPass *llvm::createPPCBranchSelectionPass() {
49   return new PPCBSel();
50 }
51
52 /// getNumBytesForInstruction - Return the number of bytes of code the specified
53 /// instruction may be.  This returns the maximum number of bytes.
54 ///
55 static unsigned getNumBytesForInstruction(MachineInstr *MI) {
56   switch (MI->getOpcode()) {
57   case PPC::BCC:
58     // while this will be 4 most of the time, if we emit 8 it is just a
59     // minor pessimization that saves us from having to worry about
60     // keeping the offsets up to date later when we emit long branch glue.
61     return 8;
62   case PPC::IMPLICIT_DEF_GPRC: // no asm emitted
63   case PPC::IMPLICIT_DEF_G8RC: // no asm emitted
64   case PPC::IMPLICIT_DEF_F4:   // no asm emitted
65   case PPC::IMPLICIT_DEF_F8:   // no asm emitted
66   case PPC::IMPLICIT_DEF_VRRC: // no asm emitted
67     return 0;
68   case PPC::INLINEASM: {       // Inline Asm: Variable size.
69     MachineFunction *MF = MI->getParent()->getParent();
70     const char *AsmStr = MI->getOperand(0).getSymbolName();
71     return MF->getTarget().getTargetAsmInfo()->getInlineAsmLength(AsmStr);
72   }
73   default:
74     return 4; // PowerPC instructions are all 4 bytes
75   }
76 }
77
78
79 bool PPCBSel::runOnMachineFunction(MachineFunction &Fn) {
80   // Running total of instructions encountered since beginning of function
81   unsigned ByteCount = 0;
82   
83   OffsetMap.resize(Fn.getNumBlockIDs());
84   
85   // For each MBB, add its offset to the offset map, and count up its
86   // instructions
87   for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;
88        ++MFI) {
89     MachineBasicBlock *MBB = MFI;
90     OffsetMap[MBB->getNumber()] = ByteCount;
91     
92     for (MachineBasicBlock::iterator MBBI = MBB->begin(), EE = MBB->end();
93          MBBI != EE; ++MBBI)
94       ByteCount += getNumBytesForInstruction(MBBI);
95   }
96   
97   // We're about to run over the MBB's again, so reset the ByteCount
98   ByteCount = 0;
99   
100   // For each MBB, find the conditional branch pseudo instructions, and
101   // calculate the difference between the target MBB and the current ICount
102   // to decide whether or not to emit a short or long branch.
103   //
104   // short branch:
105   // bCC .L_TARGET_MBB
106   //
107   // long branch:
108   // bInverseCC $PC+8
109   // b .L_TARGET_MBB
110   for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;
111        ++MFI) {
112     MachineBasicBlock *MBB = MFI;
113     
114     for (MachineBasicBlock::iterator MBBI = MBB->begin(), EE = MBB->end();
115          MBBI != EE; ++MBBI) {
116       // We may end up deleting the MachineInstr that MBBI points to, so
117       // remember its opcode now so we can refer to it after calling erase()
118       unsigned ByteSize = getNumBytesForInstruction(MBBI);
119       if (MBBI->getOpcode() != PPC::BCC) {
120         ByteCount += ByteSize;
121         continue;
122       }
123       
124       // condbranch operands:
125       // 0. CR register
126       // 1. PPC branch opcode
127       // 2. Target MBB
128       MachineBasicBlock *DestMBB = MBBI->getOperand(2).getMachineBasicBlock();
129       PPC::Predicate Pred = (PPC::Predicate)MBBI->getOperand(1).getImm();
130       unsigned CRReg = MBBI->getOperand(0).getReg();
131       int Displacement = OffsetMap[DestMBB->getNumber()] - ByteCount;
132
133       bool ShortBranchOk = Displacement >= -32768 && Displacement <= 32767;
134       
135       // Branch on opposite condition if a short branch isn't ok.
136       if (!ShortBranchOk)
137         Pred = PPC::InvertPredicate(Pred);
138         
139       unsigned Opcode;
140       switch (Pred) {
141       default: assert(0 && "Unknown cond branch predicate!");
142       case PPC::PRED_LT: Opcode = PPC::BLT; break;
143       case PPC::PRED_LE: Opcode = PPC::BLE; break;
144       case PPC::PRED_EQ: Opcode = PPC::BEQ; break;
145       case PPC::PRED_GE: Opcode = PPC::BGE; break;
146       case PPC::PRED_GT: Opcode = PPC::BGT; break;
147       case PPC::PRED_NE: Opcode = PPC::BNE; break;
148       case PPC::PRED_UN: Opcode = PPC::BUN; break;
149       case PPC::PRED_NU: Opcode = PPC::BNU; break;
150       }
151       
152       MachineBasicBlock::iterator MBBJ;
153       if (ShortBranchOk) {
154         MBBJ = BuildMI(*MBB, MBBI, Opcode, 2).addReg(CRReg).addMBB(DestMBB);
155       } else {
156         // Long branch, skip next branch instruction (i.e. $PC+8).
157         ++NumExpanded;
158         BuildMI(*MBB, MBBI, Opcode, 2).addReg(CRReg).addImm(2);
159         MBBJ = BuildMI(*MBB, MBBI, PPC::B, 1).addMBB(DestMBB);
160       }
161       
162       // Erase the psuedo BCC instruction, and then back up the
163       // iterator so that when the for loop increments it, we end up in
164       // the correct place rather than iterating off the end.
165       MBB->erase(MBBI);
166       MBBI = MBBJ;
167       ByteCount += ByteSize;
168     }
169   }
170   
171   OffsetMap.clear();
172   return true;
173 }
174