# HG changeset patch # User cfang # Date 1241546530 25200 # Node ID 36ee9b69616e87c3ff6912c21b04db87ba5954ff # Parent 2b25645dab33e7d01777bfd8445c31152b71b820 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 diff -r 2b25645dab33 -r 36ee9b69616e src/share/vm/opto/connode.cpp --- 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;