Mercurial > hg > CbC > CbC_gcc
diff gcc/gimple.c @ 132:d34655255c78
update gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 10:21:07 +0900 |
parents | f81c5aa9f14f 84e7813d76e9 |
children | 4e440907fcbf |
line wrap: on
line diff
--- a/gcc/gimple.c Thu Oct 25 08:08:40 2018 +0900 +++ b/gcc/gimple.c Thu Oct 25 10:21:07 2018 +0900 @@ -1,6 +1,6 @@ /* Gimple IR support functions. - Copyright (C) 2007-2017 Free Software Foundation, Inc. + Copyright (C) 2007-2018 Free Software Foundation, Inc. Contributed by Aldy Hernandez <aldyh@redhat.com> This file is part of GCC. @@ -79,8 +79,8 @@ /* Gimple stats. */ -int gimple_alloc_counts[(int) gimple_alloc_kind_all]; -int gimple_alloc_sizes[(int) gimple_alloc_kind_all]; +uint64_t gimple_alloc_counts[(int) gimple_alloc_kind_all]; +uint64_t gimple_alloc_sizes[(int) gimple_alloc_kind_all]; /* Keep in sync with gimple.h:enum gimple_alloc_kind. */ static const char * const gimple_alloc_kind_names[] = { @@ -352,17 +352,25 @@ { unsigned i, nargs; gcall *call; - tree fndecl = get_callee_fndecl (t); gcc_assert (TREE_CODE (t) == CALL_EXPR); nargs = call_expr_nargs (t); - call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs); + + tree fndecl = NULL_TREE; + if (CALL_EXPR_FN (t) == NULL_TREE) + call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs); + else + { + fndecl = get_callee_fndecl (t); + call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs); + } for (i = 0; i < nargs; i++) gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i)); gimple_set_block (call, TREE_BLOCK (t)); + gimple_set_location (call, EXPR_LOCATION (t)); /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL. */ gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t)); @@ -370,7 +378,7 @@ gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t)); gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t)); if (fndecl - && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL + && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL) && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl))) gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t)); else @@ -382,7 +390,6 @@ gimple_call_set_cbc_goto (call, CALL_EXPR_CbC_GOTO (t)); #endif gimple_set_no_warning (call, TREE_NO_WARNING (t)); - gimple_call_set_with_bounds (call, CALL_WITH_BOUNDS_P (t)); if (fnptrtype) { @@ -857,6 +864,48 @@ } +/* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at + LOCATION. */ + +gdebug * +gimple_build_debug_begin_stmt (tree block, location_t location + MEM_STAT_DECL) +{ + gdebug *p + = as_a <gdebug *> ( + gimple_build_with_ops_stat (GIMPLE_DEBUG, + (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0 + PASS_MEM_STAT)); + + gimple_set_location (p, location); + gimple_set_block (p, block); + cfun->debug_marker_count++; + + return p; +} + + +/* Build a new GIMPLE_DEBUG_INLINE_ENTRY statement in BLOCK at + LOCATION. The BLOCK links to the inlined function. */ + +gdebug * +gimple_build_debug_inline_entry (tree block, location_t location + MEM_STAT_DECL) +{ + gdebug *p + = as_a <gdebug *> ( + gimple_build_with_ops_stat (GIMPLE_DEBUG, + (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0 + PASS_MEM_STAT)); + + gimple_set_location (p, location); + gimple_set_block (p, block); + cfun->debug_marker_count++; + + return p; +} + + /* Build a GIMPLE_OMP_CRITICAL statement. BODY is the sequence of statements for which only one thread can execute. @@ -1504,6 +1553,57 @@ } +/* Return true if call STMT is known to return a non-zero result. */ + +bool +gimple_call_nonnull_result_p (gcall *call) +{ + tree fndecl = gimple_call_fndecl (call); + if (!fndecl) + return false; + if (flag_delete_null_pointer_checks && !flag_check_new + && DECL_IS_OPERATOR_NEW (fndecl) + && !TREE_NOTHROW (fndecl)) + return true; + + /* References are always non-NULL. */ + if (flag_delete_null_pointer_checks + && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE) + return true; + + if (flag_delete_null_pointer_checks + && lookup_attribute ("returns_nonnull", + TYPE_ATTRIBUTES (gimple_call_fntype (call)))) + return true; + return gimple_alloca_call_p (call); +} + + +/* If CALL returns a non-null result in an argument, return that arg. */ + +tree +gimple_call_nonnull_arg (gcall *call) +{ + tree fndecl = gimple_call_fndecl (call); + if (!fndecl) + return NULL_TREE; + + unsigned rf = gimple_call_return_flags (call); + if (rf & ERF_RETURNS_ARG) + { + unsigned argnum = rf & ERF_RETURN_ARG_MASK; + if (argnum < gimple_call_num_args (call)) + { + tree arg = gimple_call_arg (call, argnum); + if (SSA_VAR_P (arg) + && infer_nonnull_range_by_attribute (call, arg)) + return arg; + } + } + return NULL_TREE; +} + + /* Return true if GS is a copy assignment. */ bool @@ -1919,6 +2019,9 @@ gimple_set_modified (copy, true); } + if (gimple_debug_nonbind_marker_p (stmt)) + cfun->debug_marker_count++; + return copy; } @@ -2037,11 +2140,12 @@ void dump_gimple_statistics (void) { - int i, total_tuples = 0, total_bytes = 0; + int i; + uint64_t total_tuples = 0, total_bytes = 0; if (! GATHER_STATISTICS) { - fprintf (stderr, "No gimple statistics\n"); + fprintf (stderr, "No GIMPLE statistics\n"); return; } @@ -2050,13 +2154,15 @@ fprintf (stderr, "---------------------------------------\n"); for (i = 0; i < (int) gimple_alloc_kind_all; ++i) { - fprintf (stderr, "%-20s %7d %10d\n", gimple_alloc_kind_names[i], - gimple_alloc_counts[i], gimple_alloc_sizes[i]); + fprintf (stderr, "%-20s %7" PRIu64 " %10" PRIu64 "\n", + gimple_alloc_kind_names[i], gimple_alloc_counts[i], + gimple_alloc_sizes[i]); total_tuples += gimple_alloc_counts[i]; total_bytes += gimple_alloc_sizes[i]; } fprintf (stderr, "---------------------------------------\n"); - fprintf (stderr, "%-20s %7d %10d\n", "Total", total_tuples, total_bytes); + fprintf (stderr, "%-20s %7" PRIu64 " %10" PRIu64 "\n", "Total", + total_tuples, total_bytes); fprintf (stderr, "---------------------------------------\n"); } @@ -2099,8 +2205,7 @@ || (SYM) == REALIGN_LOAD_EXPR \ || (SYM) == VEC_COND_EXPR \ || (SYM) == VEC_PERM_EXPR \ - || (SYM) == BIT_INSERT_EXPR \ - || (SYM) == FMA_EXPR) ? GIMPLE_TERNARY_RHS \ + || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS \ : ((SYM) == CONSTRUCTOR \ || (SYM) == OBJ_TYPE_REF \ || (SYM) == ASSERT_EXPR \ @@ -2585,8 +2690,7 @@ tree fndecl; if (is_gimple_call (stmt) && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE - && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL - && DECL_FUNCTION_CODE (fndecl) == code) + && fndecl_built_in_p (fndecl, code)) return gimple_builtin_call_types_compatible_p (stmt, fndecl); return false; } @@ -2605,7 +2709,7 @@ tree fndecl = gimple_call_fndecl (stmt); if (fndecl - && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL + && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL) && gimple_builtin_call_types_compatible_p (stmt, fndecl)) return as_combined_fn (DECL_FUNCTION_CODE (fndecl)); } @@ -3108,7 +3212,7 @@ verify_gimple_pp (const char *expected, gimple *stmt) { pretty_printer pp; - pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, 0 /* flags */); + pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */); ASSERT_STREQ (expected, pp_formatted_text (&pp)); }