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, 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