diff options
author | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-07-29 19:00:37 -0700 |
---|---|---|
committer | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-07-29 19:18:54 -0700 |
commit | 56e49752b4258b89660825f2970a7e55067d7122 (patch) | |
tree | e37b0c1ce232995ba757fc87730e936b0be7b597 /src/passes/OptimizeInstructions.cpp | |
parent | 7a06499ada2f5d0d349731595b3a09a46919c443 (diff) | |
download | binaryen-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.cpp | 15 |
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 |