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