# HG changeset patch # User Gilles Duboscq # Date 1310469011 -7200 # Node ID ccd6318f294d577ae0623f98ce2d1df4627eb2d7 # Parent 9fcb0ef7f5c565b407803ceb56a27efd208fe1ce Fix for NormalizeCompare->Compare canonicalization : care must be taken for the unordered case diff -r 9fcb0ef7f5c5 -r ccd6318f294d graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java --- 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); } diff -r 9fcb0ef7f5c5 -r ccd6318f294d graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NormalizeCompare.java --- 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; + } } diff -r 9fcb0ef7f5c5 -r ccd6318f294d graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java --- 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); } } diff -r 9fcb0ef7f5c5 -r ccd6318f294d graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java --- 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);