This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Property for vector lowering
- From: Marc Glisse <marc dot glisse at inria dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 6 Dec 2012 18:19:17 +0100 (CET)
- Subject: 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 */
}
};