aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-01-12 11:19:08 +0100
committerJakub Jelinek <jakub@redhat.com>2024-01-12 11:19:08 +0100
commitc1680bd2df187e06089b06ffe211c4abe4c440b0 (patch)
tree3d2f9270d3813616e0636856044704cced0cd205 /gcc
parent4ff5e7cec91013f2b2e5c680d13bfd20e2a19763 (diff)
downloadgcc-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.cc25
-rw-r--r--gcc/testsuite/gcc.dg/bitint-67.c12
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);
+}