i386: Fix up z operand modifier diagnostics on inline-asm [PR109458]

Message ID ZDa//e6L7ZDXn13x@tucnak
State New
Headers
Series i386: Fix up z operand modifier diagnostics on inline-asm [PR109458] |

Commit Message

Jakub Jelinek April 12, 2023, 2:28 p.m. UTC
  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  <jakub@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.


	Jakub
  

Comments

Uros Bizjak April 12, 2023, 2:35 p.m. UTC | #1
On Wed, Apr 12, 2023 at 4:28 PM Jakub Jelinek <jakub@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  <jakub@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
>
  

Patch

--- 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'" } */
+}