10e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea/*
20e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * Copyright (C) 2013 The Android Open Source Project
30e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea *
40e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * Licensed under the Apache License, Version 2.0 (the "License");
50e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * you may not use this file except in compliance with the License.
60e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * You may obtain a copy of the License at
70e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea *
80e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea *      http://www.apache.org/licenses/LICENSE-2.0
90e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea *
100e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * Unless required by applicable law or agreed to in writing, software
110e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * distributed under the License is distributed on an "AS IS" BASIS,
120e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * See the License for the specific language governing permissions and
140e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea * limitations under the License.
150e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea */
160e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
17bfaf44fa3366955a2bacb2c38c79b53df2434582Dragos Sbirlea#ifndef ART_COMPILER_SEA_IR_IR_INSTRUCTION_NODES_H_
18bfaf44fa3366955a2bacb2c38c79b53df2434582Dragos Sbirlea#define ART_COMPILER_SEA_IR_IR_INSTRUCTION_NODES_H_
190e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea#include "dex_instruction-inl.h"
20bfaf44fa3366955a2bacb2c38c79b53df2434582Dragos Sbirlea#include "sea_ir/ir/sea_node.h"
21bfaf44fa3366955a2bacb2c38c79b53df2434582Dragos Sbirlea#include "sea_ir/ir/visitor.h"
226447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea
230e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
240e260a32601fb1178e11837c460807071d489f82Dragos Sbirleanamespace sea_ir {
250e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
260e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaenum SpecialRegisters {
270e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  NO_REGISTER = -1,             // Usually signifies that there is no register
280e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea                                // that respects the condition you asked for.
290e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  RETURN_REGISTER = -2,         // Written by the invoke* instructions, read by move-results.
300e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  UNNAMED_CONST_REGISTER = -3   // Written by UnnamedConst* instructions, read by *Lit* instruction.
310e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
320e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
330e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass IRVisitor;
340e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
350e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea// This class represents an instruction in SEA IR.
360e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea// As we add support for specific classes of instructions,
370e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea// the number of InstructionNode objects should dwindle, while the
380e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea// number of subclasses and instances of subclasses will go up.
390e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass InstructionNode: public SeaNode {
400e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
410e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  static std::vector<sea_ir::InstructionNode*> Create(const art::Instruction* in);
420e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Returns the Dalvik instruction around which this InstructionNode is wrapped.
430e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  const art::Instruction* GetInstruction() const {
440e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    DCHECK(NULL != instruction_) << "Tried to access NULL instruction in an InstructionNode.";
450e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return instruction_;
460e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
470e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Returns the register that is defined by the current instruction, or NO_REGISTER otherwise.
480e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  virtual int GetResultRegister() const;
490e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Returns the set of registers defined by the current instruction.
500e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  virtual std::vector<int> GetDefinitions() const;
510e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Returns the set of register numbers that are used by the instruction.
526447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea  virtual std::vector<int> GetUses() const;
530e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Mark the current instruction as a downward exposed definition.
540e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void MarkAsDEDef();
550e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Rename the use of @reg_no to refer to the instruction @definition,
560e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // essentially creating SSA form.
570e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void RenameToSSA(int reg_no, InstructionNode* definition) {
580e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    definition_edges_.insert(std::pair<int, InstructionNode*>(reg_no, definition));
5990af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea    DCHECK(NULL != definition) << "SSA definition for register " << reg_no
6090af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea        << " used in instruction " << Id() << " not found.";
61e224532f2320e97f6fb21c93d7f44dcbd4de6983Dragos Sbirlea    definition->AddSSAUse(this);
620e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
630e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Returns the ordered set of Instructions that define the input operands of this instruction.
640e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Precondition: SeaGraph.ConvertToSSA().
657b89bc0d1e73ae5a4265f93bb5497019b1a9bf17Dragos Sbirlea  virtual std::vector<InstructionNode*> GetSSAProducers() {
660e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    std::vector<int> uses = GetUses();
670e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    std::vector<InstructionNode*> ssa_uses;
680e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    for (std::vector<int>::const_iterator cit = uses.begin(); cit != uses.end(); cit++) {
690e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea      ssa_uses.push_back((*definition_edges_.find(*cit)).second);
700e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    }
710e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return ssa_uses;
720e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
736447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea  std::map<int, InstructionNode* >* GetSSAProducersMap() {
746447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea    return &definition_edges_;
756447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea  }
766447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea  std::vector<InstructionNode*>* GetSSAConsumers() {
776447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea    return &used_in_;
78b40eddfc96b9ac235dea562e55ce2ad7b1cfb7c9Dragos Sbirlea  }
79e224532f2320e97f6fb21c93d7f44dcbd4de6983Dragos Sbirlea  virtual void AddSSAUse(InstructionNode* use) {
80e224532f2320e97f6fb21c93d7f44dcbd4de6983Dragos Sbirlea    used_in_.push_back(use);
81e224532f2320e97f6fb21c93d7f44dcbd4de6983Dragos Sbirlea  }
820e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
830e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
840e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
850e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
860e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Set the region to which this instruction belongs.
870e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  Region* GetRegion() {
880e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    DCHECK(NULL != region_);
890e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return region_;
900e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
910e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  // Get the region to which this instruction belongs.
920e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void SetRegion(Region* region) {
930e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    region_ = region;
940e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
950e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
960e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea protected:
970e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit InstructionNode(const art::Instruction* in):
98e224532f2320e97f6fb21c93d7f44dcbd4de6983Dragos Sbirlea      SeaNode(), instruction_(in), used_in_(), de_def_(false), region_(NULL) { }
990e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1000e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea protected:
1010e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  const art::Instruction* const instruction_;
1026447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea  std::map<int, InstructionNode* > definition_edges_;  // Maps used registers to their definitions.
103e224532f2320e97f6fb21c93d7f44dcbd4de6983Dragos Sbirlea  // Stores pointers to instructions that use the result of the current instruction.
104e224532f2320e97f6fb21c93d7f44dcbd4de6983Dragos Sbirlea  std::vector<InstructionNode*> used_in_;
1050e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  bool de_def_;
1060e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  Region* region_;
1070e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
1080e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1090e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass ConstInstructionNode: public InstructionNode {
1100e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
1110e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit ConstInstructionNode(const art::Instruction* inst):
1120e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea      InstructionNode(inst) { }
1130e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1140e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
1150e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
1160e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
1170e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1180e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1190e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  virtual int32_t GetConstValue() const {
1200e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return GetInstruction()->VRegB_11n();
1210e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1220e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
1230e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1240e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass UnnamedConstInstructionNode: public ConstInstructionNode {
1250e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
1260e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit UnnamedConstInstructionNode(const art::Instruction* inst, int32_t value):
1270e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea      ConstInstructionNode(inst), value_(value) { }
1286447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea
1290e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
1300e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
1310e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
1320e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1330e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1340e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  int GetResultRegister() const {
1350e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return UNNAMED_CONST_REGISTER;
1360e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1370e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1380e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  int32_t GetConstValue() const {
1390e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return value_;
1400e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1410e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1420e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea private:
1430e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  const int32_t value_;
1440e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
1450e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1460e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass ReturnInstructionNode: public InstructionNode {
1470e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
1480e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit ReturnInstructionNode(const art::Instruction* inst): InstructionNode(inst) { }
1490e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
1500e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
1510e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
1520e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1530e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
1540e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1550e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass IfNeInstructionNode: public InstructionNode {
1560e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
1570e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit IfNeInstructionNode(const art::Instruction* inst): InstructionNode(inst) {
1580e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    DCHECK(InstructionTools::IsDefinition(inst) == false);
1590e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1600e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
1610e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
1620e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
1630e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1640e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
1650e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1660e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1670e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1680e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass MoveResultInstructionNode: public InstructionNode {
1690e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
1700e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit MoveResultInstructionNode(const art::Instruction* inst): InstructionNode(inst) { }
1716447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea  std::vector<int> GetUses() const {
1727934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom    std::vector<int> uses;  // Using vector<> instead of set<> because order matters.
1730e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    uses.push_back(RETURN_REGISTER);
1740e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return uses;
1750e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1760e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
1770e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
1780e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
1790e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
1800e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
1810e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
1820e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass InvokeStaticInstructionNode: public InstructionNode {
1830e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
18490af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea  explicit InvokeStaticInstructionNode(const art::Instruction* inst): InstructionNode(inst),
18590af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea    method_index_(inst->VRegB_35c()) { }
1860e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  int GetResultRegister() const {
1870e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return RETURN_REGISTER;
1880e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
18990af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea
19090af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea  int GetCalledMethodIndex() const {
19190af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea    return method_index_;
19290af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea  }
1930e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
1940e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
1950e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
1960e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
19790af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea
19890af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea private:
19990af14d2743614e3e1453984b14258a6f145501dDragos Sbirlea  const uint32_t method_index_;
2000e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
2010e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
2020e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass AddIntInstructionNode: public InstructionNode {
2030e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
2040e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit AddIntInstructionNode(const art::Instruction* inst): InstructionNode(inst) { }
2050e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
2060e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
2070e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
2080e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
2090e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
2100e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
2110e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass AddIntLitInstructionNode: public AddIntInstructionNode {
2120e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
2130e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit AddIntLitInstructionNode(const art::Instruction* inst):
2140e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea      AddIntInstructionNode(inst) { }
2150e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
2166447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea  std::vector<int> GetUses() const {
2170e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    std::vector<int> uses =  AddIntInstructionNode::GetUses();
2180e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    uses.push_back(UNNAMED_CONST_REGISTER);
2190e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    return uses;
2200e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    }
2210e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
2220e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
2230e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
2240e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
2250e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
2260e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
2270e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
2280e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass GotoInstructionNode: public InstructionNode {
2290e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
2300e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit GotoInstructionNode(const art::Instruction* inst): InstructionNode(inst) { }
2310e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
2320e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
2330e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
2340e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
2350e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
2360e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea
2370e260a32601fb1178e11837c460807071d489f82Dragos Sbirleaclass IfEqzInstructionNode: public InstructionNode {
2380e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea public:
2390e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  explicit IfEqzInstructionNode(const art::Instruction* inst): InstructionNode(inst) {
2400e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    DCHECK(InstructionTools::IsDefinition(inst) == false);
2410e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
2420e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  void Accept(IRVisitor* v) {
2430e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Visit(this);
2440e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea    v->Traverse(this);
2450e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea  }
2460e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea};
2477934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace sea_ir
248bfaf44fa3366955a2bacb2c38c79b53df2434582Dragos Sbirlea#endif  // ART_COMPILER_SEA_IR_IR_INSTRUCTION_NODES_H_
249