middle-end: Small __builtin_clear_padding improvements

When looking at __builtin_clear_padding today, I've noticed that
it is quite wasteful to extend the original user one argument to 3,
2 is enough.  We need to encode the original type of the first argument
because pointer conversions are useless in GIMPLE, and we need to record
a boolean whether it is for -ftrivial-auto-var-init=* or not.
But for recording the type we don't need the value (we've always used
zero) and for recording the boolean we don't need the type (we've always
used integer_type_node).
So, this patch merges the two into one.

2022-02-11  Jakub Jelinek  <jakub@redhat.com>

	* tree.cc (build_common_builtin_nodes): Fix up formatting in
	__builtin_clear_padding decl creation.
	* gimplify.cc (gimple_add_padding_init_for_auto_var): Encode
	for_auto_init in the value of 2nd BUILT_IN_CLEAR_PADDING
	argument rather than in 3rd argument.
	(gimplify_call_expr): Likewise.  Fix up comment formatting.
	* gimple-fold.cc (gimple_fold_builtin_clear_padding): Expect
	2 arguments instead of 3, take for_auto_init from the value
	of 2nd argument.
This commit is contained in:
Jakub Jelinek 2022-02-11 19:47:14 +01:00
parent 274a4d2942
commit b56ad95854
3 changed files with 12 additions and 19 deletions

View File

@ -4876,13 +4876,13 @@ static bool
gimple_fold_builtin_clear_padding (gimple_stmt_iterator *gsi)
{
gimple *stmt = gsi_stmt (*gsi);
gcc_assert (gimple_call_num_args (stmt) == 3);
gcc_assert (gimple_call_num_args (stmt) == 2);
tree ptr = gimple_call_arg (stmt, 0);
tree typearg = gimple_call_arg (stmt, 1);
/* the 3rd argument of __builtin_clear_padding is to distinguish whether
this call is made by the user or by the compiler for automatic variable
initialization. */
bool for_auto_init = (bool) TREE_INT_CST_LOW (gimple_call_arg (stmt, 2));
/* The 2nd argument of __builtin_clear_padding's value is used to
distinguish whether this call is made by the user or by the compiler
for automatic variable initialization. */
bool for_auto_init = (bool) TREE_INT_CST_LOW (typearg);
tree type = TREE_TYPE (TREE_TYPE (typearg));
location_t loc = gimple_location (stmt);
clear_padding_struct buf;

View File

@ -1804,7 +1804,6 @@ gimple_add_padding_init_for_auto_var (tree decl, bool is_vla,
gimple_seq *seq_p)
{
tree addr_of_decl = NULL_TREE;
bool for_auto_init = true;
tree fn = builtin_decl_explicit (BUILT_IN_CLEAR_PADDING);
if (is_vla)
@ -1821,11 +1820,8 @@ gimple_add_padding_init_for_auto_var (tree decl, bool is_vla,
addr_of_decl = build_fold_addr_expr (decl);
}
gimple *call = gimple_build_call (fn,
3, addr_of_decl,
build_zero_cst (TREE_TYPE (addr_of_decl)),
build_int_cst (integer_type_node,
(int) for_auto_init));
gimple *call = gimple_build_call (fn, 2, addr_of_decl,
build_one_cst (TREE_TYPE (addr_of_decl)));
gimplify_seq_add_stmt (seq_p, call);
}
@ -3536,15 +3532,12 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
{
/* Remember the original type of the argument in an internal
dummy second argument, as in GIMPLE pointer conversions are
useless. also mark this call as not for automatic initialization
in the internal dummy third argument. */
useless. Also mark this call as not for automatic
initialization in the internal dummy third argument. */
p = CALL_EXPR_ARG (*expr_p, 0);
bool for_auto_init = false;
*expr_p
= build_call_expr_loc (EXPR_LOCATION (*expr_p), fndecl, 3, p,
build_zero_cst (TREE_TYPE (p)),
build_int_cst (integer_type_node,
(int) for_auto_init));
= build_call_expr_loc (EXPR_LOCATION (*expr_p), fndecl, 2, p,
build_zero_cst (TREE_TYPE (p)));
return GS_OK;
}
break;

View File

@ -9520,7 +9520,7 @@ build_common_builtin_nodes (void)
local_define_builtin ("__builtin_clear_padding", ftype,
BUILT_IN_CLEAR_PADDING,
"__builtin_clear_padding",
ECF_LEAF | ECF_NOTHROW);
ECF_LEAF | ECF_NOTHROW);
}
if (!builtin_decl_explicit_p (BUILT_IN_UNREACHABLE)