@@ -1,5 +1,41 @@
2014-10-29 David Malcolm <dmalcolm@redhat.com>
+ * gimple.h (struct gimple_statement_omp_return): Rename to...
+ (struct gomp_return): ...this.
+ (is_a_helper <gimple_statement_omp_return *>::test): Rename to...
+ (is_a_helper <gomp_return *>::test): ...this.
+ (is_a_helper <const gimple_statement_omp_return *>::test): Rename to...
+ (is_a_helper <const gomp_return *>::test): ...this.
+ (gimple_build_omp_return): Strengthen return type from gimple to
+ gomp_return *.
+ (gimple_omp_return_set_nowait): Likewise for param.
+ (gimple_omp_return_set_lhs): Likewise.
+ (gimple_omp_return_lhs_ptr): Likewise.
+ (gimple_omp_return_nowait_p): Strengthen param from const_gimple
+ to const gomp_return *.
+ (gimple_omp_return_lhs): Likewise.
+
+ * gimple-pretty-print.c (dump_gimple_omp_return): Strengthen param
+ from gimple to gomp_return *.
+ (pp_gimple_stmt_1): Add checked cast.
+ * gimple-walk.c (walk_gimple_op): Likewise.
+ * gimple.c (gimple_build_omp_return): Strengthen return type and
+ local "p" from gimple to gomp_return *.
+ * omp-low.c (remove_exit_barrier): Replace check against
+ GIMPLE_OMP_RETURN with a dyn_cast, introducing local
+ "omp_return_stmt" and using it in place of "stmt".
+ (expand_omp_for_generic): Introduce local "omp_return_stmt" via a
+ checked cast, using it in place of "gsi_stmt (gsi)".
+ (expand_omp_for_static_nochunk): Likewise.
+ (expand_omp_for_static_chunk): Likewise.
+ (expand_omp_sections): Introduce local "omp_return_stmt" via a
+ checked cast, using it in place of "gsi_stmt (si)".
+ (expand_omp_single): Likewise.
+ (maybe_add_implicit_barrier_cancel): Strengthen local "omp_return"
+ from gimple to gomp_return * via a checked cast.
+
+2014-10-29 David Malcolm <dmalcolm@redhat.com>
+
* gimple.h (gimple_omp_sections_clauses): Strengthen param from
const_gimple to const gomp_sections *.
(gimple_omp_sections_control): Likewise.
@@ -1502,7 +1502,8 @@ dump_gimple_omp_critical (pretty_printer *buffer, gomp_critical *gs,
/* Dump a GIMPLE_OMP_RETURN tuple on the pretty_printer BUFFER. */
static void
-dump_gimple_omp_return (pretty_printer *buffer, gimple gs, int spc, int flags)
+dump_gimple_omp_return (pretty_printer *buffer, gomp_return *gs, int spc,
+ int flags)
{
if (flags & TDF_RAW)
{
@@ -2191,7 +2192,7 @@ pp_gimple_stmt_1 (pretty_printer *buffer, gimple gs, int spc, int flags)
break;
case GIMPLE_OMP_RETURN:
- dump_gimple_omp_return (buffer, gs, spc, flags);
+ dump_gimple_omp_return (buffer, as_a <gomp_return *> (gs), spc, flags);
break;
case GIMPLE_OMP_SECTIONS:
@@ -474,8 +474,9 @@ walk_gimple_op (gimple stmt, walk_tree_fn callback_op,
break;
case GIMPLE_OMP_RETURN:
- ret = walk_tree (gimple_omp_return_lhs_ptr (stmt), callback_op, wi,
- pset);
+ ret = walk_tree (gimple_omp_return_lhs_ptr (
+ as_a <gomp_return *> (stmt)),
+ callback_op, wi, pset);
if (ret)
return ret;
break;
@@ -1001,10 +1001,10 @@ gimple_build_omp_ordered (gimple_seq body)
/* Build a GIMPLE_OMP_RETURN statement.
WAIT_P is true if this is a non-waiting return. */
-gimple
+gomp_return *
gimple_build_omp_return (bool wait_p)
{
- gimple p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
+ gomp_return *p = as_a <gomp_return *> (gimple_alloc (GIMPLE_OMP_RETURN, 0));
if (wait_p)
gimple_omp_return_set_nowait (p);
@@ -711,8 +711,7 @@ struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
};
struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
- gimple_statement_omp_return :
- public gimple_statement_omp_atomic_store_layout
+ gomp_return : public gimple_statement_omp_atomic_store_layout
{
/* No extra fields; adds invariant:
stmt->code == GIMPLE_OMP_RETURN. */
@@ -966,7 +965,7 @@ is_a_helper <gomp_atomic_store *>::test (gimple gs)
template <>
template <>
inline bool
-is_a_helper <gimple_statement_omp_return *>::test (gimple gs)
+is_a_helper <gomp_return *>::test (gimple gs)
{
return gs->code == GIMPLE_OMP_RETURN;
}
@@ -1174,7 +1173,7 @@ is_a_helper <const gomp_atomic_store *>::test (const_gimple gs)
template <>
template <>
inline bool
-is_a_helper <const gimple_statement_omp_return *>::test (const_gimple gs)
+is_a_helper <const gomp_return *>::test (const_gimple gs)
{
return gs->code == GIMPLE_OMP_RETURN;
}
@@ -1340,7 +1339,7 @@ gimple gimple_build_omp_master (gimple_seq);
gimple gimple_build_omp_taskgroup (gimple_seq);
gomp_continue *gimple_build_omp_continue (tree, tree);
gimple gimple_build_omp_ordered (gimple_seq);
-gimple gimple_build_omp_return (bool);
+gomp_return *gimple_build_omp_return (bool);
gomp_sections *gimple_build_omp_sections (gimple_seq, tree);
gimple gimple_build_omp_sections_switch (void);
gomp_single *gimple_build_omp_single (gimple_seq, tree);
@@ -2030,9 +2029,8 @@ gimple_omp_set_subcode (gimple s, unsigned int subcode)
/* Set the nowait flag on OMP_RETURN statement S. */
static inline void
-gimple_omp_return_set_nowait (gimple s)
+gimple_omp_return_set_nowait (gomp_return *s)
{
- GIMPLE_CHECK (s, GIMPLE_OMP_RETURN);
s->subcode |= GF_OMP_RETURN_NOWAIT;
}
@@ -2041,9 +2039,8 @@ gimple_omp_return_set_nowait (gimple s)
flag set. */
static inline bool
-gimple_omp_return_nowait_p (const_gimple g)
+gimple_omp_return_nowait_p (const gomp_return *g)
{
- GIMPLE_CHECK (g, GIMPLE_OMP_RETURN);
return (gimple_omp_subcode (g) & GF_OMP_RETURN_NOWAIT) != 0;
}
@@ -2051,10 +2048,8 @@ gimple_omp_return_nowait_p (const_gimple g)
/* Set the LHS of OMP return. */
static inline void
-gimple_omp_return_set_lhs (gimple g, tree lhs)
+gimple_omp_return_set_lhs (gomp_return *omp_return_stmt, tree lhs)
{
- gimple_statement_omp_return *omp_return_stmt =
- as_a <gimple_statement_omp_return *> (g);
omp_return_stmt->val = lhs;
}
@@ -2062,10 +2057,8 @@ gimple_omp_return_set_lhs (gimple g, tree lhs)
/* Get the LHS of OMP return. */
static inline tree
-gimple_omp_return_lhs (const_gimple g)
+gimple_omp_return_lhs (const gomp_return *omp_return_stmt)
{
- const gimple_statement_omp_return *omp_return_stmt =
- as_a <const gimple_statement_omp_return *> (g);
return omp_return_stmt->val;
}
@@ -2073,10 +2066,8 @@ gimple_omp_return_lhs (const_gimple g)
/* Return a pointer to the LHS of OMP return. */
static inline tree *
-gimple_omp_return_lhs_ptr (gimple g)
+gimple_omp_return_lhs_ptr (gomp_return *omp_return_stmt)
{
- gimple_statement_omp_return *omp_return_stmt =
- as_a <gimple_statement_omp_return *> (g);
return &omp_return_stmt->val;
}
@@ -4739,8 +4739,9 @@ remove_exit_barrier (struct omp_region *region)
if (gsi_end_p (gsi))
continue;
stmt = gsi_stmt (gsi);
- if (gimple_code (stmt) == GIMPLE_OMP_RETURN
- && !gimple_omp_return_nowait_p (stmt))
+ gomp_return *omp_return_stmt = dyn_cast <gomp_return *> (stmt);
+ if (omp_return_stmt
+ && !gimple_omp_return_nowait_p (omp_return_stmt))
{
/* OpenMP 3.0 tasks unfortunately prevent this optimization
in many cases. If there could be tasks queued, the barrier
@@ -4784,7 +4785,7 @@ remove_exit_barrier (struct omp_region *region)
}
}
if (!any_addressable_vars)
- gimple_omp_return_set_nowait (stmt);
+ gimple_omp_return_set_nowait (omp_return_stmt);
}
}
}
@@ -5929,15 +5930,16 @@ expand_omp_for_generic (struct omp_region *region,
/* Add the loop cleanup function. */
gsi = gsi_last_bb (exit_bb);
- if (gimple_omp_return_nowait_p (gsi_stmt (gsi)))
+ gomp_return *omp_return_stmt = as_a <gomp_return *> (gsi_stmt (gsi));
+ if (gimple_omp_return_nowait_p (omp_return_stmt))
t = builtin_decl_explicit (BUILT_IN_GOMP_LOOP_END_NOWAIT);
- else if (gimple_omp_return_lhs (gsi_stmt (gsi)))
+ else if (gimple_omp_return_lhs (omp_return_stmt))
t = builtin_decl_explicit (BUILT_IN_GOMP_LOOP_END_CANCEL);
else
t = builtin_decl_explicit (BUILT_IN_GOMP_LOOP_END);
gcall *call_stmt = gimple_build_call (t, 0);
- if (gimple_omp_return_lhs (gsi_stmt (gsi)))
- gimple_call_set_lhs (call_stmt, gimple_omp_return_lhs (gsi_stmt (gsi)));
+ if (gimple_omp_return_lhs (omp_return_stmt))
+ gimple_call_set_lhs (call_stmt, gimple_omp_return_lhs (omp_return_stmt));
gsi_insert_after (&gsi, call_stmt, GSI_SAME_STMT);
gsi_remove (&gsi, true);
@@ -6336,9 +6338,10 @@ expand_omp_for_static_nochunk (struct omp_region *region,
/* Replace the GIMPLE_OMP_RETURN with a barrier, or nothing. */
gsi = gsi_last_bb (exit_bb);
- if (!gimple_omp_return_nowait_p (gsi_stmt (gsi)))
+ gomp_return *omp_return_stmt = as_a <gomp_return *> (gsi_stmt (gsi));
+ if (!gimple_omp_return_nowait_p (omp_return_stmt))
{
- t = gimple_omp_return_lhs (gsi_stmt (gsi));
+ t = gimple_omp_return_lhs (omp_return_stmt);
gsi_insert_after (&gsi, build_omp_barrier (t), GSI_SAME_STMT);
}
gsi_remove (&gsi, true);
@@ -6734,9 +6737,10 @@ expand_omp_for_static_chunk (struct omp_region *region,
/* Replace the GIMPLE_OMP_RETURN with a barrier, or nothing. */
gsi = gsi_last_bb (exit_bb);
- if (!gimple_omp_return_nowait_p (gsi_stmt (gsi)))
+ gomp_return *omp_return_stmt = as_a <gomp_return *> (gsi_stmt (gsi));
+ if (!gimple_omp_return_nowait_p (omp_return_stmt))
{
- t = gimple_omp_return_lhs (gsi_stmt (gsi));
+ t = gimple_omp_return_lhs (omp_return_stmt);
gsi_insert_after (&gsi, build_omp_barrier (t), GSI_SAME_STMT);
}
gsi_remove (&gsi, true);
@@ -7630,15 +7634,16 @@ expand_omp_sections (struct omp_region *region)
/* Cleanup function replaces GIMPLE_OMP_RETURN in EXIT_BB. */
si = gsi_last_bb (l2_bb);
- if (gimple_omp_return_nowait_p (gsi_stmt (si)))
+ gomp_return *omp_return_stmt = as_a <gomp_return *> (gsi_stmt (si));
+ if (gimple_omp_return_nowait_p (omp_return_stmt))
t = builtin_decl_explicit (BUILT_IN_GOMP_SECTIONS_END_NOWAIT);
- else if (gimple_omp_return_lhs (gsi_stmt (si)))
+ else if (gimple_omp_return_lhs (omp_return_stmt))
t = builtin_decl_explicit (BUILT_IN_GOMP_SECTIONS_END_CANCEL);
else
t = builtin_decl_explicit (BUILT_IN_GOMP_SECTIONS_END);
stmt = gimple_build_call (t, 0);
- if (gimple_omp_return_lhs (gsi_stmt (si)))
- gimple_call_set_lhs (stmt, gimple_omp_return_lhs (gsi_stmt (si)));
+ if (gimple_omp_return_lhs (omp_return_stmt))
+ gimple_call_set_lhs (stmt, gimple_omp_return_lhs (omp_return_stmt));
gsi_insert_after (&si, stmt, GSI_SAME_STMT);
gsi_remove (&si, true);
@@ -7664,9 +7669,10 @@ expand_omp_single (struct omp_region *region)
single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU;
si = gsi_last_bb (exit_bb);
- if (!gimple_omp_return_nowait_p (gsi_stmt (si)))
+ gomp_return *omp_return_stmt = as_a <gomp_return *> (gsi_stmt (si));
+ if (!gimple_omp_return_nowait_p (omp_return_stmt))
{
- tree t = gimple_omp_return_lhs (gsi_stmt (si));
+ tree t = gimple_omp_return_lhs (omp_return_stmt);
gsi_insert_after (&si, build_omp_barrier (t), GSI_SAME_STMT);
}
gsi_remove (&si, true);
@@ -8885,8 +8891,8 @@ make_pass_expand_omp (gcc::context *ctxt)
static void
maybe_add_implicit_barrier_cancel (omp_context *ctx, gimple_seq *body)
{
- gimple omp_return = gimple_seq_last_stmt (*body);
- gcc_assert (gimple_code (omp_return) == GIMPLE_OMP_RETURN);
+ gomp_return *omp_return =
+ as_a <gomp_return *> (gimple_seq_last_stmt (*body));
if (gimple_omp_return_nowait_p (omp_return))
return;
if (ctx->outer