1ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//===-- CodeGen/MachineInstBundle.h - MI bundle utilities -------*- C++ -*-===// 2ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 3ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// The LLVM Compiler Infrastructure 4ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 5ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// This file is distributed under the University of Illinois Open Source 6ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// License. See LICENSE.TXT for details. 7ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 8ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//===----------------------------------------------------------------------===// 9ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 10ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// This file provide utility functions to manipulate machine instruction 11ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// bundles. 12ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 13ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//===----------------------------------------------------------------------===// 14ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 15ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#ifndef LLVM_CODEGEN_MACHINEINSTRBUNDLE_H 16ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#define LLVM_CODEGEN_MACHINEINSTRBUNDLE_H 17ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 18ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineBasicBlock.h" 19ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 20ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengnamespace llvm { 21ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 229b159710ebe8a37cba38ca0c5b465e362bd68af7Evan Cheng/// finalizeBundle - Finalize a machine instruction bundle which includes 23bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// a sequence of instructions starting from FirstMI to LastMI (exclusive). 24ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// This routine adds a BUNDLE instruction to represent the bundle, it adds 25ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// IsInternalRead markers to MachineOperands which are defined inside the 26ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// bundle, and it copies externally visible defs and uses to the BUNDLE 27ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// instruction. 289b159710ebe8a37cba38ca0c5b465e362bd68af7Evan Chengvoid finalizeBundle(MachineBasicBlock &MBB, 29ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator FirstMI, 30ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator LastMI); 31ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 32bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// finalizeBundle - Same functionality as the previous finalizeBundle except 33bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// the last instruction in the bundle is not provided as an input. This is 34bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// used in cases where bundles are pre-determined by marking instructions 35a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// with 'InsideBundle' marker. It returns the MBB instruction iterator that 36a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// points to the end of the bundle. 37a2e435cd23427eef7d8e86c72bb94c756e60e473Evan ChengMachineBasicBlock::instr_iterator finalizeBundle(MachineBasicBlock &MBB, 38bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng MachineBasicBlock::instr_iterator FirstMI); 39bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng 40ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// finalizeBundles - Finalize instruction bundles in the specified 41ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// MachineFunction. Return true if any bundles are finalized. 42ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengbool finalizeBundles(MachineFunction &MF); 43ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 44741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen/// getBundleStart - Returns the first instruction in the bundle containing MI. 45741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen/// 46305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline MachineInstr *getBundleStart(MachineInstr *MI) { 47741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen MachineBasicBlock::instr_iterator I = MI; 48d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen while (I->isBundledWithPred()) 49741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen --I; 50741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen return I; 51741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen} 52741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen 53305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline const MachineInstr *getBundleStart(const MachineInstr *MI) { 54741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen MachineBasicBlock::const_instr_iterator I = MI; 55d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen while (I->isBundledWithPred()) 56741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen --I; 57741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen return I; 58741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen} 59741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen 60d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen/// Return an iterator pointing beyond the bundle containing MI. 61d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Oleseninline MachineBasicBlock::instr_iterator 62d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund OlesengetBundleEnd(MachineInstr *MI) { 63d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen MachineBasicBlock::instr_iterator I = MI; 64d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen while (I->isBundledWithSucc()) 65d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen ++I; 66d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen return ++I; 67d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen} 68d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen 69d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen/// Return an iterator pointing beyond the bundle containing MI. 70d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Oleseninline MachineBasicBlock::const_instr_iterator 71d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund OlesengetBundleEnd(const MachineInstr *MI) { 72d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen MachineBasicBlock::const_instr_iterator I = MI; 73d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen while (I->isBundledWithSucc()) 74d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen ++I; 75d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen return ++I; 76d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen} 77d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen 7830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 7930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen// MachineOperand iterator 8030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen// 8130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 8230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// MachineOperandIteratorBase - Iterator that can visit all operands on a 8330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// MachineInstr, or all operands on a bundle of MachineInstrs. This class is 8430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// not intended to be used directly, use one of the sub-classes instead. 8530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// 8630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// Intended use: 8730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// 8830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// for (MIBundleOperands MIO(MI); MIO.isValid(); ++MIO) { 8930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// if (!MIO->isReg()) 9030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// continue; 9130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// ... 9230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// } 9330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// 9430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenclass MachineOperandIteratorBase { 9530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MachineBasicBlock::instr_iterator InstrI, InstrE; 9630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MachineInstr::mop_iterator OpI, OpE; 9730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 9830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen // If the operands on InstrI are exhausted, advance InstrI to the next 9930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen // bundled instruction with operands. 10030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen void advance() { 10130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen while (OpI == OpE) { 10230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen // Don't advance off the basic block, or into a new bundle. 10330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen if (++InstrI == InstrE || !InstrI->isInsideBundle()) 10430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen break; 10530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen OpI = InstrI->operands_begin(); 10630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen OpE = InstrI->operands_end(); 10730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen } 10830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen } 10930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 11030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenprotected: 11130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// MachineOperandIteratorBase - Create an iterator that visits all operands 11230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// on MI, or all operands on every instruction in the bundle containing MI. 11330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// 11430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// @param MI The instruction to examine. 11530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// @param WholeBundle When true, visit all operands on the entire bundle. 11630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// 11730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen explicit MachineOperandIteratorBase(MachineInstr *MI, bool WholeBundle) { 11830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen if (WholeBundle) { 119741981adf3a2bc0c6652c9c4ec846250950f3e68Jakob Stoklund Olesen InstrI = getBundleStart(MI); 12030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen InstrE = MI->getParent()->instr_end(); 12130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen } else { 12230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen InstrI = InstrE = MI; 12330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen ++InstrE; 12430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen } 12530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen OpI = InstrI->operands_begin(); 12630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen OpE = InstrI->operands_end(); 12730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen if (WholeBundle) 12830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen advance(); 12930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen } 13030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 13130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MachineOperand &deref() const { return *OpI; } 13230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 13330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenpublic: 13430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// isValid - Returns true until all the operands have been visited. 13530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen bool isValid() const { return OpI != OpE; } 13630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 13730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen /// Preincrement. Move to the next operand. 13830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen void operator++() { 13930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen assert(isValid() && "Cannot advance MIOperands beyond the last operand"); 14030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen ++OpI; 14130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen advance(); 14230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen } 14330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 144a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// getOperandNo - Returns the number of the current operand relative to its 145a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// instruction. 146a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// 147a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen unsigned getOperandNo() const { 148a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen return OpI - InstrI->operands_begin(); 149a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen } 150a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 151b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// VirtRegInfo - Information about a virtual register used by a set of operands. 152a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// 153b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy struct VirtRegInfo { 154a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// Reads - One of the operands read the virtual register. This does not 155a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// include <undef> or <internal> use operands, see MO::readsReg(). 156a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen bool Reads; 157a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 158a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// Writes - One of the operands writes the virtual register. 159a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen bool Writes; 160a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 161a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// Tied - Uses and defs must use the same register. This can be because of 162a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// a two-address constraint, or there may be a partial redefinition of a 163a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// sub-register. 164a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen bool Tied; 165a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen }; 166a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 167b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// PhysRegInfo - Information about a physical register used by a set of 168b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// operands. 169b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy struct PhysRegInfo { 170310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover /// Clobbers - Reg or an overlapping register is defined, or a regmask 171b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// clobbers Reg. 172b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool Clobbers; 173b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 174b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// Defines - Reg or a super-register is defined. 175b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool Defines; 176b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 177b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// Reads - Read or a super-register is read. 178b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool Reads; 179b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 180b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// ReadsOverlap - Reg or an overlapping register is read. 181b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool ReadsOverlap; 182b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 183b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// DefinesDead - All defs of a Reg or a super-register are dead. 184b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool DefinesDead; 185b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 186b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// There is a kill of Reg or a super-register. 187b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool Kills; 188b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy }; 189b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 190a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// analyzeVirtReg - Analyze how the current instruction or bundle uses a 191a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// virtual register. This function should not be called after operator++(), 192a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// it expects a fresh iterator. 193a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// 194a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// @param Reg The virtual register to analyze. 195a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// @param Ops When set, this vector will receive an (MI, OpNum) entry for 196a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// each operand referring to Reg. 197a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen /// @returns A filled-in RegInfo struct. 198b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy VirtRegInfo analyzeVirtReg(unsigned Reg, 199a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen SmallVectorImpl<std::pair<MachineInstr*, unsigned> > *Ops = 0); 200b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 201b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// analyzePhysReg - Analyze how the current instruction or bundle uses a 202b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// physical register. This function should not be called after operator++(), 203b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// it expects a fresh iterator. 204b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// 205b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// @param Reg The physical register to analyze. 206b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy /// @returns A filled-in PhysRegInfo struct. 207b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PhysRegInfo analyzePhysReg(unsigned Reg, const TargetRegisterInfo *TRI); 20830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen}; 20930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 21030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// MIOperands - Iterate over operands of a single instruction. 21130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// 21230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenclass MIOperands : public MachineOperandIteratorBase { 21330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenpublic: 21430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MIOperands(MachineInstr *MI) : MachineOperandIteratorBase(MI, false) {} 21530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MachineOperand &operator* () const { return deref(); } 21630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MachineOperand *operator->() const { return &deref(); } 21730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen}; 21830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 21930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// ConstMIOperands - Iterate over operands of a single const instruction. 22030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// 22130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenclass ConstMIOperands : public MachineOperandIteratorBase { 22230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenpublic: 22330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen ConstMIOperands(const MachineInstr *MI) 22430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen : MachineOperandIteratorBase(const_cast<MachineInstr*>(MI), false) {} 22530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen const MachineOperand &operator* () const { return deref(); } 22630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen const MachineOperand *operator->() const { return &deref(); } 22730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen}; 22830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 22930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// MIBundleOperands - Iterate over all operands in a bundle of machine 23030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// instructions. 23130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// 23230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenclass MIBundleOperands : public MachineOperandIteratorBase { 23330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenpublic: 23430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MIBundleOperands(MachineInstr *MI) : MachineOperandIteratorBase(MI, true) {} 23530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MachineOperand &operator* () const { return deref(); } 23630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen MachineOperand *operator->() const { return &deref(); } 23730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen}; 23830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 23930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// ConstMIBundleOperands - Iterate over all operands in a const bundle of 24030e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// machine instructions. 24130e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen/// 24230e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenclass ConstMIBundleOperands : public MachineOperandIteratorBase { 24330e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesenpublic: 24430e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen ConstMIBundleOperands(const MachineInstr *MI) 24530e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen : MachineOperandIteratorBase(const_cast<MachineInstr*>(MI), true) {} 24630e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen const MachineOperand &operator* () const { return deref(); } 24730e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen const MachineOperand *operator->() const { return &deref(); } 24830e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen}; 24930e98a03a3c524026e2da2607e04bb655b0b6350Jakob Stoklund Olesen 250ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} // End llvm namespace 251ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 252ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#endif 253