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]

Re: [patch] Fold constants in vectorizer


Hello,

> >	* tree-vect-transform.c (vect_generate_tmps_on_preheader): Fold the
> >	emited expressions.
> >
> OK.

I found several more instances of the same problem; this is the final
version of the patch, bootstrapped & regtested on i686, that I am
commiting now.

Zdenek

Index: ChangeLog
===================================================================
*** ChangeLog	(revision 118924)
--- ChangeLog	(working copy)
***************
*** 1,5 ****
--- 1,12 ----
  2006-11-17  Zdenek Dvorak <dvorakz@suse.cz>
  
+ 	* tree-vect-transform.c (vect_create_epilog_for_reduction): Fix
+ 	formating.
+ 	(vect_generate_tmps_on_preheader, vect_update_ivs_after_vectorizer,
+ 	vect_gen_niters_for_prolog_loop): Fold the emited expressions.
+ 
+ 2006-11-17  Zdenek Dvorak <dvorakz@suse.cz>
+ 
  	* tree-ssa-alias.c (new_type_alias): Do not use offset of expr to
  	select subvars of var.
  
Index: tree-vect-transform.c
===================================================================
*** tree-vect-transform.c	(revision 118923)
--- tree-vect-transform.c	(working copy)
*************** vect_create_epilog_for_reduction (tree v
*** 1100,1112 ****
  	      tree bitpos = size_int (bit_offset);
  
  	      epilog_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,
! 	      build2 (shift_code, vectype, new_temp, bitpos));
  	      new_name = make_ssa_name (vec_dest, epilog_stmt);
  	      TREE_OPERAND (epilog_stmt, 0) = new_name;
  	      bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
  
  	      epilog_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,
! 	      build2 (code, vectype, new_name, new_temp));
  	      new_temp = make_ssa_name (vec_dest, epilog_stmt);
  	      TREE_OPERAND (epilog_stmt, 0) = new_temp;
  	      bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
--- 1100,1114 ----
  	      tree bitpos = size_int (bit_offset);
  
  	      epilog_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,
! 				    build2 (shift_code, vectype,
! 					    new_temp, bitpos));
  	      new_name = make_ssa_name (vec_dest, epilog_stmt);
  	      TREE_OPERAND (epilog_stmt, 0) = new_name;
  	      bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
  
  	      epilog_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,
! 				    build2 (code, vectype,
! 					    new_name, new_temp));
  	      new_temp = make_ssa_name (vec_dest, epilog_stmt);
  	      TREE_OPERAND (epilog_stmt, 0) = new_temp;
  	      bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
