llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: Phoebe Wang (phoebewang)

<details>
<summary>Changes</summary>

Ref: 
https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170

---
Full diff: https://github.com/llvm/llvm-project/pull/167111.diff


3 Files Affected:

- (modified) clang/lib/Driver/ToolChains/Arch/X86.cpp (+2) 
- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+13-2) 
- (modified) clang/test/Driver/cl-x86-flags.c (+57-3) 


``````````diff
diff --git a/clang/lib/Driver/ToolChains/Arch/X86.cpp 
b/clang/lib/Driver/ToolChains/Arch/X86.cpp
index 1373905a5120e..8adc5d5a9cd5b 100644
--- a/clang/lib/Driver/ToolChains/Arch/X86.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/X86.cpp
@@ -42,6 +42,8 @@ std::string x86::getX86TargetCPU(const Driver &D, const 
ArgList &Args,
         {"AVX2", "haswell"},
         {"AVX512F", "knl"},
         {"AVX512", "skylake-avx512"},
+        {"AVX10.1", "sapphirerapids"},
+        {"AVX10.2", "diamondrapids"},
     });
     if (Triple.getArch() == llvm::Triple::x86) {
       // 32-bit-only /arch: flags.
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index e20963ac288d8..2aa093876da2b 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -8272,9 +8272,11 @@ void Clang::AddClangCLArgs(const ArgList &Args, 
types::ID InputType,
     llvm::Triple::ArchType AT = getToolChain().getArch();
     StringRef Default = AT == llvm::Triple::x86 ? "IA32" : "SSE2";
     StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch, Default);
+    llvm::SmallSet<std::string, 4> Arch512 = {"AVX512F", "AVX512", "AVX10.1",
+                                              "AVX10.2"};
 
     if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_512)) {
-      if (Arch == "AVX512F" || Arch == "AVX512")
+      if (Arch512.contains(Arch.str()))
         CmdArgs.push_back("-mprefer-vector-width=512");
       else
         D.Diag(diag::warn_drv_argument_not_allowed_with)
@@ -8282,12 +8284,21 @@ void Clang::AddClangCLArgs(const ArgList &Args, 
types::ID InputType,
     }
 
     if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_256)) {
-      if (Arch == "AVX512F" || Arch == "AVX512")
+      if (Arch512.contains(Arch.str()))
         CmdArgs.push_back("-mprefer-vector-width=256");
       else if (Arch != "AVX" && Arch != "AVX2")
         D.Diag(diag::warn_drv_argument_not_allowed_with)
             << "/vlen=256" << std::string("/arch:").append(Arch);
     }
+
+    if (A->getOption().matches(options::OPT__SLASH_vlen))
+      if (Arch == "AVX10.1" || Arch == "AVX10.2")
+        CmdArgs.push_back("-mprefer-vector-width=256");
+  } else {
+    StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch);
+
+    if (Arch == "AVX10.1" || Arch == "AVX10.2")
+      CmdArgs.push_back("-mprefer-vector-width=256");
   }
 
   Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
diff --git a/clang/test/Driver/cl-x86-flags.c b/clang/test/Driver/cl-x86-flags.c
index 4dae49aab7ac7..84270aae35f7a 100644
--- a/clang/test/Driver/cl-x86-flags.c
+++ b/clang/test/Driver/cl-x86-flags.c
@@ -18,10 +18,10 @@
 
 // arch: args are case-sensitive.
 // RUN: %clang_cl -m32 -arch:ia32 --target=i386-pc-windows -### -- 2>&1 %s | 
FileCheck -check-prefix=ia32 %s
-// ia32: invalid /arch: argument 'ia32'; for 32-bit expected one of AVX, AVX2, 
AVX512, AVX512F, IA32, SSE, SSE2
+// ia32: invalid /arch: argument 'ia32'; for 32-bit expected one of AVX, 
AVX10.1, AVX10.2, AVX2, AVX512, AVX512F, IA32, SSE, SSE2
 
 // RUN: %clang_cl -m64 -arch:IA32 --target=x86_64-pc-windows -### -- 2>&1 %s | 
