This loosens the restriction of only coalescing SSA names with the same base variable by ignoring that restriction for DECL_INGORED_P base variables (ok, all of them can and should be anonymous SSA names now, but code obviously hasn't catched up 100%).
This improves the code generated for the loop in the testcase to <fallthru> .p2align 4,,10 .p2align 3 .L4: xorps %xmm1, %xmm1 cvtsi2ss %eax, %xmm1 addl $1, %eax cmpl %edi, %eax addss %xmm1, %xmm0 jne .L4 from jmp .L4 .p2align 4,,10 .p2align 3 .L6: movaps %xmm0, %xmm1 .L4: xorps %xmm0, %xmm0 cvtsi2ss %eax, %xmm0 addl $1, %eax cmpl %edi, %eax addss %xmm1, %xmm0 jne .L6 avoiding the copy on the backedge and the loop entry jump. Overall this is similar to what Jeff was after with his latest adjustment of this code. Bootstrap and regtest ongoing on x86_64-unknown-linux-gnu. Richard. 2013-09-25 Richard Biener <rguent...@suse.de> * tree-ssa-live.c (var_map_base_init): Handle SSA names with DECL_IGNORED_P base variables like anonymous SSA names. (loe_visit_block): Use gcc_checking_assert. * tree-ssa-coalesce.c (create_outofssa_var_map): Use gimple_assign_ssa_name_copy_p. (gimple_can_coalesce_p): Adjust according to the var_map_base_init change. * gcc.dg/tree-ssa/coalesce-2.c: New testcase. Index: gcc/tree-ssa-live.c =================================================================== *** gcc/tree-ssa-live.c (revision 202883) --- gcc/tree-ssa-live.c (working copy) *************** var_map_base_init (var_map map) *** 104,110 **** struct tree_int_map **slot; unsigned baseindex; var = partition_to_var (map, x); ! if (SSA_NAME_VAR (var)) m->base.from = SSA_NAME_VAR (var); else /* This restricts what anonymous SSA names we can coalesce --- 104,111 ---- struct tree_int_map **slot; unsigned baseindex; var = partition_to_var (map, x); ! if (SSA_NAME_VAR (var) ! && !DECL_IGNORED_P (SSA_NAME_VAR (var))) m->base.from = SSA_NAME_VAR (var); else /* This restricts what anonymous SSA names we can coalesce *************** loe_visit_block (tree_live_info_p live, *** 990,998 **** edge_iterator ei; basic_block pred_bb; bitmap loe; - gcc_assert (!bitmap_bit_p (visited, bb->index)); bitmap_set_bit (visited, bb->index); loe = live_on_entry (live, bb); FOR_EACH_EDGE (e, ei, bb->preds) --- 993,1002 ---- edge_iterator ei; basic_block pred_bb; bitmap loe; + gcc_checking_assert (!bitmap_bit_p (visited, bb->index)); bitmap_set_bit (visited, bb->index); + loe = live_on_entry (live, bb); FOR_EACH_EDGE (e, ei, bb->preds) Index: gcc/tree-ssa-coalesce.c =================================================================== *** gcc/tree-ssa-coalesce.c (revision 202883) --- gcc/tree-ssa-coalesce.c (working copy) *************** create_outofssa_var_map (coalesce_list_p *** 980,989 **** { tree lhs = gimple_assign_lhs (stmt); tree rhs1 = gimple_assign_rhs1 (stmt); ! ! if (gimple_assign_copy_p (stmt) ! && TREE_CODE (lhs) == SSA_NAME ! && TREE_CODE (rhs1) == SSA_NAME && gimple_can_coalesce_p (lhs, rhs1)) { v1 = SSA_NAME_VERSION (lhs); --- 982,988 ---- { tree lhs = gimple_assign_lhs (stmt); tree rhs1 = gimple_assign_rhs1 (stmt); ! if (gimple_assign_ssa_name_copy_p (stmt) && gimple_can_coalesce_p (lhs, rhs1)) { v1 = SSA_NAME_VERSION (lhs); *************** gimple_can_coalesce_p (tree name1, tree *** 1347,1353 **** { /* First check the SSA_NAME's associated DECL. We only want to coalesce if they have the same DECL or both have no associated DECL. */ ! if (SSA_NAME_VAR (name1) != SSA_NAME_VAR (name2)) return false; /* Now check the types. If the types are the same, then we should --- 1346,1356 ---- { /* First check the SSA_NAME's associated DECL. We only want to coalesce if they have the same DECL or both have no associated DECL. */ ! tree var1 = SSA_NAME_VAR (name1); ! tree var2 = SSA_NAME_VAR (name2); ! var1 = (var1 && !DECL_IGNORED_P (var1)) ? var1 : NULL_TREE; ! var2 = (var2 && !DECL_IGNORED_P (var2)) ? var2 : NULL_TREE; ! if (var1 != var2) return false; /* Now check the types. If the types are the same, then we should Index: gcc/testsuite/gcc.dg/tree-ssa/coalesce-2.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/coalesce-2.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-ssa/coalesce-2.c (working copy) @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-rtl-expand-details" } */ + +float total = 0.2; +void foo(int n) +{ + int i; + for (i = 0; i < n; i++) + total += i; +} + +/* Verify that out-of-ssa coalescing did its job by verifying there are not + any partition copies inserted. */ + +/* { dg-final { scan-rtl-dump-not "partition copy" "expand"} } */ +/* { dg-final { cleanup-rtl-dump "expand" } } */