]> git.ipfire.org Git - thirdparty/gcc.git/commit
expand: Fix up expansion of VIEW_CONVERT_EXPR to BITINT_TYPE [PR117354]
authorJakub Jelinek <jakub@redhat.com>
Thu, 31 Oct 2024 09:52:56 +0000 (10:52 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 31 Oct 2024 09:52:56 +0000 (10:52 +0100)
commitb39f62ff739e9ffea0e6485667f15b985f8cd63d
tree2aefabea5d3adce9b481e8a08abe61d96f2068b2
parent1f7b1c555c66cf55f9032ea14135f29d27d34811
expand: Fix up expansion of VIEW_CONVERT_EXPR to BITINT_TYPE [PR117354]

The following testcase ICEs, because when trying to expand the
VIEW_CONVERT_EXPR operand which is SSA_NAME defined to
V32QI or V4DI MEM_REF which is aligned just to 8 bytes we force
it as unaligned into a register, but then try to call extract_bit_field
from the V32QI or V4DI register to BLKmode.  extract_bit_field doesn't
obviously support BLKmode extraction and so ICEs.

The second hunk fixes the ICE by not calling extract_bit_field when
it can't handle it, the last if will handle it properly by storing
it to memory and using BLKmode access to the copy.

The first hunk is an optimization, if mode is BLKmode, by setting
inner_reference_p argument to expand_expr_real we avoid the
expand_misaligned_mem_ref calls which load it from memory into a register.

2024-10-31  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/117354
* expr.cc (expand_expr_real_1) <case VIEW_CONVERT_EXPR>: Pass
true as inner_reference_p argument to expand_expr_real if
mode is BLKmode.  Don't call extract_bit_field if mode is BLKmode.

* gcc.dg/bitint-113.c: New test.
gcc/expr.cc
gcc/testsuite/gcc.dg/bitint-113.c [new file with mode: 0644]