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]

Property for vector lowering


Hello,

this patch (for 4.9) introduces a property so we can check if vector operations have been lowered yet. It mimics the complex lowering property, and this required moving the -O0 vector lowering pass (otherwise it breaks many testcases with "covariant" in their name).

The tree-ssa-forwprop.c part was mostly to test if this was working, it may need some changes and I am fine with leaving it out for now. One day, lower_vec_perm might be able to do something cleverer than a constructor of element bitfields, for instance in the case where the vector is only twice the size of supported vector operations and both arguments are the same, then we could lower: vec_perm_expr(v,v,m) into {vec_perm_expr(v0,v1,m0), vec_perm_expr(v0,v1,m1)} where v0 is the first half of v, etc.

Passes bootstrap+testsuite on x86_64-linux (same number of PASS afterwards, it is hard to compare lines exactly with the pass numbering changes).

2012-12-06 Marc Glisse <marc.glisse@inria.fr>

	* tree-pass.h (PROP_gimple_lvec): New.
	* passes.c (dump_properties): Handle PROP_gimple_lvec.
	(init_optimization_passes): Move pass_lower_vector.
	* tree-vect-generic.c (gate_expand_vector_operations_ssa): Test
	PROP_gimple_lvec.
	(pass_lower_vector): Provide PROP_gimple_lvec.
	(pass_lower_vector_ssa): Likewise.
	* cfgexpand.c (pass_expand): Require PROP_gimple_lvec.
	* tree-ssa-forwprop.c (simplify_vector_constructor): Test
	PROP_gimple_lvec.

