74
74
75
75
#include < ir/branch-utils.h>
76
76
#include < ir/effects.h>
77
+ #include < ir/iteration.h>
77
78
#include < ir/utils.h>
78
79
#include < pass.h>
79
80
#include < wasm-builder.h>
@@ -397,7 +398,9 @@ void BreakValueDropper::visitBlock(Block* curr) {
397
398
optimizeBlock (curr, getModule (), passOptions, branchInfo);
398
399
}
399
400
400
- struct MergeBlocks : public WalkerPass <PostWalker<MergeBlocks>> {
401
+ struct MergeBlocks
402
+ : public WalkerPass<
403
+ PostWalker<MergeBlocks, UnifiedExpressionVisitor<MergeBlocks>>> {
401
404
bool isFunctionParallel () override { return true ; }
402
405
403
406
Pass* create () override { return new MergeBlocks; }
@@ -491,20 +494,26 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks>> {
491
494
return outer;
492
495
}
493
496
494
- void visitUnary (Unary* curr) { optimize (curr, curr->value ); }
495
- void visitLocalSet (LocalSet* curr) { optimize (curr, curr->value ); }
496
- void visitLoad (Load* curr) { optimize (curr, curr->ptr ); }
497
- void visitReturn (Return* curr) { optimize (curr, curr->value ); }
497
+ // Default optimizations for simple cases. Complex things are overridden
498
+ // below.
499
+ void visitExpression (Expression* curr) {
500
+ // Control flow need special handling. Those we can optimize are handled
501
+ // below.
502
+ if (Properties::isControlFlowStructure (curr)) {
503
+ return ;
504
+ }
498
505
499
- void visitBinary (Binary* curr) {
500
- optimize (curr, curr->right , optimize (curr, curr->left ), &curr->left );
501
- }
502
- void visitStore (Store* curr) {
503
- optimize (curr, curr->value , optimize (curr, curr->ptr ), &curr->ptr );
504
- }
505
- void visitAtomicRMW (AtomicRMW* curr) {
506
- optimize (curr, curr->value , optimize (curr, curr->ptr ), &curr->ptr );
506
+ ChildIterator iterator (curr);
507
+ auto & children = iterator.children ;
508
+ if (children.size () == 1 ) {
509
+ optimize (curr, *children[0 ]);
510
+ } else if (children.size () == 2 ) {
511
+ optimize (curr, *children[0 ], optimize (curr, *children[1 ]), children[1 ]);
512
+ } else if (children.size () == 3 ) {
513
+ optimizeTernary (curr, *children[2 ], *children[1 ], *children[0 ]);
514
+ }
507
515
}
516
+
508
517
void optimizeTernary (Expression* curr,
509
518
Expression*& first,
510
519
Expression*& second,
@@ -528,23 +537,6 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks>> {
528
537
}
529
538
optimize (curr, third, outer);
530
539
}
531
- void visitAtomicCmpxchg (AtomicCmpxchg* curr) {
532
- optimizeTernary (curr, curr->ptr , curr->expected , curr->replacement );
533
- }
534
-
535
- void visitSelect (Select* curr) {
536
- optimizeTernary (curr, curr->ifTrue , curr->ifFalse , curr->condition );
537
- }
538
-
539
- void visitDrop (Drop* curr) { optimize (curr, curr->value ); }
540
-
541
- void visitBreak (Break* curr) {
542
- optimize (curr, curr->condition , optimize (curr, curr->value ), &curr->value );
543
- }
544
-
545
- void visitSwitch (Switch* curr) {
546
- optimize (curr, curr->condition , optimize (curr, curr->value ), &curr->value );
547
- }
548
540
549
541
template <typename T> void handleCall (T* curr) {
550
542
Block* outer = nullptr ;
0 commit comments