Hi! The following testcase ICEs, because update-address-taken subpass of fre5 rewrites _BitInt(128) b; vector(16) unsigned char _3;
<bb 2> [local count: 1073741824]: _3 = MEM <vector(16) unsigned char> [(char * {ref-all})p_2(D)]; MEM <vector(16) unsigned char> [(char * {ref-all})&b] = _3; b ={v} {CLOBBER(eos)}; to _BitInt(128) b; vector(16) unsigned char _3; <bb 2> [local count: 1073741824]: _3 = MEM <vector(16) unsigned char> [(char * {ref-all})p_2(D)]; b_5 = VIEW_CONVERT_EXPR<_BitInt(128)>(_3); but we can't have large/huge _BitInt vars in SSA form after the bitint lowering except for function arguments loaded from memory, as expansion isn't able to deal with those, it relies on bitint lowering to lower those operations. The following patch fixes that by not clearing TREE_ADDRESSABLE for large/huge _BitInt vars after bitint lowering, such that we don't rewrite them into SSA form. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-03-09 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/114278 * tree-ssa.cc (maybe_optimize_var): Punt on large/huge _BitInt vars after bitint lowering. * gcc.dg/bitint-99.c: New test. --- gcc/tree-ssa.cc.jj 2024-01-03 11:51:39.902615009 +0100 +++ gcc/tree-ssa.cc 2024-03-08 14:24:11.844821915 +0100 @@ -1753,7 +1753,11 @@ maybe_optimize_var (tree var, bitmap add /* Global Variables, result decls cannot be changed. */ if (is_global_var (var) || TREE_CODE (var) == RESULT_DECL - || bitmap_bit_p (addresses_taken, DECL_UID (var))) + || bitmap_bit_p (addresses_taken, DECL_UID (var)) + || (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE + /* Don't change large/huge _BitInt vars after _BitInt lowering. */ + && (cfun->curr_properties & PROP_gimple_lbitint) != 0 + && TYPE_PRECISION (TREE_TYPE (var)) > MAX_FIXED_MODE_SIZE)) return; bool maybe_reg = false; --- gcc/testsuite/gcc.dg/bitint-99.c.jj 2024-03-08 14:26:17.658069942 +0100 +++ gcc/testsuite/gcc.dg/bitint-99.c 2024-03-08 14:25:36.292645965 +0100 @@ -0,0 +1,26 @@ +/* PR tree-optimization/114278 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-O2 -fno-tree-dce -fno-tree-dse -fno-tree-ccp" } */ +/* { dg-additional-options "-mavx2" { target i?86-*-* x86_64-*-* } } */ + +void +foo (void *p) +{ + _BitInt(64) b = *(_BitInt(64) *) __builtin_memmove (&b, p, sizeof (_BitInt(64))); +} + +#if __BITINT_MAXWIDTH__ >= 128 +void +bar (void *p) +{ + _BitInt(128) b = *(_BitInt(128) *) __builtin_memmove (&b, p, sizeof (_BitInt(128))); +} +#endif + +#if __BITINT_MAXWIDTH__ >= 256 +void +baz (void *p) +{ + _BitInt(256) b = *(_BitInt(256) *) __builtin_memmove (&b, p, sizeof (_BitInt(256))); +} +#endif Jakub