rtlanal: Another fix for VOIDmode MEMs [PR98601]
This is a sequel to the PR85022 changes, inline-asm can (unfortunately) introduce VOIDmode MEMs and in PR85022 they have been changed so that we don't pretend we know their size (as opposed to assuming they have zero size). This time we ICE in rtx_addr_can_trap_p_1 because it assumes that all memory but BLKmode has known size. The patch just treats VOIDmode MEMs like BLKmode in that regard. And, the STRICT_ALIGNMENT change is needed because VOIDmode has GET_MODE_SIZE of 0 and we don't want to check if something is a multiple of 0. 2021-04-10 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/98601 * rtlanal.c (rtx_addr_can_trap_p_1): Allow in assert unknown size not just for BLKmode, but also for VOIDmode. For STRICT_ALIGNMENT unaligned_mems handle VOIDmode like BLKmode. * gcc.dg/torture/pr98601.c: New test.
This commit is contained in:
parent
1c9744fb3b
commit
7a493fcd27
2 changed files with 21 additions and 2 deletions
|
@ -464,12 +464,17 @@ rtx_addr_can_trap_p_1 (const_rtx x, poly_int64 offset, poly_int64 size,
|
|||
machine_mode mode, bool unaligned_mems)
|
||||
{
|
||||
enum rtx_code code = GET_CODE (x);
|
||||
gcc_checking_assert (mode == BLKmode || known_size_p (size));
|
||||
gcc_checking_assert (mode == BLKmode
|
||||
|| mode == VOIDmode
|
||||
|| known_size_p (size));
|
||||
poly_int64 const_x1;
|
||||
|
||||
/* The offset must be a multiple of the mode size if we are considering
|
||||
unaligned memory references on strict alignment machines. */
|
||||
if (STRICT_ALIGNMENT && unaligned_mems && mode != BLKmode)
|
||||
if (STRICT_ALIGNMENT
|
||||
&& unaligned_mems
|
||||
&& mode != BLKmode
|
||||
&& mode != VOIDmode)
|
||||
{
|
||||
poly_int64 actual_offset = offset;
|
||||
|
||||
|
|
14
gcc/testsuite/gcc.dg/torture/pr98601.c
Normal file
14
gcc/testsuite/gcc.dg/torture/pr98601.c
Normal file
|
@ -0,0 +1,14 @@
|
|||
/* PR rtl-optimization/98601 */
|
||||
/* { dg-do compile } */
|
||||
|
||||
void
|
||||
foo (void *p)
|
||||
{
|
||||
asm ("" : "=m" (*p)); /* { dg-warning "dereferencing 'void \\*' pointer" } */
|
||||
}
|
||||
|
||||
void
|
||||
bar (void *p)
|
||||
{
|
||||
asm volatile ("" : : "m" (*p)); /* { dg-warning "dereferencing 'void \\*' pointer" } */
|
||||
}
|
Loading…
Add table
Reference in a new issue