This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] for PR 17468


Hello,

tree-tailcall is emitting the statements in wrong order (uses before
definitions).  This patch fixes the problem and adds check to verify_ssa
to verify that definitions dominate uses even if they belong to the same
basic block.

The patch does not address Richard's remark about usage of RESULT_DECL;
I have to first recover from shock that we allow so ugly restrictions in
gimple ;-)  (I will send a patch for this issue once it passes testing)

Bootstrapped & regtested on i686.

Zdenek

	PR tree-optimization/17468
	* tree-ssa.c (verify_use, verify_phi_args, verify_ssa):  Verify that
	definition inside a block precede uses.
	* tree-tailcall.c (adjust_return_value): Emit statements in the
	correct order.

Index: tree-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa.c,v
retrieving revision 2.36
diff -c -3 -p -r2.36 tree-ssa.c
*** tree-ssa.c	14 Sep 2004 07:20:05 -0000	2.36
--- tree-ssa.c	14 Sep 2004 16:01:43 -0000
*************** err:
*** 207,217 ****
        arguments).
  
     IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
!       V_MUST_DEF.  */
  
  static bool
  verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
! 	    tree stmt, bool check_abnormal, bool is_virtual)
  {
    bool err = false;
  
--- 207,221 ----
        arguments).
  
     IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
!       V_MUST_DEF.
!    
!    If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
!      that are defined before STMT in basic block BB.  */
  
  static bool
  verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
! 	    tree stmt, bool check_abnormal, bool is_virtual,
! 	    bitmap names_defined_in_bb)
  {
    bool err = false;
  
*************** verify_use (basic_block bb, basic_block 
*** 232,237 ****
--- 236,248 ----
  	     def_bb->index, bb->index);
        err = true;
      }
+   else if (bb == def_bb
+ 	   && names_defined_in_bb != NULL
+ 	   && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
+     {
+       error ("Definition in block %i follows the use", def_bb->index);
+       err = true;
+     }
  
    if (check_abnormal
        && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
*************** verify_phi_args (tree phi, basic_block b
*** 281,287 ****
        if (TREE_CODE (op) == SSA_NAME)
  	err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
  			  phi, e->flags & EDGE_ABNORMAL,
! 			  !is_gimple_reg (PHI_RESULT (phi)));
  
        if (e->dest != bb)
  	{
--- 292,299 ----
        if (TREE_CODE (op) == SSA_NAME)
  	err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
  			  phi, e->flags & EDGE_ABNORMAL,
! 			  !is_gimple_reg (PHI_RESULT (phi)),
! 			  NULL);
  
        if (e->dest != bb)
  	{
*************** verify_ssa (void)
*** 506,511 ****
--- 518,524 ----
    ssa_op_iter iter;
    tree op;
    enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
+   bitmap names_defined_in_bb = BITMAP_XMALLOC ();
  
    timevar_push (TV_TREE_SSA_VERIFY);
  
*************** verify_ssa (void)
*** 578,585 ****
  
        /* Verify the arguments for every PHI node in the block.  */
        for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
! 	if (verify_phi_args (phi, bb, definition_block))
! 	  goto err;
  
        /* Now verify all the uses and vuses in every statement of the block.  */
        for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
--- 591,602 ----
  
        /* Verify the arguments for every PHI node in the block.  */
        for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
! 	{
! 	  if (verify_phi_args (phi, bb, definition_block))
! 	    goto err;
! 	  bitmap_set_bit (names_defined_in_bb,
! 			  SSA_NAME_VERSION (PHI_RESULT (phi)));
! 	}
  
        /* Now verify all the uses and vuses in every statement of the block.  */
        for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
*************** verify_ssa (void)
*** 589,605 ****
  	  FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES)
  	    {
  	      if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
! 			      op, stmt, false, true))
  		goto err;
  	    }
  
  	  FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
  	    {
  	      if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
! 			      op, stmt, false, false))
  		goto err;
  	    }
  	}
      }
  
    /* Finally, verify alias information.  */
--- 606,649 ----
  	  FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES)
  	    {
  	      if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
! 			      op, stmt, false, true,
! 			      names_defined_in_bb))
  		goto err;
  	    }
  
  	  FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
  	    {
  	      if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
! 			      op, stmt, false, false,
! 			      names_defined_in_bb))
! 		goto err;
! 	    }
! 
! 	  FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
! 	    {
! 	      bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
! 	    }
! 	}
! 
!       /* Verify the uses in arguments of PHI nodes at the exits from the
! 	 block.  */
!       for (e = bb->succ; e; e = e->succ_next)
! 	{
! 	  for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
! 	    {
! 	      bool virtual = !is_gimple_reg (PHI_RESULT (phi));
! 	      op = PHI_ARG_DEF_FROM_EDGE (phi, e);
! 	      if (TREE_CODE (op) != SSA_NAME)
! 		continue;
! 
! 	      if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
! 			      op, phi, false, virtual,
! 			      names_defined_in_bb))
  		goto err;
  	    }
  	}
+ 
+       bitmap_clear (names_defined_in_bb);
      }
  
    /* Finally, verify alias information.  */
*************** verify_ssa (void)
*** 613,618 ****
--- 657,663 ----
    else
      dom_computed[CDI_DOMINATORS] = orig_dom_state;
    
+   BITMAP_XFREE (names_defined_in_bb);
    timevar_pop (TV_TREE_SSA_VERIFY);
    return;
  
Index: tree-tailcall.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-tailcall.c,v
retrieving revision 2.26
diff -c -3 -p -r2.26 tree-tailcall.c
*** tree-tailcall.c	10 Sep 2004 12:00:28 -0000	2.26
--- tree-tailcall.c	14 Sep 2004 16:01:44 -0000
*************** adjust_return_value (basic_block bb, tre
*** 624,630 ****
  
        var = make_ssa_name (tmp, stmt);
        TREE_OPERAND (stmt, 0) = var;
!       bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
      }
    else
      var = ret_var;
--- 624,630 ----
  
        var = make_ssa_name (tmp, stmt);
        TREE_OPERAND (stmt, 0) = var;
!       bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
      }
    else
      var = ret_var;
*************** adjust_return_value (basic_block bb, tre
*** 639,645 ****
  
        var = make_ssa_name (tmp, stmt);
        TREE_OPERAND (stmt, 0) = var;
!       bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
      }
  
    TREE_OPERAND (ret_stmt, 0) = var;
--- 639,645 ----
  
        var = make_ssa_name (tmp, stmt);
        TREE_OPERAND (stmt, 0) = var;
!       bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
      }
  
    TREE_OPERAND (ret_stmt, 0) = var;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]