@@ -1,3 +1,24 @@
+2013-06-17 Aldy Hernandez <aldyh@redhat.com>
+
+ * builtin-types.def (BT_FN_UINT_PTR): New.
+ * omp-builtins.def (BUILT_IN_GOMP_SIMD_LANE): Use it.
+ (BUILT_IN_GOMP_SIMD_VF): Same.
+ * cfgloop.h (struct loop): Change type of simduid to tree.
+ * omp-low.c (lower_rec_input_clauses): Adapt to use simduid as a
+ tree.
+ (expand_omp_simd): Same.
+ * tree-data-ref.c (get_references_in_stmt): Same.
+ * tree-vect-data-refs.c (vect_analyze_data_refs): Same.
+ * tree-vectorizer.c (struct simduid_to_vf): Change type of simduid
+ to tree.
+ (simduid_to_vf::hash): Hash pointer.
+ (adjust_simduid_builtins): Add comment.
+ Use simduid as tree.
+ * tree-pretty-print.c (dump_omp_clause): Rename
+ OMP_CLAUSE__SIMDUID__UID to OMP_CLAUSE__SIMDUID__DECL.
+ * tree.h (OMP_CLAUSE__SIMDUID__DECL): Rename from
+ OMP_CLAUSE__SIMDUID__UID.
+
2013-06-14 Jakub Jelinek <jakub@redhat.com>
* gimple-pretty-print.c (dump_gimple_omp_for): Don't handle
@@ -227,6 +227,7 @@ DEF_FUNCTION_TYPE_1 (BT_FN_DFLOAT128_DFLOAT128, BT_DFLOAT128, BT_DFLOAT128)
DEF_FUNCTION_TYPE_1 (BT_FN_VOID_VPTR, BT_VOID, BT_VOLATILE_PTR)
DEF_FUNCTION_TYPE_1 (BT_FN_VOID_PTRPTR, BT_VOID, BT_PTR_PTR)
DEF_FUNCTION_TYPE_1 (BT_FN_UINT_UINT, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT_PTR, BT_UINT, BT_PTR)
DEF_FUNCTION_TYPE_1 (BT_FN_ULONG_ULONG, BT_ULONG, BT_ULONG)
DEF_FUNCTION_TYPE_1 (BT_FN_ULONGLONG_ULONGLONG, BT_ULONGLONG, BT_ULONGLONG)
DEF_FUNCTION_TYPE_1 (BT_FN_UINT16_UINT16, BT_UINT16, BT_UINT16)
@@ -176,7 +176,7 @@ struct GTY ((chain_next ("%h.next"))) loop {
/* For SIMD loops, this is a unique identifier of the loop, referenced
by __builtin_GOMP.simd_vf and __builtin_GOMP.simd_lane builtins. */
- unsigned int simduid;
+ tree simduid;
/* True if we should try harder to vectorize this loop. */
bool force_vect;
@@ -220,6 +220,6 @@ DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SINGLE_COPY_END, "GOMP_single_copy_end",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SIMD_LANE, "GOMP.simd_lane",
- BT_FN_UINT_UINT, ATTR_NOVOPS_NOTHROW_LEAF_LIST)
+ BT_FN_UINT_PTR, ATTR_NOVOPS_NOTHROW_LEAF_LIST)
DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SIMD_VF, "GOMP.simd_vf",
- BT_FN_UINT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
+ BT_FN_UINT_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
@@ -2497,7 +2497,6 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
bool copyin_by_ref = false;
bool lastprivate_firstprivate = false;
int pass;
- static int simd_uid;
bool is_simd = (gimple_code (ctx->stmt) == GIMPLE_OMP_FOR
&& gimple_omp_for_kind (ctx->stmt) == GF_OMP_FOR_KIND_SIMD);
int max_vf = 0;
@@ -2887,15 +2886,15 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
if (lane)
{
- tree uid_cst = build_int_cst (unsigned_type_node, ++simd_uid);
+ tree uid = create_tmp_var (ptr_type_node, "simduid");
gimple g
= gimple_build_call (builtin_decl_explicit (BUILT_IN_GOMP_SIMD_LANE), 1,
- uid_cst);
+ uid);
gimple_call_set_lhs (g, lane);
gimple_stmt_iterator gsi = gsi_start_1 (gimple_omp_body_ptr (ctx->stmt));
gsi_insert_before_without_update (&gsi, g, GSI_SAME_STMT);
c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__SIMDUID_);
- OMP_CLAUSE__SIMDUID__UID (c) = uid_cst;
+ OMP_CLAUSE__SIMDUID__DECL (c) = uid;
OMP_CLAUSE_CHAIN (c) = gimple_omp_for_clauses (ctx->stmt);
gimple_omp_for_set_clauses (ctx->stmt, c);
for (int i = 0; i < 2; i++)
@@ -2903,7 +2902,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
{
tree vf = create_tmp_var (unsigned_type_node, NULL);
tree fndecl = builtin_decl_explicit (BUILT_IN_GOMP_SIMD_VF);
- g = gimple_build_call (fndecl, 1, uid_cst);
+ g = gimple_build_call (fndecl, 1, uid);
gimple_call_set_lhs (g, vf);
gimple_seq *seq = i == 0 ? ilist : dlist;
gimple_seq_add_stmt (seq, g);
@@ -5661,7 +5660,7 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
}
if (simduid)
{
- loop->simduid = tree_low_cst (OMP_CLAUSE__SIMDUID__UID (simduid), 1);
+ loop->simduid = OMP_CLAUSE__SIMDUID__DECL (simduid);
cfun->has_simduid_loops = true;
}
/* If not -fno-tree-vectorize, hint that we want to vectorize
@@ -4335,17 +4335,17 @@ get_references_in_stmt (gimple stmt, vec<data_ref_loc, va_stack> *references)
&& !(gimple_call_flags (stmt) & ECF_CONST))
{
/* Allow __builtin_GOMP.simd_lane in their own loops. */
- if (!gimple_call_builtin_p (stmt, BUILT_IN_GOMP_SIMD_LANE))
- clobbers_memory = true;
- else
+ if (gimple_call_builtin_p (stmt, BUILT_IN_GOMP_SIMD_LANE))
{
struct loop *loop = gimple_bb (stmt)->loop_father;
tree uid = gimple_call_arg (stmt, 0);
+ gcc_assert (TREE_CODE (uid) == SSA_NAME);
if (loop == NULL
- || !host_integerp (uid, 1)
- || loop->simduid != tree_low_cst (uid, 1))
+ || loop->simduid != SSA_NAME_VAR (uid))
clobbers_memory = true;
}
+ else
+ clobbers_memory = true;
}
else if (stmt_code == GIMPLE_ASM
&& (gimple_asm_volatile_p (stmt) || gimple_vuse (stmt)))
@@ -594,7 +594,7 @@ dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
case OMP_CLAUSE__SIMDUID_:
pp_string (buffer, "_simduid_(");
- dump_generic_node (buffer, OMP_CLAUSE__SIMDUID__UID (clause),
+ dump_generic_node (buffer, OMP_CLAUSE__SIMDUID__DECL (clause),
spc, flags, false);
pp_character (buffer, ')');
break;
@@ -2939,20 +2939,22 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo,
gimple def = SSA_NAME_DEF_STMT (off);
tree reft = TREE_TYPE (DR_REF (newdr));
if (gimple_call_builtin_p (def,
- BUILT_IN_GOMP_SIMD_LANE)
- && host_integerp (gimple_call_arg (def, 0),
- 1)
- && (unsigned)
- tree_low_cst (gimple_call_arg (def, 0), 1)
- == loop->simduid
- /* For now. */
- && tree_int_cst_equal (TYPE_SIZE_UNIT (reft),
- step))
+ BUILT_IN_GOMP_SIMD_LANE))
{
- DR_OFFSET (newdr) = ssize_int (0);
- DR_STEP (newdr) = step;
- dr = newdr;
- simd_lane_access = true;
+ tree arg = gimple_call_arg (def, 0);
+ gcc_assert (TREE_CODE (arg) == SSA_NAME);
+ arg = SSA_NAME_VAR (arg);
+ if (arg == loop->simduid
+ /* For now. */
+ && tree_int_cst_equal
+ (TYPE_SIZE_UNIT (reft),
+ step))
+ {
+ DR_OFFSET (newdr) = ssize_int (0);
+ DR_STEP (newdr) = step;
+ dr = newdr;
+ simd_lane_access = true;
+ }
}
}
}
@@ -101,6 +101,9 @@ simduid_to_vf::equal (const value_type *p1, const value_type *p2)
return p1->simduid == p2->simduid;
}
+/* Expand BUILT_IN_GOMP_SIMD_LANE and BUILT_IN_GOMP_SIMD_VF into their
+ corresponding constants. */
+
static void
adjust_simduid_builtins (hash_table <simduid_to_vf> &htab)
{
@@ -121,9 +124,11 @@ adjust_simduid_builtins (hash_table <simduid_to_vf> &htab)
is_lane = true;
else if (!gimple_call_builtin_p (stmt, BUILT_IN_GOMP_SIMD_VF))
continue;
- gcc_assert (host_integerp (gimple_call_arg (stmt, 0), 1));
+ tree arg = gimple_call_arg (stmt, 0);
+ gcc_assert (arg != NULL_TREE);
+ gcc_assert (TREE_CODE (arg) == SSA_NAME);
simduid_to_vf *p = NULL, data;
- data.simduid = tree_low_cst (gimple_call_arg (stmt, 0), 1);
+ data.simduid = DECL_UID (SSA_NAME_VAR (arg));
if (htab.is_created ())
p = htab.find (&data);
if (p)
@@ -223,7 +228,7 @@ vectorize_loops (void)
simduid_to_vf *simduid_to_vf_data = XNEW (simduid_to_vf);
if (!simduid_to_vf_htab.is_created ())
simduid_to_vf_htab.create (15);
- simduid_to_vf_data->simduid = loop->simduid;
+ simduid_to_vf_data->simduid = DECL_UID (loop->simduid);
simduid_to_vf_data->vf = loop_vinfo->vectorization_factor;
*simduid_to_vf_htab.find_slot (simduid_to_vf_data, INSERT)
= simduid_to_vf_data;
@@ -2001,7 +2001,7 @@ extern void protected_set_expr_location (tree, location_t);
#define OMP_CLAUSE_SIMDLEN_EXPR(NODE) \
OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SIMDLEN), 0)
-#define OMP_CLAUSE__SIMDUID__UID(NODE) \
+#define OMP_CLAUSE__SIMDUID__DECL(NODE) \
OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE__SIMDUID_), 0)
enum omp_clause_schedule_kind