aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorOracle Public Cloud User <opc@qinzhao-aarch64-ol8.allregionaliads.osdevelopmeniad.oraclevcn.com>2021-11-01 15:14:26 +0000
committerOracle Public Cloud User <opc@qinzhao-aarch64-ol8.allregionaliads.osdevelopmeniad.oraclevcn.com>2021-11-01 15:14:26 +0000
commit429e3b7d8bf6609ddf7c7b1e49244997e9ac76b8 (patch)
tree3e51e8dee4d86a39bc67e44cf6432541a2ff0cd9 /gcc/gimplify.c
parent1d5c43db79b7ea14f0dc071beb40cf80de90eb86 (diff)
downloadgcc-429e3b7d8bf6609ddf7c7b1e49244997e9ac76b8.zip
gcc-429e3b7d8bf6609ddf7c7b1e49244997e9ac76b8.tar.gz
gcc-429e3b7d8bf6609ddf7c7b1e49244997e9ac76b8.tar.bz2
PR 102281 (-ftrivial-auto-var-init=zero causes ice)
Do not add call to __builtin_clear_padding when a variable is a gimple register or it might not have padding. gcc/ChangeLog: 2021-11-01 qing zhao <qing.zhao@oracle.com> * gimplify.c (gimplify_decl_expr): Do not add call to __builtin_clear_padding when a variable is a gimple register or it might not have padding. (gimplify_init_constructor): Likewise. gcc/testsuite/ChangeLog: 2021-11-01 qing zhao <qing.zhao@oracle.com> * c-c++-common/pr102281.c: New test. * gcc.target/i386/auto-init-2.c: Adjust testing case. * gcc.target/i386/auto-init-4.c: Likewise. * gcc.target/i386/auto-init-6.c: Likewise. * gcc.target/aarch64/auto-init-6.c: Likewise.
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 8bb54fd..c2ab96e 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1784,8 +1784,8 @@ gimple_add_init_for_auto_var (tree decl,
that padding is initialized to zero. So, we always initialize paddings
to zeroes regardless INIT_TYPE.
To do the padding initialization, we insert a call to
- __BUILTIN_CLEAR_PADDING (&decl, 0, for_auto_init = true).
- Note, we add an additional dummy argument for __BUILTIN_CLEAR_PADDING,
+ __builtin_clear_padding (&decl, 0, for_auto_init = true).
+ Note, we add an additional dummy argument for __builtin_clear_padding,
'for_auto_init' to distinguish whether this call is for automatic
variable initialization or not.
*/
@@ -1954,8 +1954,14 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
pattern initialization.
In order to make the paddings as zeroes for pattern init, We
should add a call to __builtin_clear_padding to clear the
- paddings to zero in compatiple with CLANG. */
- if (flag_auto_var_init == AUTO_INIT_PATTERN)
+ paddings to zero in compatiple with CLANG.
+ We cannot insert this call if the variable is a gimple register
+ since __builtin_clear_padding will take the address of the
+ variable. As a result, if a long double/_Complex long double
+ variable will spilled into stack later, its padding is 0XFE. */
+ if (flag_auto_var_init == AUTO_INIT_PATTERN
+ && !is_gimple_reg (decl)
+ && clear_padding_type_may_have_padding_p (TREE_TYPE (decl)))
gimple_add_padding_init_for_auto_var (decl, is_vla, seq_p);
}
}
@@ -5384,12 +5390,19 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
/* If the user requests to initialize automatic variables, we
should initialize paddings inside the variable. Add a call to
- __BUILTIN_CLEAR_PADDING (&object, 0, for_auto_init = true) to
+ __builtin_clear_pading (&object, 0, for_auto_init = true) to
initialize paddings of object always to zero regardless of
INIT_TYPE. Note, we will not insert this call if the aggregate
variable has be completely cleared already or it's initialized
- with an empty constructor. */
+ with an empty constructor. We cannot insert this call if the
+ variable is a gimple register since __builtin_clear_padding will take
+ the address of the variable. As a result, if a long double/_Complex long
+ double variable will be spilled into stack later, its padding cannot
+ be cleared with __builtin_clear_padding. We should clear its padding
+ when it is spilled into memory. */
if (is_init_expr
+ && !is_gimple_reg (object)
+ && clear_padding_type_may_have_padding_p (type)
&& ((AGGREGATE_TYPE_P (type) && !cleared && !is_empty_ctor)
|| !AGGREGATE_TYPE_P (type))
&& is_var_need_auto_init (object))