FileCheck -check-prefix=IA3264 %s
-// IA3264: invalid /arch: argument 'IA32'; for 64-bit expected one of AVX, 
AVX2, AVX512, AVX512F
+// IA3264: invalid /arch: argument 'IA32'; for 64-bit expected one of AVX, 
AVX10.1, AVX10.2, AVX2, AVX512, AVX512F
 
 // RUN: %clang_cl -m32 -arch:SSE --target=i386-pc-windows /c /Fo%t.obj -Xclang 
-verify -DTEST_32_ARCH_SSE -- %s
 #if defined(TEST_32_ARCH_SSE)
@@ -44,7 +44,7 @@
 // sse2: invalid /arch: argument
 
 // RUN: %clang_cl -m64 -arch:SSE --target=x86_64-pc-windows -### -- 2>&1 %s | 
FileCheck -check-prefix=SSE64 %s
-// SSE64: invalid /arch: argument 'SSE'; for 64-bit expected one of AVX, AVX2, 
AVX512, AVX512F
+// SSE64: invalid /arch: argument 'SSE'; for 64-bit expected one of AVX, 
AVX10.1, AVX10.2, AVX2, AVX512, AVX512F
 
 // RUN: %clang_cl -m64 -arch:SSE2 --target=x86_64-pc-windows -### -- 2>&1 %s | 
FileCheck -check-prefix=SSE264 %s
 // SSE264: invalid /arch: argument
@@ -80,6 +80,8 @@
 // avx512f: invalid /arch: argument
 
 // RUN: %clang_cl -m32 -arch:AVX512 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_32_ARCH_AVX512 -- %s
+// RUN: %clang_cl -m32 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_32_ARCH_AVX512 -- %s
+// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_32_ARCH_AVX512 -- %s
 #if defined(TEST_32_ARCH_AVX512)
 #if _M_IX86_FP != 2 || !__AVX__ || !__AVX2__ || !__AVX512F__  || !__AVX512BW__
 #error fail
@@ -89,6 +91,28 @@
 // RUN: %clang_cl -m32 -arch:avx512 --target=i386-pc-windows -### -- 2>&1 %s | 
FileCheck -check-prefix=avx512 %s
 // avx512: invalid /arch: argument
 
+// RUN: %clang_cl -m32 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_32_ARCH_AVX10_1_ADD -- %s
+// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_32_ARCH_AVX10_1_ADD -- %s
+#if defined(TEST_32_ARCH_AVX10_1_ADD)
+#if !__AVX512VL__  || !__AVX512CD__ || !__AVX512DQ__ || !__AVX512VBMI__ || 
!__AVX512IFMA__ || !__AVX512VNNI__ ||\
+    !__AVX512BF16__ || !__AVX512VPOPCNTDQ__ || !__AVX512VBMI2__ || 
!__AVX512VPOPCNTDQ__ || !__AVX512BITALG__ || !__AVX512FP16__
+#error fail
+#endif
+#endif
+
+// RUN: %clang_cl -m32 -arch:avx10.1 --target=i386-pc-windows -### -- 2>&1 %s 
| FileCheck -check-prefix=avx10_1 %s
+// avx10_1: invalid /arch: argument
+
+// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_32_ARCH_AVX10_2_ADD -- %s
+#if defined(TEST_32_ARCH_AVX10_2_ADD)
+#if !__AVX10_2__
+#error fail
+#endif
+#endif
+
+// RUN: %clang_cl -m32 -arch:avx10.2 --target=i386-pc-windows -### -- 2>&1 %s 
| FileCheck -check-prefix=avx10_2 %s
+// avx10_2: invalid /arch: argument
+
 // RUN: %clang_cl -m64 -arch:AVX --target=x86_64-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_64_ARCH_AVX -- %s
 #if defined(TEST_64_ARCH_AVX)
 #if _M_IX86_FP || !__AVX__ || __AVX2__ || __AVX512F__  || __AVX512BW__
@@ -120,6 +144,8 @@
 // avx512f64: invalid /arch: argument
 
 // RUN: %clang_cl -m64 -arch:AVX512 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_64_ARCH_AVX512 -- %s
