changeset 744:36ee9b69616e

6833879: Assigning positive zero is ignored when old value is negative zero Summary: Don't perform CMOVE identity optimization for floating point types Reviewed-by: kvn, never
author cfang
date Tue, 05 May 2009 11:02:10 -0700
parents 2b25645dab33
children cecd04fc6f93 93c14e5562c4 f53b154d959d
files src/share/vm/opto/connode.cpp
diffstat 1 files changed, 4 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/opto/connode.cpp	Mon May 04 22:06:47 2009 -0700
+++ b/src/share/vm/opto/connode.cpp	Tue May 05 11:02:10 2009 -0700
@@ -128,6 +128,10 @@
       // Swapped Cmp is OK
       (phase->eqv(cmp->in(2),f) &&
        phase->eqv(cmp->in(1),t)) ) {
+    // Give up this identity check for floating points because it may choose incorrect
+    // value around 0.0 and -0.0
+    if ( cmp->Opcode()==Op_CmpF || cmp->Opcode()==Op_CmpD )
+      return NULL;
     // Check for "(t==f)?t:f;" and replace with "f"
     if( b->_test._test == BoolTest::eq )
       return f;