MipsInstrInfo.cpp revision d0a4b60df146b8c51555a752fed1530999ecbe64
1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- MipsInstrInfo.cpp - Mips Instruction Information ------------------===// 2972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 3972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// The LLVM Compiler Infrastructure 4972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 9972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 10972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// This file contains the Mips implementation of the TargetInstrInfo class. 11972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 13972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 14972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsInstrInfo.h" 15794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka#include "InstPrinter/MipsInstPrinter.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MipsAnalyzeImmediate.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MipsMachineFunction.h" 18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MipsTargetMachine.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h" 20972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineInstrBuilder.h" 219911405183f8596fe9d521467f83f6652a296cf4Dan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h" 22c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 233e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 2422fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng 254db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#define GET_INSTRINFO_CTOR 26972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsGenInstrInfo.inc" 27972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 28972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesusing namespace llvm; 29972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 300bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira HatanakaMipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm, unsigned UncondBr) 314db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng : MipsGenInstrInfo(Mips::ADJCALLSTACKDOWN, Mips::ADJCALLSTACKUP), 328589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka TM(tm), UncondBrOpc(UncondBr) {} 33794bf17cbe0bac301ef9e52fb4a0295bfdfe0cabAkira Hatanaka 34af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanakaconst MipsInstrInfo *MipsInstrInfo::create(MipsTargetMachine &TM) { 35af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka if (TM.getSubtargetImpl()->inMips16Mode()) 36af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka return llvm::createMips16InstrInfo(TM); 37af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka 38af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka return llvm::createMipsSEInstrInfo(TM); 39af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka} 40af2662606745bdebaa2cb43096274ce3d33b665fAkira Hatanaka 410bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakabool MipsInstrInfo::isZeroImm(const MachineOperand &op) const { 42d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman return op.isImm() && op.getImm() == 0; 43972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 44972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 4535d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes/// insertNoop - If data hazard condition is found insert the target nop 4635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes/// instruction. 4735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesvoid MipsInstrInfo:: 4881092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesinsertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const 4935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{ 50c7f3ace20c325521c68335a1689645b43b06ddf0Chris Lattner DebugLoc DL; 51d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling BuildMI(MBB, MI, DL, get(Mips::NOP)); 5235d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes} 5335d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 540bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira HatanakaMachineMemOperand *MipsInstrInfo::GetMemOperand(MachineBasicBlock &MBB, int FI, 550bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka unsigned Flag) const { 56fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka MachineFunction &MF = *MBB.getParent(); 57fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka MachineFrameInfo &MFI = *MF.getFrameInfo(); 58fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka unsigned Align = MFI.getObjectAlignment(FI); 59bb481f882093fb738d2bb15610c79364bada5496Jia Liu 60fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka return MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(FI), Flag, 61fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka MFI.getObjectSize(FI), Align); 62fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka} 63fd1d9250b2b85ae4c6e7ae1a512bf6ea56af3c97Akira Hatanaka 64c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira HatanakaMachineInstr* 65c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira HatanakaMipsInstrInfo::emitFrameIndexDebugValue(MachineFunction &MF, int FrameIx, 66c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka uint64_t Offset, const MDNode *MDPtr, 67c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka DebugLoc DL) const { 68c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka MachineInstrBuilder MIB = BuildMI(MF, DL, get(Mips::DBG_VALUE)) 69c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka .addFrameIndex(FrameIx).addImm(0).addImm(Offset).addMetadata(MDPtr); 70c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka return &*MIB; 71c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka} 72c4f24eb584f6b4dba3caba2ed766c7c4bf1bf8afAkira Hatanaka 734552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 7435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes// Branch Analysis 754552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 7635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 770bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakavoid MipsInstrInfo::AnalyzeCondBr(const MachineInstr *Inst, unsigned Opc, 780bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka MachineBasicBlock *&BB, 790bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka SmallVectorImpl<MachineOperand> &Cond) const { 8020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka assert(GetAnalyzableBrOpc(Opc) && "Not an analyzable branch"); 8120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka int NumOp = Inst->getNumExplicitOperands(); 82bb481f882093fb738d2bb15610c79364bada5496Jia Liu 8320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // for both int and fp branches, the last explicit operand is the 8420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // MBB. 8520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka BB = Inst->getOperand(NumOp-1).getMBB(); 8620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka Cond.push_back(MachineOperand::CreateImm(Opc)); 8720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka 8820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka for (int i=0; i<NumOp-1; i++) 8920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka Cond.push_back(Inst->getOperand(i)); 9035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes} 9135d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 9281092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopesbool MipsInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB, 9335d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes MachineBasicBlock *&TBB, 9435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes MachineBasicBlock *&FBB, 95dc54d317e7a381ef8e4aca80d54ad1466bb85ddaEvan Cheng SmallVectorImpl<MachineOperand> &Cond, 96d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka bool AllowModify) const { 97d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka SmallVector<MachineInstr*, 2> BranchInstrs; 98d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka BranchType BT = AnalyzeBranch(MBB, TBB, FBB, Cond, AllowModify, BranchInstrs); 9981092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 100d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return (BT == BT_None) || (BT == BT_Indirect); 101bb481f882093fb738d2bb15610c79364bada5496Jia Liu} 102bb481f882093fb738d2bb15610c79364bada5496Jia Liu 10320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanakavoid MipsInstrInfo::BuildCondBr(MachineBasicBlock &MBB, 10420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka MachineBasicBlock *TBB, DebugLoc DL, 10520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka const SmallVectorImpl<MachineOperand>& Cond) 10620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka const { 10720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka unsigned Opc = Cond[0].getImm(); 108e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID = get(Opc); 109e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng MachineInstrBuilder MIB = BuildMI(&MBB, DL, MCID); 11081092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 111e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka for (unsigned i = 1; i < Cond.size(); ++i) { 112e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka if (Cond[i].isReg()) 113e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka MIB.addReg(Cond[i].getReg()); 114e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka else if (Cond[i].isImm()) 115e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka MIB.addImm(Cond[i].getImm()); 116e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka else 117e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka assert(true && "Cannot copy operand"); 118e6ac7d69d3308d580a87ff3e3645f98e2bc565a5Akira Hatanaka } 11920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka MIB.addMBB(TBB); 12035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes} 12135d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 122972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesunsigned MipsInstrInfo:: 12381092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesInsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, 12444eb65cf58e3ab9b5621ce72256d1621a18aeed7Owen Anderson MachineBasicBlock *FBB, 1253bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings const SmallVectorImpl<MachineOperand> &Cond, 1263bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings DebugLoc DL) const { 12735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes // Shouldn't be a fall through. 12835d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes assert(TBB && "InsertBranch must not be told to insert a fallthrough"); 12935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 13020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // # of condition operands: 13120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Unconditional branches: 0 13220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Floating point branches: 1 (opc) 13320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Int BranchZero: 2 (opc, reg) 13420ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Int Branch: 3 (opc, reg0, reg1) 13520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka assert((Cond.size() <= 3) && 13620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka "# of Mips branch conditions must be <= 3!"); 13781092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 13835d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes // Two-way Conditional branch. 13920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka if (FBB) { 14020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka BuildCondBr(MBB, TBB, DL, Cond); 1416e55ff56b88c3334d5847f2cb26f3001b92c489bAkira Hatanaka BuildMI(&MBB, DL, get(UncondBrOpc)).addMBB(FBB); 14220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka return 2; 14320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka } 14435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 14520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // One way branch. 14620ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Unconditional branch. 14720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka if (Cond.empty()) 1486e55ff56b88c3334d5847f2cb26f3001b92c489bAkira Hatanaka BuildMI(&MBB, DL, get(UncondBrOpc)).addMBB(TBB); 14920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka else // Conditional branch. 15020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka BuildCondBr(MBB, TBB, DL, Cond); 15120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka return 1; 152972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 15335d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 15435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesunsigned MipsInstrInfo:: 15581092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesRemoveBranch(MachineBasicBlock &MBB) const 15635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{ 15720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka MachineBasicBlock::reverse_iterator I = MBB.rbegin(), REnd = MBB.rend(); 15820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka MachineBasicBlock::reverse_iterator FirstBr; 15920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka unsigned removed; 16020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka 16120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Skip all the debug instructions. 16220ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka while (I != REnd && I->isDebugValue()) 16320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka ++I; 16481092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 16520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka FirstBr = I; 16681092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 16720ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Up to 2 branches are removed. 16820ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka // Note that indirect branches are not removed. 16920ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka for(removed = 0; I != REnd && removed < 2; ++I, ++removed) 17020ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka if (!GetAnalyzableBrOpc(I->getOpcode())) 17120ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka break; 17281092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 17320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka MBB.erase(I.base(), FirstBr.base()); 17481092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 17520ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka return removed; 17635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes} 17735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes 17881092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes/// ReverseBranchCondition - Return the inverse opcode of the 17935d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes/// specified Branch instruction. 18035d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopesbool MipsInstrInfo:: 18181092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso LopesReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const 18235d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes{ 18320ada98de82cb23c3f075acbb09436760ef0923cAkira Hatanaka assert( (Cond.size() && Cond.size() <= 3) && 18435d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes "Invalid Mips branch condition!"); 1850bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka Cond[0].setImm(GetOppositeBranchOpc(Cond[0].getImm())); 18635d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes return false; 18735d2a47994af0694b4301bcfdf9cf8bbd726b487Bruno Cardoso Lopes} 1889911405183f8596fe9d521467f83f6652a296cf4Dan Gohman 189d0a4b60df146b8c51555a752fed1530999ecbe64Akira HatanakaMipsInstrInfo::BranchType MipsInstrInfo:: 190d0a4b60df146b8c51555a752fed1530999ecbe64Akira HatanakaAnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, 191d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka MachineBasicBlock *&FBB, SmallVectorImpl<MachineOperand> &Cond, 192d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka bool AllowModify, 193d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka SmallVectorImpl<MachineInstr*> &BranchInstrs) const { 194d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 195d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka MachineBasicBlock::reverse_iterator I = MBB.rbegin(), REnd = MBB.rend(); 196d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 197d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Skip all the debug instructions. 198d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka while (I != REnd && I->isDebugValue()) 199d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka ++I; 200d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 201d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (I == REnd || !isUnpredicatedTerminator(&*I)) { 202d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // This block ends with no branches (it just falls through to its succ). 203d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Leave TBB/FBB null. 204d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka TBB = FBB = NULL; 205d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_NoBranch; 206d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka } 207d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 208d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka MachineInstr *LastInst = &*I; 209d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka unsigned LastOpc = LastInst->getOpcode(); 210d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka BranchInstrs.push_back(LastInst); 211d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 212d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Not an analyzable branch (e.g., indirect jump). 213d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (!GetAnalyzableBrOpc(LastOpc)) 214d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return LastInst->isIndirectBranch() ? BT_Indirect : BT_None; 215d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 216d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Get the second to last instruction in the block. 217d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka unsigned SecondLastOpc = 0; 218d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka MachineInstr *SecondLastInst = NULL; 219d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 220d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (++I != REnd) { 221d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka SecondLastInst = &*I; 222d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka SecondLastOpc = GetAnalyzableBrOpc(SecondLastInst->getOpcode()); 223d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 224d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Not an analyzable branch (must be an indirect jump). 225d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (isUnpredicatedTerminator(SecondLastInst) && !SecondLastOpc) 226d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_None; 227d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka } 228d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 229d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka BranchInstrs.insert(BranchInstrs.begin(), SecondLastInst); 230d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 231d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // If there is only one terminator instruction, process it. 232d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (!SecondLastOpc) { 233d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Unconditional branch 234d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (LastOpc == UncondBrOpc) { 235d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka TBB = LastInst->getOperand(0).getMBB(); 236d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_Uncond; 237d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka } 238d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 239d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Conditional branch 240d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka AnalyzeCondBr(LastInst, LastOpc, TBB, Cond); 241d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_Cond; 242d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka } 243d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 244d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // If we reached here, there are two branches. 245d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // If there are three terminators, we don't know what sort of block this is. 246d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (++I != REnd && isUnpredicatedTerminator(&*I)) 247d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_None; 248d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 249d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // If second to last instruction is an unconditional branch, 250d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // analyze it and remove the last instruction. 251d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (SecondLastOpc == UncondBrOpc) { 252d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Return if the last instruction cannot be removed. 253d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (!AllowModify) 254d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_None; 255d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 256d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka TBB = SecondLastInst->getOperand(0).getMBB(); 257d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka LastInst->eraseFromParent(); 258d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka BranchInstrs.pop_back(); 259d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_Uncond; 260d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka } 261d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 262d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // Conditional branch followed by an unconditional branch. 263d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka // The last one must be unconditional. 264d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka if (LastOpc != UncondBrOpc) 265d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_None; 266d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 267d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka AnalyzeCondBr(SecondLastInst, SecondLastOpc, TBB, Cond); 268d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka FBB = LastInst->getOperand(0).getMBB(); 269d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 270d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka return BT_CondUncond; 271d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka} 272d0a4b60df146b8c51555a752fed1530999ecbe64Akira Hatanaka 273d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka/// Return the number of bytes of code the specified instruction may be. 274d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanakaunsigned MipsInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const { 275d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka switch (MI->getOpcode()) { 276d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka default: 277d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka return MI->getDesc().getSize(); 278d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka case TargetOpcode::INLINEASM: { // Inline Asm: Variable size. 279d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka const MachineFunction *MF = MI->getParent()->getParent(); 280d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka const char *AsmStr = MI->getOperand(0).getSymbolName(); 281d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo()); 282d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka } 283d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka } 284d4b48b283c3939962f0cd3c17aedc40209d82b1aAkira Hatanaka} 285