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" } } */

Reply via email to