diff options
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 255ff4cbd..7cdc048f7 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -380,16 +380,32 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions, // Y // X // ) + // Note that this reorders X and Y, so we need to be careful about that. if (auto* sub = binary->left->dynCast<Binary>()) { if (sub->op == SubInt32) { if (auto* subZero = sub->left->dynCast<Const>()) { if (subZero->value.geti32() == 0) { - sub->left = binary->right; - return sub; + if (EffectAnalyzer::canReorder(getPassOptions(), sub->right, binary->right)) { + sub->left = binary->right; + return sub; + } } } } } + // The flip case is even easier, as no reordering occurs: + // (i32.add + // Y + // (i32.sub + // (i32.const 0) + // X + // ) + // ) + // => + // (i32.sub + // Y + // X + // ) if (auto* sub = binary->right->dynCast<Binary>()) { if (sub->op == SubInt32) { if (auto* subZero = sub->left->dynCast<Const>()) { @@ -761,6 +777,7 @@ private: constant += value * mul; constants.push_back(c); } + return; } else if (auto* binary = curr->dynCast<Binary>()) { if (binary->op == AddInt32) { seek(binary->left, mul); |