diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-ssa-warn-access.cc | 3 | ||||
-rw-r--r-- | gcc/gimple.h | 9 | ||||
-rw-r--r-- | gcc/gimplify.cc | 4 | ||||
-rw-r--r-- | gcc/lto/lto-common.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr87052.c | 2 | ||||
-rw-r--r-- | gcc/tree-core.h | 12 | ||||
-rw-r--r-- | gcc/tree-inline.cc | 4 | ||||
-rw-r--r-- | gcc/tree-pretty-print.cc | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-ccp.cc | 2 | ||||
-rw-r--r-- | gcc/tree-streamer-in.cc | 2 | ||||
-rw-r--r-- | gcc/tree-streamer-out.cc | 5 | ||||
-rw-r--r-- | gcc/tree.cc | 3 | ||||
-rw-r--r-- | gcc/tree.h | 6 |
13 files changed, 50 insertions, 13 deletions
diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc index 4b3d2c0..80d41ea 100644 --- a/gcc/gimple-ssa-warn-access.cc +++ b/gcc/gimple-ssa-warn-access.cc @@ -4328,7 +4328,8 @@ is_auto_decl (tree x) void pass_waccess::check_stmt (gimple *stmt) { - if (m_check_dangling_p && gimple_clobber_p (stmt)) + if (m_check_dangling_p + && gimple_clobber_p (stmt, CLOBBER_EOL)) { /* Ignore clobber statemts in blocks with exceptional edges. */ basic_block bb = gimple_bb (stmt); diff --git a/gcc/gimple.h b/gcc/gimple.h index 441d29a..77a5a07 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -2939,6 +2939,15 @@ gimple_clobber_p (const gimple *s) && TREE_CLOBBER_P (gimple_assign_rhs1 (s)); } +/* Return true if S is a clobber statement. */ + +static inline bool +gimple_clobber_p (const gimple *s, enum clobber_kind kind) +{ + return gimple_clobber_p (s) + && CLOBBER_KIND (gimple_assign_rhs1 (s)) == kind; +} + /* Return true if GS is a GIMPLE_CALL. */ static inline bool diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index cd4b613..875b115 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -1475,7 +1475,7 @@ gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p) && !is_gimple_reg (t) && flag_stack_reuse != SR_NONE) { - tree clobber = build_clobber (TREE_TYPE (t)); + tree clobber = build_clobber (TREE_TYPE (t), CLOBBER_EOL); gimple *clobber_stmt; clobber_stmt = gimple_build_assign (t, clobber); gimple_set_location (clobber_stmt, end_locus); @@ -6981,7 +6981,7 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) { if (flag_stack_reuse == SR_ALL) { - tree clobber = build_clobber (TREE_TYPE (temp)); + tree clobber = build_clobber (TREE_TYPE (temp), CLOBBER_EOL); clobber = build2 (MODIFY_EXPR, TREE_TYPE (temp), temp, clobber); gimple_push_cleanup (temp, clobber, false, pre_p, true); } diff --git a/gcc/lto/lto-common.cc b/gcc/lto/lto-common.cc index 11fde67..ca28586 100644 --- a/gcc/lto/lto-common.cc +++ b/gcc/lto/lto-common.cc @@ -1309,7 +1309,10 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map) return false; if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) - compare_values (CONSTRUCTOR_NELTS); + { + compare_values (CLOBBER_KIND); + compare_values (CONSTRUCTOR_NELTS); + } if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER)) if (IDENTIFIER_LENGTH (t1) != IDENTIFIER_LENGTH (t2) diff --git a/gcc/testsuite/gcc.dg/pr87052.c b/gcc/testsuite/gcc.dg/pr87052.c index 2affc48..18e092c 100644 --- a/gcc/testsuite/gcc.dg/pr87052.c +++ b/gcc/testsuite/gcc.dg/pr87052.c @@ -38,4 +38,4 @@ void test (void) { dg-final { scan-tree-dump-times "c = \"\";" 1 "gimple" } } { dg-final { scan-tree-dump-times "d = { *};" 1 "gimple" } } { dg-final { scan-tree-dump-times "e = " 1 "gimple" } } - { dg-final { scan-tree-dump-times "e = {CLOBBER}" 1 "gimple" } } */ + { dg-final { scan-tree-dump-times "e = {CLOBBER\\(eol\\)}" 1 "gimple" } } */ diff --git a/gcc/tree-core.h b/gcc/tree-core.h index e83669f..bf2efa6 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -963,6 +963,15 @@ enum annot_expr_kind { annot_expr_kind_last }; +/* The kind of a TREE_CLOBBER_P CONSTRUCTOR node. */ +enum clobber_kind { + /* Unspecified, this clobber acts as a store of an undefined value. */ + CLOBBER_UNDEF, + /* This clobber ends the lifetime of the storage. */ + CLOBBER_EOL, + CLOBBER_LAST +}; + /*--------------------------------------------------------------------------- Type definitions ---------------------------------------------------------------------------*/ @@ -1055,7 +1064,8 @@ struct GTY(()) tree_base { /* This field is only used with TREE_TYPE nodes; the only reason it is present in tree_base instead of tree_type is to save space. The size - of the field must be large enough to hold addr_space_t values. */ + of the field must be large enough to hold addr_space_t values. + For CONSTRUCTOR nodes this holds the clobber_kind enum. */ unsigned address_space : 8; } bits; diff --git a/gcc/tree-inline.cc b/gcc/tree-inline.cc index 497aa66..ca66a82 100644 --- a/gcc/tree-inline.cc +++ b/gcc/tree-inline.cc @@ -5138,7 +5138,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id, && !is_gimple_reg (*varp) && !(id->debug_map && id->debug_map->get (p))) { - tree clobber = build_clobber (TREE_TYPE (*varp)); + tree clobber = build_clobber (TREE_TYPE (*varp), CLOBBER_EOL); gimple *clobber_stmt; clobber_stmt = gimple_build_assign (*varp, clobber); gimple_set_location (clobber_stmt, gimple_location (stmt)); @@ -5207,7 +5207,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id, && !is_gimple_reg (id->retvar) && !stmt_ends_bb_p (stmt)) { - tree clobber = build_clobber (TREE_TYPE (id->retvar)); + tree clobber = build_clobber (TREE_TYPE (id->retvar), CLOBBER_EOL); gimple *clobber_stmt; clobber_stmt = gimple_build_assign (id->retvar, clobber); gimple_set_location (clobber_stmt, gimple_location (old_stmt)); diff --git a/gcc/tree-pretty-print.cc b/gcc/tree-pretty-print.cc index 6130c30..666b7a7 100644 --- a/gcc/tree-pretty-print.cc +++ b/gcc/tree-pretty-print.cc @@ -2500,7 +2500,11 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags, } pp_left_brace (pp); if (TREE_CLOBBER_P (node)) - pp_string (pp, "CLOBBER"); + { + pp_string (pp, "CLOBBER"); + if (CLOBBER_KIND (node) == CLOBBER_EOL) + pp_string (pp, "(eol)"); + } else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE) is_struct_init = true; diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc index 48683f04..9164efe 100644 --- a/gcc/tree-ssa-ccp.cc +++ b/gcc/tree-ssa-ccp.cc @@ -2505,7 +2505,7 @@ insert_clobber_before_stack_restore (tree saved_val, tree var, FOR_EACH_IMM_USE_STMT (stmt, iter, saved_val) if (gimple_call_builtin_p (stmt, BUILT_IN_STACK_RESTORE)) { - clobber = build_clobber (TREE_TYPE (var)); + clobber = build_clobber (TREE_TYPE (var), CLOBBER_EOL); clobber_stmt = gimple_build_assign (var, clobber); i = gsi_for_stmt (stmt); diff --git a/gcc/tree-streamer-in.cc b/gcc/tree-streamer-in.cc index 65cdf12..a35a810 100644 --- a/gcc/tree-streamer-in.cc +++ b/gcc/tree-streamer-in.cc @@ -559,6 +559,8 @@ streamer_read_tree_bitfields (class lto_input_block *ib, if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) { + CLOBBER_KIND (expr) + = bp_unpack_enum (&bp, clobber_kind, CLOBBER_LAST); unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp); if (length > 0) vec_safe_grow (CONSTRUCTOR_ELTS (expr), length, true); diff --git a/gcc/tree-streamer-out.cc b/gcc/tree-streamer-out.cc index 783b94d..d39dc15 100644 --- a/gcc/tree-streamer-out.cc +++ b/gcc/tree-streamer-out.cc @@ -504,7 +504,10 @@ streamer_write_tree_bitfields (struct output_block *ob, tree expr) cl_optimization_stream_out (ob, &bp, TREE_OPTIMIZATION (expr)); if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) - bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr)); + { + bp_pack_enum (&bp, clobber_kind, CLOBBER_LAST, CLOBBER_KIND (expr)); + bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr)); + } if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION) /* Don't stream these when passing things to a different target. */ diff --git a/gcc/tree.cc b/gcc/tree.cc index 7ce4f24..dfcdf68 100644 --- a/gcc/tree.cc +++ b/gcc/tree.cc @@ -2311,10 +2311,11 @@ build_constructor_va (tree type, int nelts, ...) /* Return a node of type TYPE for which TREE_CLOBBER_P is true. */ tree -build_clobber (tree type) +build_clobber (tree type, enum clobber_kind kind) { tree clobber = build_constructor (type, NULL); TREE_THIS_VOLATILE (clobber) = true; + CLOBBER_KIND (clobber) = kind; return clobber; } @@ -1155,6 +1155,10 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, #define TREE_CLOBBER_P(NODE) \ (TREE_CODE (NODE) == CONSTRUCTOR && TREE_THIS_VOLATILE (NODE)) +/* Return the clobber_kind of a CLOBBER CONSTRUCTOR. */ +#define CLOBBER_KIND(NODE) \ + (CONSTRUCTOR_CHECK (NODE)->base.u.bits.address_space) + /* Define fields and accessors for some nodes that represent expressions. */ /* Nonzero if NODE is an empty statement (NOP_EXPR <0>). */ @@ -4559,7 +4563,7 @@ extern tree build_constructor_single (tree, tree, tree); extern tree build_constructor_from_list (tree, tree); extern tree build_constructor_from_vec (tree, const vec<tree, va_gc> *); extern tree build_constructor_va (tree, int, ...); -extern tree build_clobber (tree); +extern tree build_clobber (tree, enum clobber_kind = CLOBBER_UNDEF); extern tree build_real_from_int_cst (tree, const_tree); extern tree build_real_from_wide (tree, const wide_int_ref &, signop); extern tree build_complex (tree, tree, tree); |