changeset 3209:ccd6318f294d

Fix for NormalizeCompare->Compare canonicalization : care must be taken for the unordered case
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Tue, 12 Jul 2011 13:10:11 +0200
parents 9fcb0ef7f5c5
children 27ae76ed33ca
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NormalizeCompare.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java
diffstat 4 files changed, 8 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java	Mon Jul 11 17:55:55 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java	Tue Jul 12 13:10:11 2011 +0200
@@ -223,6 +223,8 @@
                     condition = condition.mirror();
                 }
                 Compare result = new Compare(normalizeNode.x(), condition, normalizeNode.y(), compare.graph());
+                boolean isLess = condition == Condition.LE || condition == Condition.LT || condition == Condition.BE || condition == Condition.BT;
+                result.unorderedIsTrue = condition != Condition.EQ && (condition == Condition.NE || !(isLess ^ normalizeNode.isUnorderedLess()));
                 if (GraalOptions.TraceCanonicalizer) {
                     TTY.println("Replaced Compare+NormalizeCompare with " + result);
                 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NormalizeCompare.java	Mon Jul 11 17:55:55 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NormalizeCompare.java	Tue Jul 12 13:10:11 2011 +0200
@@ -64,4 +64,8 @@
     public Node copy(Graph into) {
         return new NormalizeCompare(opcode, kind, null, null, into);
     }
+
+    public boolean isUnorderedLess() {
+        return this.opcode == Bytecodes.FCMPL || this.opcode == Bytecodes.DCMPL;
+    }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java	Mon Jul 11 17:55:55 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java	Tue Jul 12 13:10:11 2011 +0200
@@ -563,7 +563,7 @@
                 // Checkstyle: on
             }
             masm.jcc(acond, op.label());
-            if (unorderedLabel != null) {
+            if (unorderedLabel != null && op.unorderedBlock() == null) {
                 masm.bind(unorderedLabel);
             }
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Mon Jul 11 17:55:55 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Tue Jul 12 13:10:11 2011 +0200
@@ -427,8 +427,7 @@
             lir.cmp(Condition.TRUE, left.result(), right.result());
         } else if (x.x().kind.isFloat() || x.x().kind.isDouble()) {
             CiValue reg = createResultVariable(x);
-            int code = x.opcode;
-            lir.fcmp2int(left.result(), right.result(), reg, code == Bytecodes.FCMPL || code == Bytecodes.DCMPL);
+            lir.fcmp2int(left.result(), right.result(), reg, x.isUnorderedLess());
         } else if (x.x().kind.isLong() || x.x().kind.isWord()) {
             CiValue reg = createResultVariable(x);
             lir.lcmp2int(left.result(), right.result(), reg);