i386: Fix up z operand modifier diagnostics on inline-asm [PR109458]
authorJakub Jelinek <jakub@redhat.com>
Wed, 12 Apr 2023 14:53:23 +0000 (16:53 +0200)
committerJakub Jelinek <jakub@redhat.com>
Wed, 12 Apr 2023 14:53:23 +0000 (16:53 +0200)
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.

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.

gcc/config/i386/i386.cc
gcc/testsuite/gcc.target/i386/pr109458.c [new file with mode: 0644]

index 2581b80..fbd33a6 100644 (file)
@@ -96,6 +96,7 @@ along with GCC; see the file COPYING3.  If not see
 #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, int code)
            }
 
          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, int code)
          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':
diff --git a/gcc/testsuite/gcc.target/i386/pr109458.c b/gcc/testsuite/gcc.target/i386/pr109458.c
new file mode 100644 (file)
index 0000000..abd0ed2
--- /dev/null
@@ -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'" } */
+}