Hi.

I'm sending updated version of that patch. The patch rejects usage of AVX512 
ISAs (except AVX512F)
for target attribute for C++ multiversioning and for target_clone attribute.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin
>From 6a7119cbdb908a2a7bd8017c64e084b5f20b3052 Mon Sep 17 00:00:00 2001
From: marxin <mli...@suse.cz>
Date: Wed, 17 Apr 2019 14:01:21 +0200
Subject: [PATCH] Add error message for target_clones and AVX512 ISAs (PR
 target/89929).

gcc/ChangeLog:

2019-04-18  Martin Liska  <mli...@suse.cz>

	PR target/89929
	* config/i386/i386.c (get_builtin_code_for_version): Provide new
	error for AVX512 ISAs.

gcc/testsuite/ChangeLog:

2019-04-18  Martin Liska  <mli...@suse.cz>

	PR target/89929
	* g++.target/i386/mv28.C: New test.
	* gcc.target/i386/mvc14.c: New test.
---
 gcc/config/i386/i386.c                | 27 +++++++++++++++++++++++++++
 gcc/testsuite/g++.target/i386/mv28.C  | 26 ++++++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/mvc14.c | 16 ++++++++++++++++
 3 files changed, 69 insertions(+)
 create mode 100644 gcc/testsuite/g++.target/i386/mv28.C
 create mode 100644 gcc/testsuite/gcc.target/i386/mvc14.c

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 498a35d8aea..ed9a9c2e3f7 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -31920,6 +31920,24 @@ get_builtin_code_for_version (tree decl, tree *predicate_list)
       {"avx512f", P_AVX512F}
     };
 
+  static const char * avx512_warning_isas[] = {
+      "avx5124fmaps",
+      "avx5124vnniw",
+      "avx512vpopcntdq",
+      "avx512vbmi2",
+      "avx512vnni",
+      "avx512bitalg",
+      "avx512vbmi",
+      "avx512ifma",
+      "avx512vl",
+      "avx512bw",
+      "avx512dq",
+      "avx512er",
+      "avx512pf",
+      "avx512cd",
+      "gfni",
+      "vpclmulqdq",
+  };
 
   static unsigned int NUM_FEATURES
     = sizeof (feature_list) / sizeof (struct _feature_list);
@@ -32140,6 +32158,15 @@ get_builtin_code_for_version (tree decl, tree *predicate_list)
 	}
       if (predicate_list && i == NUM_FEATURES)
 	{
+	  for (unsigned i = 0; i < ARRAY_SIZE (avx512_warning_isas); i++)
+	    if (strcmp (token, avx512_warning_isas[i]) == 0)
+	      {
+		error_at (DECL_SOURCE_LOCATION (decl),
+			  "AVX512 ISA %qs is not supported in "
+			  "%<target%> attribute, use %<arch=%> syntax", token);
+		return 0;
+	      }
+
 	  error_at (DECL_SOURCE_LOCATION (decl),
 		    "no dispatcher found for %s", token);
 	  return 0;
diff --git a/gcc/testsuite/g++.target/i386/mv28.C b/gcc/testsuite/g++.target/i386/mv28.C
new file mode 100644
index 00000000000..a33efd9cf21
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/mv28.C
@@ -0,0 +1,26 @@
+/* { dg-do compile} */
+/* { dg-require-ifunc "" }  */
+
+void __attribute__ ((target("avx512vl"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512bw"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512dq"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512cd"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512er"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512pf"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512vbmi"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512ifma"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx5124vnniw"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx5124fmaps"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512vpopcntdq"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512vbmi2"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("gfni"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("vpclmulqdq"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512vnni"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("avx512bitalg"))) foo () {} /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+void __attribute__ ((target("default"))) foo () {}
+
+int main()
+{
+  foo ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/mvc14.c b/gcc/testsuite/gcc.target/i386/mvc14.c
new file mode 100644
index 00000000000..fc357e65eca
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mvc14.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+
+__attribute__((target_clones("avx512vl", "avx512bw", "avx512dq",
+			     "avx512cd", "avx512er", "avx512pf", "avx512vbmi",
+			     "avx512ifma", "avx5124vnniw", "avx5124fmaps",
+			     "avx512vpopcntdq", "avx512vbmi2", "gfni",
+			     "vpclmulqdq", "avx512vnni", "avx512bitalg",
+			     "default")))
+int foo (); /* { dg-error "AVX512 ISA '\[^\n\r\]*' is not supported in 'target' attribute, use 'arch=' syntax" } */
+
+int
+bar ()
+{
+  return foo();
+}
-- 
2.21.0

Reply via email to