[ir] Change base class for terminators.

This CL moves the FunctionTerminator and RootTerminator nodes to be
blocks instead of FlowNodes.

Bug: tint:1718
Change-Id: Iee7830bccd99e4587b95b22b53268d1d2921e82f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/134222
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
dan sinclair 2023-05-24 18:47:12 +00:00 committed by Dawn LUCI CQ
parent e9a4adeff9
commit 0089d5e6e2
6 changed files with 22 additions and 23 deletions

View File

@ -56,6 +56,9 @@ std::string Debug::AsDotGraph(const Module* mod) {
tint::Switch(
node,
[&](const ir::FunctionTerminator*) {
// Already done
},
[&](const ir::Block* b) {
if (node_to_name.count(b) == 0) {
out << name_for(b) << R"( [label="block"])" << std::endl;
@ -69,9 +72,6 @@ std::string Debug::AsDotGraph(const Module* mod) {
out << std::endl;
Graph(b->Branch()->To());
},
[&](const ir::FunctionTerminator*) {
// Already done
});
};

View File

@ -153,6 +153,15 @@ void Disassembler::Walk() {
out_ << " -> %fn" << IdOf(f->StartTarget()) << std::endl;
walk_list_.push_back(f->StartTarget());
},
[&](const ir::FunctionTerminator* t) {
TINT_ASSERT(IR, in_function_);
Indent() << "%fn" << IdOf(t) << " = func_terminator" << std::endl << std::endl;
in_function_ = false;
},
[&](const ir::RootTerminator* t) {
TINT_ASSERT(IR, !in_function_);
Indent() << "%fn" << IdOf(t) << " = root_terminator" << std::endl << std::endl;
},
[&](const ir::Block* b) {
// If this block is dead, nothing to do
if (!b->HasBranchTarget()) {
@ -183,15 +192,6 @@ void Disassembler::Walk() {
}
walk_list_.push_back(b->Branch()->To());
},
[&](const ir::FunctionTerminator* t) {
TINT_ASSERT(IR, in_function_);
Indent() << "%fn" << IdOf(t) << " = func_terminator" << std::endl << std::endl;
in_function_ = false;
},
[&](const ir::RootTerminator* t) {
TINT_ASSERT(IR, !in_function_);
Indent() << "%fn" << IdOf(t) << " = root_terminator" << std::endl << std::endl;
});
}
}

View File

@ -15,13 +15,13 @@
#ifndef SRC_TINT_IR_FUNCTION_TERMINATOR_H_
#define SRC_TINT_IR_FUNCTION_TERMINATOR_H_
#include "src/tint/ir/flow_node.h"
#include "src/tint/ir/block.h"
namespace tint::ir {
/// Flow node used as the end of a function. Must only be used as the `end_target` in a function
/// flow node. There are no instructions and no branches from this node.
class FunctionTerminator : public utils::Castable<FunctionTerminator, FlowNode> {
/// Block used as the end of a function. Must only be used as the `end_target` in a function. There
/// are no instructions in this block.
class FunctionTerminator : public utils::Castable<FunctionTerminator, Block> {
public:
/// Constructor
FunctionTerminator();

View File

@ -15,13 +15,12 @@
#ifndef SRC_TINT_IR_ROOT_TERMINATOR_H_
#define SRC_TINT_IR_ROOT_TERMINATOR_H_
#include "src/tint/ir/flow_node.h"
#include "src/tint/ir/block.h"
namespace tint::ir {
/// Flow node used as the end of a function. Must only be used as the `end_target` in a function
/// flow node. There are no instructions and no branches from this node.
class RootTerminator : public utils::Castable<RootTerminator, FlowNode> {
/// Block used as the end of a root block. There are no instructions in this block.
class RootTerminator : public utils::Castable<RootTerminator, Block> {
public:
/// Constructor
RootTerminator();

View File

@ -126,6 +126,8 @@ class State {
Status status = tint::Switch(
block,
[&](const ir::FunctionTerminator*) { return kStop; },
[&](const ir::Block* blk) {
for (auto* inst : blk->Instructions()) {
auto stmt = Stmt(inst);
@ -150,8 +152,6 @@ class State {
return kStop;
},
[&](const ir::FunctionTerminator*) { return kStop; },
[&](Default) {
UNHANDLED_CASE(block);
return kError;

View File

@ -355,7 +355,6 @@ void GeneratorImplIr::EmitBlock(const ir::Block* block) {
void GeneratorImplIr::EmitBranch(const ir::Branch* b) {
Switch(
b->To(),
[&](const ir::Block* blk) { current_function_.push_inst(spv::Op::OpBranch, {Label(blk)}); },
[&](const ir::FunctionTerminator*) {
if (!b->Args().IsEmpty()) {
TINT_ASSERT(Writer, b->Args().Length() == 1u);
@ -366,6 +365,7 @@ void GeneratorImplIr::EmitBranch(const ir::Branch* b) {
current_function_.push_inst(spv::Op::OpReturn, {});
}
},
[&](const ir::Block* blk) { current_function_.push_inst(spv::Op::OpBranch, {Label(blk)}); },
[&](Default) {
// A block may not have an outward branch (e.g. an unreachable merge
// block).