summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2021-02-26 00:51:47 +0000
committerGitHub <noreply@github.com>2021-02-25 16:51:47 -0800
commit3bc8c3b348699f45131f823b49024138f1992368 (patch)
tree3c78482bec0b26220894ede741108a7d0b7022ac
parentb89b601a36e9cfe17dc1f09c641266ac2a715299 (diff)
downloadbinaryen-3bc8c3b348699f45131f823b49024138f1992368.tar.gz
binaryen-3bc8c3b348699f45131f823b49024138f1992368.tar.bz2
binaryen-3bc8c3b348699f45131f823b49024138f1992368.zip
Simplify printing code (#3618)
We can just iterate on children using the standard order as in delegates.h, as used by the binary format as well. The only exceptions are control flow instructions which need some special handling.
-rw-r--r--src/passes/Print.cpp519
-rw-r--r--test/passes/dce_all-features.txt3
2 files changed, 20 insertions, 502 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 8c32642b4..7b0d7a678 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -18,6 +18,7 @@
// Print out text in s-expression format
//
+#include <ir/iteration.h>
#include <ir/module-utils.h>
#include <pass.h>
#include <pretty_printing.h>
@@ -2061,7 +2062,7 @@ struct PrintExpressionContents
// Prints an expression in s-expr format, including both the
// internal contents and the nested children.
-struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
+struct PrintSExpression : public UnifiedExpressionVisitor<PrintSExpression> {
std::ostream& o;
unsigned indent = 0;
@@ -2148,7 +2149,7 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
void visit(Expression* curr) {
printDebugLocation(curr);
- OverriddenVisitor<PrintSExpression>::visit(curr);
+ UnifiedExpressionVisitor<PrintSExpression>::visit(curr);
}
void setMinify(bool minify_) {
@@ -2203,6 +2204,22 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
}
}
+ // Generic visitor, overridden only when necessary.
+ void visitExpression(Expression* curr) {
+ o << '(';
+ printExpressionContents(curr);
+ auto it = ChildIterator(curr);
+ if (!it.children.empty()) {
+ incIndent();
+ for (auto* child : it) {
+ printFullLine(child);
+ }
+ decIndent();
+ } else {
+ o << ')';
+ }
+ }
+
void visitBlock(Block* curr) {
// special-case Block, because Block nesting (in their first element) can be
// incredibly deep
@@ -2296,330 +2313,6 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
}
controlFlowDepth--;
}
- void visitBreak(Break* curr) {
- o << '(';
- printExpressionContents(curr);
- if (curr->condition) {
- incIndent();
- } else {
- if (!curr->value || curr->value->is<Nop>()) {
- // avoid a new line just for the parens
- o << ')';
- return;
- }
- incIndent();
- }
- if (curr->value && !curr->value->is<Nop>()) {
- printFullLine(curr->value);
- }
- if (curr->condition) {
- printFullLine(curr->condition);
- }
- decIndent();
- }
- void visitSwitch(Switch* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- if (curr->value && !curr->value->is<Nop>()) {
- printFullLine(curr->value);
- }
- printFullLine(curr->condition);
- decIndent();
- }
-
- template<typename CallBase> void printCallOperands(CallBase* curr) {
- if (curr->operands.size() > 0) {
- incIndent();
- for (auto operand : curr->operands) {
- printFullLine(operand);
- }
- decIndent();
- } else {
- o << ')';
- }
- }
-
- void visitCall(Call* curr) {
- o << '(';
- printExpressionContents(curr);
- printCallOperands(curr);
- }
- void visitCallIndirect(CallIndirect* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- for (auto operand : curr->operands) {
- printFullLine(operand);
- }
- printFullLine(curr->target);
- decIndent();
- }
- void visitLocalGet(LocalGet* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitLocalSet(LocalSet* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
- void visitGlobalGet(GlobalGet* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitGlobalSet(GlobalSet* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
- void visitLoad(Load* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- decIndent();
- }
- void visitStore(Store* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- printFullLine(curr->value);
- decIndent();
- }
- void visitAtomicRMW(AtomicRMW* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- printFullLine(curr->value);
- decIndent();
- }
- void visitAtomicCmpxchg(AtomicCmpxchg* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- printFullLine(curr->expected);
- printFullLine(curr->replacement);
- decIndent();
- }
- void visitAtomicWait(AtomicWait* curr) {
- o << '(';
- printExpressionContents(curr);
- restoreNormalColor(o);
- incIndent();
- printFullLine(curr->ptr);
- printFullLine(curr->expected);
- printFullLine(curr->timeout);
- decIndent();
- }
- void visitAtomicNotify(AtomicNotify* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- printFullLine(curr->notifyCount);
- decIndent();
- }
- void visitAtomicFence(AtomicFence* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitSIMDExtract(SIMDExtract* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->vec);
- decIndent();
- }
- void visitSIMDReplace(SIMDReplace* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->vec);
- printFullLine(curr->value);
- decIndent();
- }
- void visitSIMDShuffle(SIMDShuffle* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->left);
- printFullLine(curr->right);
- decIndent();
- }
- void visitSIMDTernary(SIMDTernary* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->a);
- printFullLine(curr->b);
- printFullLine(curr->c);
- decIndent();
- }
- void visitSIMDShift(SIMDShift* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->vec);
- printFullLine(curr->shift);
- decIndent();
- }
- void visitSIMDLoad(SIMDLoad* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- decIndent();
- }
- void visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- printFullLine(curr->vec);
- decIndent();
- }
- void visitSIMDWiden(SIMDWiden* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->vec);
- decIndent();
- }
- void visitPrefetch(Prefetch* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ptr);
- decIndent();
- }
- void visitMemoryInit(MemoryInit* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->dest);
- printFullLine(curr->offset);
- printFullLine(curr->size);
- decIndent();
- }
- void visitDataDrop(DataDrop* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitMemoryCopy(MemoryCopy* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->dest);
- printFullLine(curr->source);
- printFullLine(curr->size);
- decIndent();
- }
- void visitMemoryFill(MemoryFill* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->dest);
- printFullLine(curr->value);
- printFullLine(curr->size);
- decIndent();
- }
- void visitConst(Const* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitUnary(Unary* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
- void visitBinary(Binary* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->left);
- printFullLine(curr->right);
- decIndent();
- }
- void visitSelect(Select* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ifTrue);
- printFullLine(curr->ifFalse);
- printFullLine(curr->condition);
- decIndent();
- }
- void visitDrop(Drop* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
- void visitReturn(Return* curr) {
- o << '(';
- printExpressionContents(curr);
- if (!curr->value) {
- // avoid a new line just for the parens
- o << ')';
- return;
- }
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
- void visitMemorySize(MemorySize* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitMemoryGrow(MemoryGrow* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->delta);
- decIndent();
- }
- void visitRefNull(RefNull* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitRefIs(RefIs* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
- void visitRefFunc(RefFunc* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitRefEq(RefEq* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->left);
- printFullLine(curr->right);
- decIndent();
- }
// try-catch-end is written in the folded wat format as
// (try
// (do
@@ -2696,180 +2389,6 @@ struct PrintSExpression : public OverriddenVisitor<PrintSExpression> {
o << " ;; end try";
}
}
- void visitThrow(Throw* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- for (auto operand : curr->operands) {
- printFullLine(operand);
- }
- decIndent();
- }
- void visitRethrow(Rethrow* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitNop(Nop* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitUnreachable(Unreachable* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitPop(Pop* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitTupleMake(TupleMake* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- for (auto operand : curr->operands) {
- printFullLine(operand);
- }
- decIndent();
- }
- void visitTupleExtract(TupleExtract* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->tuple);
- decIndent();
- }
- void visitI31New(I31New* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
- void visitI31Get(I31Get* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->i31);
- decIndent();
- }
- void visitCallRef(CallRef* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- for (auto operand : curr->operands) {
- printFullLine(operand);
- }
- printFullLine(curr->target);
- decIndent();
- }
- void visitRefTest(RefTest* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- printFullLine(curr->rtt);
- decIndent();
- }
- void visitRefCast(RefCast* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- printFullLine(curr->rtt);
- decIndent();
- }
- void visitBrOn(BrOn* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- if (curr->rtt) {
- printFullLine(curr->rtt);
- }
- decIndent();
- }
- void visitRttCanon(RttCanon* curr) {
- o << '(';
- printExpressionContents(curr);
- o << ')';
- }
- void visitRttSub(RttSub* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->parent);
- decIndent();
- }
- void visitStructNew(StructNew* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- for (auto& operand : curr->operands) {
- printFullLine(operand);
- }
- printFullLine(curr->rtt);
- decIndent();
- }
- void visitStructGet(StructGet* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- decIndent();
- }
- void visitStructSet(StructSet* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- printFullLine(curr->value);
- decIndent();
- }
- void visitArrayNew(ArrayNew* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- if (curr->init) {
- printFullLine(curr->init);
- }
- printFullLine(curr->size);
- printFullLine(curr->rtt);
- decIndent();
- }
- void visitArrayGet(ArrayGet* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- printFullLine(curr->index);
- decIndent();
- }
- void visitArraySet(ArraySet* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- printFullLine(curr->index);
- printFullLine(curr->value);
- decIndent();
- }
- void visitArrayLen(ArrayLen* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->ref);
- decIndent();
- }
- void visitRefAs(RefAs* curr) {
- o << '(';
- printExpressionContents(curr);
- incIndent();
- printFullLine(curr->value);
- decIndent();
- }
// Module-level visitors
void handleSignature(Signature curr, Name name = Name()) {
o << "(func";
diff --git a/test/passes/dce_all-features.txt b/test/passes/dce_all-features.txt
index a47153336..8be4a3f71 100644
--- a/test/passes/dce_all-features.txt
+++ b/test/passes/dce_all-features.txt
@@ -581,8 +581,7 @@
(func $throw
(block $label$0
(block $label$1
- (throw $e
- )
+ (throw $e)
)
)
)