summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
authorAlon Zakai (kripken) <alonzakai@gmail.com>2017-07-29 19:00:37 -0700
committerAlon Zakai (kripken) <alonzakai@gmail.com>2017-07-29 19:18:54 -0700
commit56e49752b4258b89660825f2970a7e55067d7122 (patch)
treee37b0c1ce232995ba757fc87730e936b0be7b597 /src/passes/OptimizeInstructions.cpp
parent7a06499ada2f5d0d349731595b3a09a46919c443 (diff)
downloadbinaryen-56e49752b4258b89660825f2970a7e55067d7122.tar.gz
binaryen-56e49752b4258b89660825f2970a7e55067d7122.tar.bz2
binaryen-56e49752b4258b89660825f2970a7e55067d7122.zip
do not swap elements in conditionalizeExpensiveOnBitwise if they invalidate each other - it is not enough to check side effects, we must check the interaction as well
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 263d4a96d..424cbcc67 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -874,14 +874,17 @@ private:
auto* left = binary->left;
auto* right = binary->right;
if (!Properties::emitsBoolean(left) || !Properties::emitsBoolean(right)) return nullptr;
- auto leftEffects = EffectAnalyzer(getPassOptions(), left).hasSideEffects();
- auto rightEffects = EffectAnalyzer(getPassOptions(), right).hasSideEffects();
- if (leftEffects && rightEffects) return nullptr; // both must execute
- // canonicalize with side effects, if any, happening on the left
- if (rightEffects) {
+ auto leftEffects = EffectAnalyzer(getPassOptions(), left);
+ auto rightEffects = EffectAnalyzer(getPassOptions(), right);
+ auto leftSideEffects = leftEffects.hasSideEffects();
+ auto rightSideEffects = rightEffects.hasSideEffects();
+ if (leftSideEffects && rightSideEffects) return nullptr; // both must execute
+ // canonicalize with side effects, if any, happening on the left
+ if (rightSideEffects) {
if (CostAnalyzer(left).cost < MIN_COST) return nullptr; // avoidable code is too cheap
+ if (leftEffects.invalidates(rightEffects)) return nullptr; // cannot reorder
std::swap(left, right);
- } else if (leftEffects) {
+ } else if (leftSideEffects) {
if (CostAnalyzer(right).cost < MIN_COST) return nullptr; // avoidable code is too cheap
} else {
// no side effects, reorder based on cost estimation