From c4fdf46c69a0b01b4fe2469f30be30104b5c6ddf Mon Sep 17 00:00:00 2001 From: kvn Date: Fri, 29 Feb 2008 19:07:15 -0800 Subject: 6667588: Don't generate duplicated CMP for float/double values Summary: float CMove generation add duplicated CMPF if there are more then one Move depending on the condition. Reviewed-by: jrose, never, rasbold --- src/share/vm/opto/loopopts.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/share/vm/opto/loopopts.cpp') diff --git a/src/share/vm/opto/loopopts.cpp b/src/share/vm/opto/loopopts.cpp index 0da6b1eee..d7b9ec893 100644 --- a/src/share/vm/opto/loopopts.cpp +++ b/src/share/vm/opto/loopopts.cpp @@ -435,9 +435,11 @@ Node *PhaseIdealLoop::conditional_move( Node *region ) { // Check profitability int cost = 0; + int phis = 0; for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) { Node *out = region->fast_out(i); if( !out->is_Phi() ) continue; // Ignore other control edges, etc + phis++; PhiNode* phi = out->as_Phi(); switch (phi->type()->basic_type()) { case T_LONG: @@ -489,6 +491,12 @@ Node *PhaseIdealLoop::conditional_move( Node *region ) { } } if( cost >= ConditionalMoveLimit ) return NULL; // Too much goo + Node* bol = iff->in(1); + assert( bol->Opcode() == Op_Bool, "" ); + int cmp_op = bol->in(1)->Opcode(); + // It is expensive to generate flags from a float compare. + // Avoid duplicated float compare. + if( phis > 1 && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) return NULL; // -------------- // Now replace all Phis with CMOV's -- cgit v1.2.3