summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)
)
)
)