summaryrefslogtreecommitdiffstats
path: root/jack/src
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2015-05-19 16:02:15 +0200
committerMikael Peltier <mikaelpeltier@google.com>2015-05-21 11:06:19 +0000
commit2a9ba9420757bba501858d56eada436716fb0d41 (patch)
treef29d3948017e048b999ceda19270ec9d474ec06b /jack/src
parente09b67627256f40adc3b48372a4ad91e73c5b67f (diff)
downloadtoolchain_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.java12
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;
+ }
}
/**