--
Marc Glisse
Index: passes.c
===================================================================
--- passes.c	(revision 194247)
+++ passes.c	(working copy)
@@ -1305,21 +1305,20 @@ init_optimization_passes (void)
   NEXT_PASS (pass_ipa_free_lang_data);
   NEXT_PASS (pass_ipa_function_and_variable_visibility);
   NEXT_PASS (pass_early_local_passes);
     {
       struct opt_pass **p = &pass_early_local_passes.pass.sub;
       NEXT_PASS (pass_fixup_cfg);
       NEXT_PASS (pass_init_datastructures);
       NEXT_PASS (pass_expand_omp);
 
       NEXT_PASS (pass_build_ssa);
-      NEXT_PASS (pass_lower_vector);
       NEXT_PASS (pass_early_warn_uninitialized);
       NEXT_PASS (pass_rebuild_cgraph_edges);
       NEXT_PASS (pass_inline_parameters);
       NEXT_PASS (pass_early_inline);
       NEXT_PASS (pass_all_early_optimizations);
 	{
 	  struct opt_pass **p = &pass_all_early_optimizations.pass.sub;
 	  NEXT_PASS (pass_remove_cgraph_callee_edges);
 	  NEXT_PASS (pass_rename_ssa_copies);
 	  NEXT_PASS (pass_ccp);
@@ -1549,20 +1548,21 @@ init_optimization_passes (void)
       NEXT_PASS (pass_uncprop);
       NEXT_PASS (pass_local_pure_const);
     }
   NEXT_PASS (pass_tm_init);
     {
       struct opt_pass **p = &pass_tm_init.pass.sub;
       NEXT_PASS (pass_tm_mark);
       NEXT_PASS (pass_tm_memopt);
       NEXT_PASS (pass_tm_edges);
     }
+  NEXT_PASS (pass_lower_vector);
   NEXT_PASS (pass_lower_complex_O0);
   NEXT_PASS (pass_asan_O0);
   NEXT_PASS (pass_tsan_O0);
   NEXT_PASS (pass_cleanup_eh);
   NEXT_PASS (pass_lower_resx);
   NEXT_PASS (pass_nrv);
   NEXT_PASS (pass_mudflap_2);
   NEXT_PASS (pass_cleanup_cfg_post_optimizing);
   NEXT_PASS (pass_warn_function_noreturn);
 
@@ -2769,20 +2769,22 @@ dump_properties (FILE *dump, unsigned in
   if (props & PROP_ssa)
     fprintf (dump, "PROP_ssa\n");
   if (props & PROP_no_crit_edges)
     fprintf (dump, "PROP_no_crit_edges\n");
   if (props & PROP_rtl)
     fprintf (dump, "PROP_rtl\n");
   if (props & PROP_gimple_lomp)
     fprintf (dump, "PROP_gimple_lomp\n");
   if (props & PROP_gimple_lcx)
     fprintf (dump, "PROP_gimple_lcx\n");
+  if (props & PROP_gimple_lvec)
+    fprintf (dump, "PROP_gimple_lvec\n");
   if (props & PROP_cfglayout)
     fprintf (dump, "PROP_cfglayout\n");
 }
 
 DEBUG_FUNCTION void
 debug_properties (unsigned int props)
 {
   dump_properties (stderr, props);
 }
 
Index: tree-pass.h
===================================================================
--- tree-pass.h	(revision 194247)
+++ tree-pass.h	(working copy)
@@ -142,20 +142,21 @@ struct simple_ipa_opt_pass
 #define PROP_gimple_lcf		(1 << 1)	/* lowered control flow */
 #define PROP_gimple_leh		(1 << 2)	/* lowered eh */
 #define PROP_cfg		(1 << 3)
 #define PROP_ssa		(1 << 5)
 #define PROP_no_crit_edges      (1 << 6)
 #define PROP_rtl		(1 << 7)
 #define PROP_gimple_lomp	(1 << 8)	/* lowered OpenMP directives */
 #define PROP_cfglayout	 	(1 << 9)	/* cfglayout mode on RTL */
 #define PROP_gimple_lcx		(1 << 10)       /* lowered complex */
 #define PROP_loops		(1 << 11)	/* preserve loop structures */
+#define PROP_gimple_lvec	(1 << 12)       /* lowered vector */
 
 #define PROP_trees \
   (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
 
 /* To-do flags.  */
 #define TODO_ggc_collect		(1 << 1)
 #define TODO_verify_ssa			(1 << 2)
 #define TODO_verify_flow		(1 << 3)
 #define TODO_verify_stmts		(1 << 4)
 #define TODO_cleanup_cfg        	(1 << 5)
Index: tree-ssa-forwprop.c
===================================================================
--- tree-ssa-forwprop.c	(revision 194247)
+++ tree-ssa-forwprop.c	(working copy)
@@ -2855,28 +2855,30 @@ simplify_vector_constructor (gimple_stmt
     }
   if (i < nelts)
     return false;
 
   if (maybe_ident)
     gimple_assign_set_rhs_from_tree (gsi, orig);
   else
     {
       tree mask_type, *mask_elts;
 
-      if (!can_vec_perm_p (TYPE_MODE (type), false, sel))
+      if (cfun->curr_properties & PROP_gimple_lvec
+	  && !can_vec_perm_p (TYPE_MODE (type), false, sel))
 	return false;
       mask_type
 	= build_vector_type (build_nonstandard_integer_type (elem_size, 1),
 			     nelts);
-      if (GET_MODE_CLASS (TYPE_MODE (mask_type)) != MODE_VECTOR_INT
-	  || GET_MODE_SIZE (TYPE_MODE (mask_type))
-	     != GET_MODE_SIZE (TYPE_MODE (type)))
+      if (cfun->curr_properties & PROP_gimple_lvec
+	  && (GET_MODE_CLASS (TYPE_MODE (mask_type)) != MODE_VECTOR_INT
+	      || GET_MODE_SIZE (TYPE_MODE (mask_type))
+		 != GET_MODE_SIZE (TYPE_MODE (type))))
 	return false;
       mask_elts = XALLOCAVEC (tree, nelts);
       for (i = 0; i < nelts; i++)
 	mask_elts[i] = build_int_cst (TREE_TYPE (mask_type), sel[i]);
       op2 = build_vector (mask_type, mask_elts);
       gimple_assign_set_rhs_with_ops_1 (gsi, VEC_PERM_EXPR, orig, orig, op2);
     }
   update_stmt (gsi_stmt (*gsi));
   return true;
 }
Index: tree-vect-generic.c
===================================================================
--- tree-vect-generic.c	(revision 194247)
+++ tree-vect-generic.c	(working copy)
@@ -1466,21 +1466,21 @@ expand_vector_operations_1 (gimple_stmt_
   gimple_assign_set_rhs_from_tree (gsi, new_rhs);
   update_stmt (gsi_stmt (*gsi));
 }
 
 /* Use this to lower vector operations introduced by the vectorizer,
    if it may need the bit-twiddling tricks implemented in this file.  */
 
 static bool
 gate_expand_vector_operations_ssa (void)
 {
-  return optimize == 0;
+  return !(cfun->curr_properties & PROP_gimple_lvec);
 }
 
 static unsigned int
 expand_vector_operations (void)
 {
   gimple_stmt_iterator gsi;
   basic_block bb;
   bool cfg_changed = false;
 
   FOR_EACH_BB (bb)
@@ -1507,21 +1507,21 @@ struct gimple_opt_pass pass_lower_vector
   GIMPLE_PASS,
   "veclower",				/* name */
   OPTGROUP_VEC,                         /* optinfo_flags */
   gate_expand_vector_operations_ssa,    /* gate */
   expand_vector_operations,		/* execute */
   NULL,					/* sub */
   NULL,					/* next */
   0,					/* static_pass_number */
   TV_NONE,				/* tv_id */
   PROP_cfg,				/* properties_required */
-  0,					/* properties_provided */
+  PROP_gimple_lvec,			/* properties_provided */
   0,					/* properties_destroyed */
   0,					/* todo_flags_start */
   TODO_update_ssa	                /* todo_flags_finish */
     | TODO_verify_ssa
     | TODO_verify_stmts | TODO_verify_flow
     | TODO_cleanup_cfg
  }
 };
 
 struct gimple_opt_pass pass_lower_vector_ssa =