*************** vect_generate_tmps_on_preheader (loop_ve
*** 3165,3193 ****
  
    /* Create: ratio = ni >> log2(vf) */
  
!   var = create_tmp_var (TREE_TYPE (ni), "bnd");
!   add_referenced_var (var);
!   ratio_name = make_ssa_name (var, NULL_TREE);
!   stmt = build2 (MODIFY_EXPR, void_type_node, ratio_name,
! 	   build2 (RSHIFT_EXPR, TREE_TYPE (ni_name), ni_name, log_vf));
!   SSA_NAME_DEF_STMT (ratio_name) = stmt;
  
!   pe = loop_preheader_edge (loop);
!   new_bb = bsi_insert_on_edge_immediate (pe, stmt);
!   gcc_assert (!new_bb);
         
    /* Create: ratio_mult_vf = ratio << log2 (vf).  */
  
!   var = create_tmp_var (TREE_TYPE (ni), "ratio_mult_vf");
!   add_referenced_var (var);
!   ratio_mult_vf_name = make_ssa_name (var, NULL_TREE);
!   stmt = build2 (MODIFY_EXPR, void_type_node, ratio_mult_vf_name,
! 	   build2 (LSHIFT_EXPR, TREE_TYPE (ratio_name), ratio_name, log_vf));
!   SSA_NAME_DEF_STMT (ratio_mult_vf_name) = stmt;
  
!   pe = loop_preheader_edge (loop);
!   new_bb = bsi_insert_on_edge_immediate (pe, stmt);
!   gcc_assert (!new_bb);
  
    *ni_name_ptr = ni_name;
    *ratio_mult_vf_name_ptr = ratio_mult_vf_name;
--- 3167,3199 ----
  
    /* Create: ratio = ni >> log2(vf) */
  
!   ratio_name = fold_build2 (RSHIFT_EXPR, TREE_TYPE (ni_name), ni_name, log_vf);
!   if (!is_gimple_val (ratio_name))
!     {
!       var = create_tmp_var (TREE_TYPE (ni), "bnd");
!       add_referenced_var (var);
  
!       ratio_name = force_gimple_operand (ratio_name, &stmt, true, var);
!       pe = loop_preheader_edge (loop);
!       new_bb = bsi_insert_on_edge_immediate (pe, stmt);
!       gcc_assert (!new_bb);
!     }
         
    /* Create: ratio_mult_vf = ratio << log2 (vf).  */
  
!   ratio_mult_vf_name = fold_build2 (LSHIFT_EXPR, TREE_TYPE (ratio_name),
! 				    ratio_name, log_vf);
!   if (!is_gimple_val (ratio_mult_vf_name))
!     {
!       var = create_tmp_var (TREE_TYPE (ni), "ratio_mult_vf");
!       add_referenced_var (var);
  
!       ratio_mult_vf_name = force_gimple_operand (ratio_mult_vf_name, &stmt,
! 						 true, var);
!       pe = loop_preheader_edge (loop);
!       new_bb = bsi_insert_on_edge_immediate (pe, stmt);
!       gcc_assert (!new_bb);
!     }
  
    *ni_name_ptr = ni_name;
    *ratio_mult_vf_name_ptr = ratio_mult_vf_name;
*************** vect_update_ivs_after_vectorizer (loop_v
*** 3375,3383 ****
        init_expr = unshare_expr (initial_condition_in_loop_num (access_fn, 
  							       loop->num));
  
!       ni = build2 (PLUS_EXPR, TREE_TYPE (init_expr),
! 		  build2 (MULT_EXPR, TREE_TYPE (niters),
! 		       niters, step_expr), init_expr);
  
        var = create_tmp_var (TREE_TYPE (init_expr), "tmp");
        add_referenced_var (var);
--- 3381,3389 ----
        init_expr = unshare_expr (initial_condition_in_loop_num (access_fn, 
  							       loop->num));
  
!       ni = fold_build2 (PLUS_EXPR, TREE_TYPE (init_expr),
! 			fold_build2 (MULT_EXPR, TREE_TYPE (niters),
! 				     niters, step_expr), init_expr);
  
        var = create_tmp_var (TREE_TYPE (init_expr), "tmp");
        add_referenced_var (var);
*************** vect_gen_niters_for_prolog_loop (loop_ve
*** 3530,3544 ****
    
        /* Create:  byte_misalign = addr & (vectype_size - 1)  */
        byte_misalign = 
!         build2 (BIT_AND_EXPR, type, start_addr, vectype_size_minus_1);
    
        /* Create:  elem_misalign = byte_misalign / element_size  */
        elem_misalign =
!         build2 (RSHIFT_EXPR, type, byte_misalign, elem_size_log);
  
        /* Create:  (niters_type) (VF - elem_misalign)&(VF - 1)  */
!       iters = build2 (MINUS_EXPR, type, vf_tree, elem_misalign);
!       iters = build2 (BIT_AND_EXPR, type, iters, vf_minus_1);
        iters = fold_convert (niters_type, iters);
      }
  
--- 3536,3550 ----
    
        /* Create:  byte_misalign = addr & (vectype_size - 1)  */
        byte_misalign = 
!         fold_build2 (BIT_AND_EXPR, type, start_addr, vectype_size_minus_1);
    
        /* Create:  elem_misalign = byte_misalign / element_size  */
        elem_misalign =
!         fold_build2 (RSHIFT_EXPR, type, byte_misalign, elem_size_log);
  
        /* Create:  (niters_type) (VF - elem_misalign)&(VF - 1)  */
!       iters = fold_build2 (MINUS_EXPR, type, vf_tree, elem_misalign);
!       iters = fold_build2 (BIT_AND_EXPR, type, iters, vf_minus_1);
        iters = fold_convert (niters_type, iters);
      }
  
*************** vect_gen_niters_for_prolog_loop (loop_ve
*** 3547,3553 ****
       greater than vf; since the misalignment ('iters') is at most vf, there's
       no need to generate the MIN_EXPR in this case.  */
    if (TREE_CODE (loop_niters) != INTEGER_CST)
!     iters = build2 (MIN_EXPR, niters_type, iters, loop_niters);
  
    if (vect_print_dump_info (REPORT_DETAILS))
      {
--- 3553,3559 ----
       greater than vf; since the misalignment ('iters') is at most vf, there's
       no need to generate the MIN_EXPR in this case.  */
    if (TREE_CODE (loop_niters) != INTEGER_CST)
!     iters = fold_build2 (MIN_EXPR, niters_type, iters, loop_niters);
  
    if (vect_print_dump_info (REPORT_DETAILS))
      {


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