+// RUN: %clang_cl -m64 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_64_ARCH_AVX512 -- %s
+// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_64_ARCH_AVX512 -- %s
 #if defined(TEST_64_ARCH_AVX512)
 #if _M_IX86_FP || !__AVX__ || !__AVX2__ || !__AVX512F__  || !__AVX512BW__
 #error fail
@@ -129,14 +155,42 @@
 // RUN: %clang_cl -m64 -arch:avx512 --target=i386-pc-windows -### -- 2>&1 %s | 
FileCheck -check-prefix=avx51264 %s
 // avx51264: invalid /arch: argument
 
+// RUN: %clang_cl -m64 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_64_ARCH_AVX10_1_ADD -- %s
+// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_64_ARCH_AVX10_1_ADD -- %s
+#if defined(TEST_64_ARCH_AVX10_1_ADD)
+#if !__AVX512VL__  || !__AVX512CD__ || !__AVX512DQ__ || !__AVX512VBMI__ || 
!__AVX512IFMA__ || !__AVX512VNNI__ ||\
+    !__AVX512BF16__ || !__AVX512VPOPCNTDQ__ || !__AVX512VBMI2__ || 
!__AVX512VPOPCNTDQ__ || !__AVX512BITALG__ || !__AVX512FP16__
+#error fail
+#endif
+#endif
+
+// RUN: %clang_cl -m64 -arch:avx10.1 --target=i386-pc-windows -### -- 2>&1 %s 
| FileCheck -check-prefix=avx10_1_64 %s
+// avx10_1_64: invalid /arch: argument
+
+// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj 
-Xclang -verify -DTEST_64_ARCH_AVX10_2_ADD -- %s
+#if defined(TEST_64_ARCH_AVX10_2_ADD)
+#if !__AVX10_2__
+#error fail
+#endif
+#endif
+
+// RUN: %clang_cl -m64 -arch:avx10.2 --target=i386-pc-windows -### -- 2>&1 %s 
| FileCheck -check-prefix=avx10_2_64 %s
+// avx10_2_64: invalid /arch: argument
+
 // RUN: %clang_cl -m64 -arch:AVX -tune:haswell --target=x86_64-pc-windows -### 
-- 2>&1 %s | FileCheck -check-prefix=tune %s
 // tune: "-target-cpu" "sandybridge"
 // tune-SAME: "-tune-cpu" "haswell"
 
 // RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 --target=x86_64-pc-windows -### 
-- 2>&1 %s | FileCheck -check-prefix=vlen512 %s
+// RUN: %clang_cl -m64 -arch:AVX10.1 -vlen=512 --target=x86_64-pc-windows -### 
-- 2>&1 %s | FileCheck -check-prefix=vlen512 %s
+// RUN: %clang_cl -m64 -arch:AVX10.2 -vlen=512 --target=x86_64-pc-windows -### 
-- 2>&1 %s | FileCheck -check-prefix=vlen512 %s
 // vlen512: "-mprefer-vector-width=512"
 
 // RUN: %clang_cl -m64 -arch:AVX512 -vlen=256 --target=x86_64-pc-windows -### 
-- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
+// RUN: %clang_cl -m64 -arch:AVX10.1 --target=x86_64-pc-windows -### -- 2>&1 
%s | FileCheck -check-prefix=vlen256 %s
+// RUN: %clang_cl -m64 -arch:AVX10.2 --target=x86_64-pc-windows -### -- 2>&1 
%s | FileCheck -check-prefix=vlen256 %s
+// RUN: %clang_cl -m64 -arch:AVX10.1 -vlen=256 --target=x86_64-pc-windows -### 
-- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
+// RUN: %clang_cl -m64 -arch:AVX10.2 -vlen=256 --target=x86_64-pc-windows -### 
-- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
 // vlen256: "-mprefer-vector-width=256"
 
 // RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 -vlen --target=x86_64-pc-windows 
-### -- 2>&1 %s | FileCheck -check-prefix=novlen %s

``````````

</details>


https://github.com/llvm/llvm-project/pull/167111
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to