aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-03-04 11:15:07 +0100
committerJakub Jelinek <jakub@redhat.com>2024-03-04 11:15:07 +0100
commitc27148f2f40654a638bcf429633be1c0561529d5 (patch)
tree7980f931e1f5446a7e8fec8640aa87921e3e1aaa
parent889fbc9454e2d4e2b9a11a9e02b3b7e698edcd1c (diff)
downloadgcc-c27148f2f40654a638bcf429633be1c0561529d5.zip
gcc-c27148f2f40654a638bcf429633be1c0561529d5.tar.gz
gcc-c27148f2f40654a638bcf429633be1c0561529d5.tar.bz2
bitint: Fix tree node sharing bug [PR114209]
We ICE on the following testcase due to invalid tree sharing. The second hunk fixes that, the first one is from me looking around at other spots which might need end up with invalid tree sharing too. 2024-03-04 Jakub Jelinek <jakub@redhat.com> PR middle-end/114209 * gimple-lower-bitint.cc (bitint_large_huge::limb_access): Call unshare_expr when creating a MEM_REF from MEM_REF. (bitint_large_huge::lower_stmt): Call unshare_expr. * gcc.dg/bitint-97.c: New test.
-rw-r--r--gcc/gimple-lower-bitint.cc4
-rw-r--r--gcc/testsuite/gcc.dg/bitint-97.c18
2 files changed, 20 insertions, 2 deletions
diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc
index 15a2712..e3c8518 100644
--- a/gcc/gimple-lower-bitint.cc
+++ b/gcc/gimple-lower-bitint.cc
@@ -620,7 +620,7 @@ bitint_large_huge::limb_access (tree type, tree var, tree idx, bool write_p)
else if (TREE_CODE (var) == MEM_REF && tree_fits_uhwi_p (idx))
{
ret
- = build2 (MEM_REF, ltype, TREE_OPERAND (var, 0),
+ = build2 (MEM_REF, ltype, unshare_expr (TREE_OPERAND (var, 0)),
size_binop (PLUS_EXPR, TREE_OPERAND (var, 1),
build_int_cst (TREE_TYPE (TREE_OPERAND (var, 1)),
tree_to_uhwi (idx)
@@ -5342,7 +5342,7 @@ bitint_large_huge::lower_stmt (gimple *stmt)
= build_qualified_type (ltype,
TYPE_QUALS (ltype)
| ENCODE_QUAL_ADDR_SPACE (as));
- rhs1 = build1 (VIEW_CONVERT_EXPR, ltype, mem);
+ rhs1 = build1 (VIEW_CONVERT_EXPR, ltype, unshare_expr (mem));
gimple_assign_set_rhs1 (stmt, rhs1);
}
else
diff --git a/gcc/testsuite/gcc.dg/bitint-97.c b/gcc/testsuite/gcc.dg/bitint-97.c
new file mode 100644
index 0000000..a859978
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-97.c
@@ -0,0 +1,18 @@
+/* PR middle-end/114209 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-Og -std=c23 -fno-strict-aliasing" } */
+/* { dg-add-options float128 } */
+/* { dg-require-effective-target float128 } */
+
+typedef signed char V __attribute__((__vector_size__(16)));
+typedef _Float128 W __attribute__((__vector_size__(16)));
+
+_Float128
+foo (void *p)
+{
+ signed char c = *(_BitInt(128) *) p;
+ _Float128 f = *(_Float128 *) p;
+ W w = *(W *) p;
+ signed char r = ((union { W a; signed char b[16]; }) w).b[1];
+ return r + f;
+}