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
--- a/hotspot/src/share/vm/opto/connode.cpp Mon May 04 22:06:47 2009 -0700
+++ b/hotspot/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;