On Mon, 4 Mar 2024, Jakub Jelinek wrote:
> Hi!
>
> 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.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
> 2024-03-04 Jakub Jelinek
>
> 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.
>
> --- gcc/gimple-lower-bitint.cc.jj 2024-03-01 11:04:44.623537149 +0100
> +++ gcc/gimple-lower-bitint.cc2024-03-03 19:18:30.017909558 +0100
> @@ -620,7 +620,7 @@ bitint_large_huge::limb_access (tree typ
>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 *s
> = 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
> --- gcc/testsuite/gcc.dg/bitint-97.c.jj 2024-03-03 18:59:31.084588944
> +0100
> +++ gcc/testsuite/gcc.dg/bitint-97.c 2024-03-03 19:16:50.114284071 +0100
> @@ -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;
> +}
>
> Jakub
>
>
--
Richard Biener
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)