@@ -1530,21 +1530,21 @@ struct gimple_opt_pass pass_lower_vector
   GIMPLE_PASS,
   "veclower2",				/* name */
   OPTGROUP_VEC,                         /* optinfo_flags */
   0,	                                /* gate */
   expand_vector_operations,		/* execute */
   NULL,					/* sub */
   NULL,					/* next */
   0,					/* static_pass_number */
   TV_NONE,				/* tv_id */
   PROP_cfg,				/* properties_required */
-  0,					/* properties_provided */
+  PROP_gimple_lvec,			/* properties_provided */
   0,					/* properties_destroyed */
   0,					/* todo_flags_start */
   TODO_update_ssa	                /* todo_flags_finish */
     | TODO_verify_ssa
     | TODO_verify_stmts | TODO_verify_flow
     | TODO_cleanup_cfg
  }
 };
 
 #include "gt-tree-vect-generic.h"
Index: cfgexpand.c
===================================================================
--- cfgexpand.c	(revision 194247)
+++ cfgexpand.c	(working copy)
@@ -4792,18 +4792,19 @@ struct rtl_opt_pass pass_expand =
   RTL_PASS,
   "expand",				/* name */
   OPTGROUP_NONE,                        /* optinfo_flags */
   NULL,                                 /* gate */
   gimple_expand_cfg,			/* execute */
   NULL,                                 /* sub */
   NULL,                                 /* next */
   0,                                    /* static_pass_number */
   TV_EXPAND,				/* tv_id */
   PROP_ssa | PROP_gimple_leh | PROP_cfg
-    | PROP_gimple_lcx,			/* properties_required */
+    | PROP_gimple_lcx
+    | PROP_gimple_lvec,			/* properties_required */
   PROP_rtl,                             /* properties_provided */
   PROP_ssa | PROP_trees,		/* properties_destroyed */
   TODO_verify_ssa | TODO_verify_flow
     | TODO_verify_stmts,		/* todo_flags_start */
   TODO_ggc_collect			/* todo_flags_finish */
  }
 };

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