diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2015-05-19 16:02:15 +0200 |
---|---|---|
committer | Mikael Peltier <mikaelpeltier@google.com> | 2015-05-21 11:06:19 +0000 |
commit | 2a9ba9420757bba501858d56eada436716fb0d41 (patch) | |
tree | f29d3948017e048b999ceda19270ec9d474ec06b /jack/src | |
parent | e09b67627256f40adc3b48372a4ad91e73c5b67f (diff) | |
download | toolchain_jack-2a9ba9420757bba501858d56eada436716fb0d41.tar.gz toolchain_jack-2a9ba9420757bba501858d56eada436716fb0d41.tar.bz2 toolchain_jack-2a9ba9420757bba501858d56eada436716fb0d41.zip |
NotSimplifier must take into account floating types
- cmpl-x and cmpg-x do not return the same value for Nan operands.
Consequently !(a>b) can not be replace by a<=b when using floating
types otherwise the condition will not be evaluated correctly at runtime.
Bug: 21212402
Change-Id: Idfd37459b0013e1d0fba274bbc0f9acc103bb605
(cherry picked from commit 0635c13e2a4581dec9e3b3e78c4b6dcd8327a2d7)
Diffstat (limited to 'jack/src')
-rw-r--r-- | jack/src/com/android/jack/optimizations/NotSimplifier.java | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/jack/src/com/android/jack/optimizations/NotSimplifier.java b/jack/src/com/android/jack/optimizations/NotSimplifier.java index 9c291a62..27ba27cd 100644 --- a/jack/src/com/android/jack/optimizations/NotSimplifier.java +++ b/jack/src/com/android/jack/optimizations/NotSimplifier.java @@ -29,6 +29,7 @@ import com.android.jack.ir.ast.JUnaryOperation; import com.android.jack.ir.ast.JUnaryOperator; import com.android.jack.ir.ast.JVisitor; import com.android.jack.ir.ast.UnsupportedOperatorException; +import com.android.jack.ir.types.JFloatingPointType; import com.android.jack.lookup.CommonTypes; import com.android.jack.transformations.request.Replace; import com.android.jack.transformations.request.TransformationRequest; @@ -90,14 +91,16 @@ public class NotSimplifier implements RunnableSchedulable<JMethod> { opBeforeTransformation++; JBinaryOperator op = binaryOp.getOp(); - if (op.isComparison() || op.isConditionalOperation() + if ((op.isComparison() && !useFloatingTypes(binaryOp)) + || op.isConditionalOperation() || op == JBinaryOperator.BIT_AND || op == JBinaryOperator.BIT_OR) { // Operator will be inverse, thus it exists before and after the transformation. opAfterTransformation++; } else { assert op == JBinaryOperator.ASG - || op == JBinaryOperator.BIT_XOR; + || op == JBinaryOperator.BIT_XOR + || op.isComparison() && useFloatingTypes(binaryOp); // Operator could not be inverse, thus it always exists after transformation and first // enclosing '!' should also be added. opAfterTransformation += 2; @@ -114,6 +117,11 @@ public class NotSimplifier implements RunnableSchedulable<JMethod> { // This '!' operator will disappear, do not add it in countOpAfter. return false; } + + private boolean useFloatingTypes(@Nonnull JBinaryOperation binaryOp) { + return binaryOp.getLhs().getType() instanceof JFloatingPointType || + binaryOp.getRhs().getType() instanceof JFloatingPointType; + } } /** |