This patch fixes part of PR tree-optimization/49749. The operand scans in tree-ssa-reassoc.c:get_rank() can be prematurely halted by two erroneous conditions, which this patch removes. Patch pre-approved by IRC communication with Richard Guenther, 7/21/11.
The wider issue of biasing reassociation in favor of loop-carried dependencies is still pending. Bootstrapped and regression-tested on powerpc64-linux. I'll commit it shortly. 2011-07-21 Bill Schmidt <wschm...@linux.vnet.ibm.com> PR tree-optimization/49749 * tree-ssa-reassoc.c (get_rank): Fix operand scan conditions and remove no-longer-used maxrank variable. Index: gcc/tree-ssa-reassoc.c =================================================================== --- gcc/tree-ssa-reassoc.c (revision 176569) +++ gcc/tree-ssa-reassoc.c (working copy) @@ -235,7 +235,7 @@ get_rank (tree e) if (TREE_CODE (e) == SSA_NAME) { gimple stmt; - long rank, maxrank; + long rank; int i, n; if (TREE_CODE (SSA_NAME_VAR (e)) == PARM_DECL @@ -258,7 +258,6 @@ get_rank (tree e) /* Otherwise, find the maximum rank for the operands, or the bb rank, whichever is less. */ rank = 0; - maxrank = bb_rank[gimple_bb(stmt)->index]; if (gimple_assign_single_p (stmt)) { tree rhs = gimple_assign_rhs1 (stmt); @@ -267,15 +266,15 @@ get_rank (tree e) rank = MAX (rank, get_rank (rhs)); else { - for (i = 0; - i < n && TREE_OPERAND (rhs, i) && rank != maxrank; i++) - rank = MAX(rank, get_rank (TREE_OPERAND (rhs, i))); + for (i = 0; i < n; i++) + if (TREE_OPERAND (rhs, i)) + rank = MAX(rank, get_rank (TREE_OPERAND (rhs, i))); } } else { n = gimple_num_ops (stmt); - for (i = 1; i < n && rank != maxrank; i++) + for (i = 1; i < n; i++) { gcc_assert (gimple_op (stmt, i)); rank = MAX(rank, get_rank (gimple_op (stmt, i)));