Mercurial > hg > graal-compiler
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);