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