diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-01-12 11:19:08 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2024-01-12 11:19:08 +0100 |
commit | c1680bd2df187e06089b06ffe211c4abe4c440b0 (patch) | |
tree | 3d2f9270d3813616e0636856044704cced0cd205 /gcc | |
parent | 4ff5e7cec91013f2b2e5c680d13bfd20e2a19763 (diff) | |
download | gcc-c1680bd2df187e06089b06ffe211c4abe4c440b0.zip gcc-c1680bd2df187e06089b06ffe211c4abe4c440b0.tar.gz gcc-c1680bd2df187e06089b06ffe211c4abe4c440b0.tar.bz2 |
lower-bitint: Fix up handling of uninitialized large/huge _BitInt call arguments [PR113316]
The code to assign large/huge _BitInt SSA_NAMEs to partitions intentionally
ignores uninitialized SSA_NAMEs:
/* Also ignore uninitialized uses. */
if (SSA_NAME_IS_DEFAULT_DEF (s)
&& (!SSA_NAME_VAR (s) || VAR_P (SSA_NAME_VAR (s))))
continue;
because there is no need to store them into memory, all we need is when
trying to extract some limb from them use uninitialized SSA_NAME for the
limb.
The following testcase shows this is a problem for call arguments though,
for those we need to create replacement SSA_NAMEs which are loaded from
the underlying variable. For uninitialized SSA_NAMEs because we didn't
create underlying variable for them var_to_partition doesn't work, the
following patch handles it by just creating an uninitialized replacement
SSA_NAME.
2024-01-12 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/113316
* gimple-lower-bitint.cc (bitint_large_huge::lower_call): Handle
uninitialized large/huge _BitInt arguments to calls.
* gcc.dg/bitint-67.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-lower-bitint.cc | 25 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/bitint-67.c | 12 |
2 files changed, 29 insertions, 8 deletions
diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc index 68e0189..ea616ea 100644 --- a/gcc/gimple-lower-bitint.cc +++ b/gcc/gimple-lower-bitint.cc @@ -5118,14 +5118,23 @@ bitint_large_huge::lower_call (tree obj, gimple *stmt) || TREE_CODE (TREE_TYPE (arg)) != BITINT_TYPE || bitint_precision_kind (TREE_TYPE (arg)) <= bitint_prec_middle) continue; - int p = var_to_partition (m_map, arg); - tree v = m_vars[p]; - gcc_assert (v != NULL_TREE); - if (!types_compatible_p (TREE_TYPE (arg), TREE_TYPE (v))) - v = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (arg), v); - arg = make_ssa_name (TREE_TYPE (arg)); - gimple *g = gimple_build_assign (arg, v); - gsi_insert_before (&gsi, g, GSI_SAME_STMT); + if (SSA_NAME_IS_DEFAULT_DEF (arg) + && (!SSA_NAME_VAR (arg) || VAR_P (SSA_NAME_VAR (arg)))) + { + tree var = create_tmp_reg (TREE_TYPE (arg)); + arg = get_or_create_ssa_default_def (cfun, var); + } + else + { + int p = var_to_partition (m_map, arg); + tree v = m_vars[p]; + gcc_assert (v != NULL_TREE); + if (!types_compatible_p (TREE_TYPE (arg), TREE_TYPE (v))) + v = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (arg), v); + arg = make_ssa_name (TREE_TYPE (arg)); + gimple *g = gimple_build_assign (arg, v); + gsi_insert_before (&gsi, g, GSI_SAME_STMT); + } gimple_call_set_arg (stmt, i, arg); if (m_preserved == NULL) m_preserved = BITMAP_ALLOC (NULL); diff --git a/gcc/testsuite/gcc.dg/bitint-67.c b/gcc/testsuite/gcc.dg/bitint-67.c new file mode 100644 index 0000000..fefa33a --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-67.c @@ -0,0 +1,12 @@ +/* PR tree-optimization/113316 */ +/* { dg-do compile { target bitint575 } } */ +/* { dg-options "-std=c23 -O2 -w" } */ + +void bar (_BitInt(535) y); + +void +foo (void) +{ + _BitInt(535) y; + bar (y); +} |