Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> writes: > Jakub Jelinek via Gcc-patches <gcc-patches@gcc.gnu.org> writes: >> Hi! >> >> 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. > > Sorry if this is reopening an old discussion, but could we instead > canonicalise these MEMs to BLKmode when expanding the inline asm? > I think quite a lot of RTL code assumes that MEMs can be VOIDmode,
...I meant “can't” of course > so I'd be surprised if these two patches are enough. > > Thanks, > Richard > >> >> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? >> >> 2021-04-10 Jakub Jelinek <ja...@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. >> >> --- gcc/rtlanal.c.jj 2021-03-05 21:51:48.689185518 +0100 >> +++ gcc/rtlanal.c 2021-04-09 11:15:20.341906331 +0200 >> @@ -464,12 +464,17 @@ rtx_addr_can_trap_p_1 (const_rtx x, poly >> 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; >> >> --- gcc/testsuite/gcc.dg/torture/pr98601.c.jj 2021-04-09 >> 11:18:26.964817854 +0200 >> +++ gcc/testsuite/gcc.dg/torture/pr98601.c 2021-04-09 11:18:16.758932053 >> +0200 >> @@ -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" } */ >> +} >> >> Jakub