yuzu/src/shader_recompiler/frontend/ir/basic_block.h

144 lines
4.4 KiB
C++
Raw Normal View History

2021-01-09 06:30:07 +00:00
// Copyright 2021 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <initializer_list>
#include <map>
2021-02-03 00:07:00 +00:00
#include <span>
#include <vector>
2021-01-09 06:30:07 +00:00
#include <boost/intrusive/list.hpp>
#include "shader_recompiler/frontend/ir/microinstruction.h"
2021-02-06 02:11:23 +00:00
#include "shader_recompiler/object_pool.h"
2021-01-09 06:30:07 +00:00
namespace Shader::IR {
class Block {
public:
using InstructionList = boost::intrusive::list<Inst>;
using size_type = InstructionList::size_type;
using iterator = InstructionList::iterator;
using const_iterator = InstructionList::const_iterator;
using reverse_iterator = InstructionList::reverse_iterator;
using const_reverse_iterator = InstructionList::const_reverse_iterator;
2021-02-06 02:11:23 +00:00
explicit Block(ObjectPool<Inst>& inst_pool_, u32 begin, u32 end);
2021-01-09 06:30:07 +00:00
~Block();
Block(const Block&) = delete;
Block& operator=(const Block&) = delete;
Block(Block&&) = default;
Block& operator=(Block&&) = default;
/// Appends a new instruction to the end of this basic block.
void AppendNewInst(Opcode op, std::initializer_list<Value> args);
/// Prepends a new instruction to this basic block before the insertion point.
2021-02-03 00:07:00 +00:00
iterator PrependNewInst(iterator insertion_point, Opcode op,
2021-02-03 19:43:04 +00:00
std::initializer_list<Value> args = {}, u64 flags = 0);
2021-02-03 00:07:00 +00:00
/// Adds a new immediate predecessor to the basic block.
void AddImmediatePredecessor(IR::Block* immediate_predecessor);
2021-01-09 06:30:07 +00:00
/// Gets the starting location of this basic block.
[[nodiscard]] u32 LocationBegin() const noexcept;
/// Gets the end location for this basic block.
[[nodiscard]] u32 LocationEnd() const noexcept;
/// Gets a mutable reference to the instruction list for this basic block.
2021-02-03 00:07:00 +00:00
[[nodiscard]] InstructionList& Instructions() noexcept;
2021-01-09 06:30:07 +00:00
/// Gets an immutable reference to the instruction list for this basic block.
2021-02-03 00:07:00 +00:00
[[nodiscard]] const InstructionList& Instructions() const noexcept;
/// Gets an immutable span to the immediate predecessors.
[[nodiscard]] std::span<IR::Block* const> ImmediatePredecessors() const noexcept;
2021-01-09 06:30:07 +00:00
[[nodiscard]] bool empty() const {
return instructions.empty();
}
[[nodiscard]] size_type size() const {
return instructions.size();
}
[[nodiscard]] Inst& front() {
return instructions.front();
}
[[nodiscard]] const Inst& front() const {
return instructions.front();
}
[[nodiscard]] Inst& back() {
return instructions.back();
}
[[nodiscard]] const Inst& back() const {
return instructions.back();
}
[[nodiscard]] iterator begin() {
return instructions.begin();
}
[[nodiscard]] const_iterator begin() const {
return instructions.begin();
}
[[nodiscard]] iterator end() {
return instructions.end();
}
[[nodiscard]] const_iterator end() const {
return instructions.end();
}
[[nodiscard]] reverse_iterator rbegin() {
return instructions.rbegin();
}
[[nodiscard]] const_reverse_iterator rbegin() const {
return instructions.rbegin();
}
[[nodiscard]] reverse_iterator rend() {
return instructions.rend();
}
[[nodiscard]] const_reverse_iterator rend() const {
return instructions.rend();
}
[[nodiscard]] const_iterator cbegin() const {
return instructions.cbegin();
}
[[nodiscard]] const_iterator cend() const {
return instructions.cend();
}
[[nodiscard]] const_reverse_iterator crbegin() const {
return instructions.crbegin();
}
[[nodiscard]] const_reverse_iterator crend() const {
return instructions.crend();
}
private:
2021-02-06 02:11:23 +00:00
/// Memory pool for instruction list
ObjectPool<Inst>* inst_pool;
2021-01-09 06:30:07 +00:00
/// Starting location of this block
u32 location_begin;
/// End location of this block
u32 location_end;
2021-02-03 00:07:00 +00:00
/// List of instructions in this block
2021-01-09 06:30:07 +00:00
InstructionList instructions;
2021-02-03 00:07:00 +00:00
/// Block immediate predecessors
std::vector<IR::Block*> imm_predecessors;
2021-01-09 06:30:07 +00:00
};
[[nodiscard]] std::string DumpBlock(const Block& block);
[[nodiscard]] std::string DumpBlock(const Block& block,
const std::map<const Block*, size_t>& block_to_index,
std::map<const Inst*, size_t>& inst_to_index,
size_t& inst_index);
} // namespace Shader::IR