On Wed, Apr 12, 2023 at 4:28 PM Jakub Jelinek <ja...@redhat.com> wrote: > > Hi! > > On the following testcase, we emit weird diagnostics. > User used the z modifier, but diagnostics talks about Z instead. > This is because z is implemented by doing some stuff and then falling > through into the Z case. > > The following patch adjusts the Z diagnostics, such that it prints whatever > modifier user actually uses in places which could happen with either > modifier. > > Furthermore, in case of the non-integer operand used with operand code %<z%> > warning the warning location was incorrect (and of function), so I've used > warning_for_asm to get it a proper location in case it is a user inline-asm. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2023-04-12 Jakub Jelinek <ja...@redhat.com> > > PR target/109458 > * config/i386/i386.cc: Include rtl-error.h. > (ix86_print_operand): For z modifier warning, use warning_for_asm > if this_is_asm_operands. For Z modifier errors, use %c and code > instead of hardcoded Z. > > * gcc.target/i386/pr109458.c: New test.
OK. Thanks, Uros. > > --- gcc/config/i386/i386.cc.jj 2023-03-31 09:26:47.970219929 +0200 > +++ gcc/config/i386/i386.cc 2023-04-10 10:21:39.506793959 +0200 > @@ -96,6 +96,7 @@ along with GCC; see the file COPYING3. > #include "i386-expand.h" > #include "i386-features.h" > #include "function-abi.h" > +#include "rtl-error.h" > > /* This file should be included last. */ > #include "target-def.h" > @@ -13218,7 +13219,13 @@ ix86_print_operand (FILE *file, rtx x, i > } > > if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) > - warning (0, "non-integer operand used with operand code %<z%>"); > + { > + if (this_is_asm_operands) > + warning_for_asm (this_is_asm_operands, > + "non-integer operand used with operand code > %<z%>"); > + else > + warning (0, "non-integer operand used with operand code > %<z%>"); > + } > /* FALLTHRU */ > > case 'Z': > @@ -13281,11 +13288,12 @@ ix86_print_operand (FILE *file, rtx x, i > else > { > output_operand_lossage ("invalid operand type used with " > - "operand code 'Z'"); > + "operand code '%c'", code); > return; > } > > - output_operand_lossage ("invalid operand size for operand code > 'Z'"); > + output_operand_lossage ("invalid operand size for operand code > '%c'", > + code); > return; > > case 'd': > --- gcc/testsuite/gcc.target/i386/pr109458.c.jj 2023-04-10 10:30:44.950822263 > +0200 > +++ gcc/testsuite/gcc.target/i386/pr109458.c 2023-04-10 10:30:22.257153906 > +0200 > @@ -0,0 +1,13 @@ > +/* PR target/109458 */ > +/* { dg-do compile } */ > +/* { dg-options "-msse2" } */ > + > +void > +foo (_Float16 x) > +{ > + asm volatile ("# %z0" : : "i" (42)); /* { dg-error "invalid 'asm': invalid > operand type used with operand code 'z'" } */ > + asm volatile ("# %Z0" : : "i" (42)); /* { dg-error "invalid 'asm': invalid > operand type used with operand code 'Z'" } */ > + asm volatile ("# %z0" : : "x" (x)); /* { dg-error "invalid 'asm': invalid > operand size for operand code 'z'" } */ > + /* { dg-warning "non-integer operand > used with operand code 'z'" "" { target *-*-* } .-1 } */ > + asm volatile ("# %Z0" : : "x" (x)); /* { dg-error "invalid 'asm': invalid > operand size for operand code 'Z'" } */ > +} > > Jakub >