[clang] [clang] Diagnose host/device pointer width mismatches (PR #215620)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 28 10:46:56 PDT 2026
https://github.com/schittir updated https://github.com/llvm/llvm-project/pull/215620
>From e465e699bacb7e0be98902a68a7c53c04270f32f Mon Sep 17 00:00:00 2001
From: Sindhu Chittireddy <sindhu.chittireddy at intel.com>
Date: Tue, 11 Aug 2026 10:05:44 -0700
Subject: [PATCH 1/2] [clang] Diagnose host/device pointer width mismatches in
offload compilations
SPIR, physical SPIR-V, and NVPTX device targets take their pointer
related types from the host target, so a host whose pointer width
differs from the device's leaves size_t, ptrdiff_t, and intptr_t
inconsistent with the device data layout. Such pairings were previously
accepted and silently miscompiled.
This patch diagnoses these invalid combinations by calling the
diagnostic at:
1. Driver::CreateOffloadingDeviceToolChains(), covering --offload=,
--offload-targets=, and -fsycl.
2. TargetInfo::CreateTargetInfo(), covering -cc1 -triple X -aux-triple Y
and anything else that bypasses the driver.
This is the follow-up to #208196, as discussed during review.
---
clang/docs/ReleaseNotes.md | 6 +++
.../clang/Basic/DiagnosticCommonKinds.td | 3 ++
clang/lib/Basic/Targets.cpp | 24 +++++++++
clang/lib/Basic/Targets/SPIR.h | 50 +++++++++++--------
clang/lib/Driver/Driver.cpp | 16 ++++++
clang/test/CodeGenCUDA/anon-ns.cu | 4 +-
clang/test/CodeGenCUDA/long-double.cu | 2 +-
.../CodeGenCUDASPIRV/copy-aggregate-byval.cu | 4 +-
.../test/CodeGenCUDASPIRV/kernel-argument.cu | 4 +-
.../CodeGenSYCL/kernel-caller-entry-point.cpp | 9 ----
clang/test/Driver/cuda-device-triple.cu | 2 +-
clang/test/Frontend/sycl-aux-triple.cpp | 4 +-
clang/test/SemaCUDA/allow-int128.cu | 2 +-
.../SemaCUDA/cuda-inherits-calling-conv.cu | 2 +-
...v-implicit-alloc-function-calling-conv.hip | 2 -
15 files changed, 91 insertions(+), 43 deletions(-)
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 2f13ec59483ee..d1651cdb92581 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -51,6 +51,12 @@ The previous behavior can be restored with `-Wno-error=unicode-whitespace`.
Clang will stop accepting non-ascii whitespaces as token separators
in a future version of Clang.
+- Offload compilations that pair a SPIR, physical SPIR-V, or NVPTX device target
+ with a host of a different pointer width are now rejected, for example
+ `--offload=spirv32` with an `x86_64` host. These targets take `size_t`,
+ `ptrdiff_t`, and `intptr_t` from the host, so a mismatch disagreed with the
+ device data layout. Select a device target whose width matches the host's.
+
### C++ Specific Potentially Breaking Changes
### ABI Changes in This Version
diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index 192fdf9299eb4..ece27b02f840e 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -338,6 +338,9 @@ def err_target_unknown_cpu : Error<"unknown target CPU '%0'">;
def note_valid_options : Note<"valid target CPU values are: %0">;
def err_target_unsupported_cpu_for_micromips : Error<
"micromips is not supported for target CPU '%0'">;
+def err_target_unsupported_host_device_pointer_width : Error<
+ "device target '%0' with %1-bit pointers is incompatible with host target "
+ "'%2' with %3-bit pointers">;
def err_target_unknown_abi : Error<"unknown target ABI '%0'">;
def err_target_unsupported_abi : Error<"ABI '%0' is not supported on CPU '%1'">;
def err_target_unsupported_abi_for_triple : Error<
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 8c01cfca8ccb4..a939eb9b94470 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -835,6 +835,15 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
} // namespace clang
using namespace clang::targets;
+
+/// Returns true if Triple names a target that takes its pointer related types
+/// from a host target. Logical SPIR-V is excluded; it uses fixed values for
+/// those types regardless of the host.
+static bool adaptsToHostTarget(const llvm::Triple &Triple) {
+ return (Triple.isSPIROrSPIRV() && Triple.getArch() != llvm::Triple::spirv) ||
+ Triple.isNVPTX();
+}
+
/// CreateTargetInfo - Return the target info object for the specified target
/// options.
TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
@@ -843,6 +852,21 @@ TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple));
+ // Host and device pointer related type widths must match. Reject a mismatch
+ // before constructing the device target, which asserts on this.
+ if (adaptsToHostTarget(Triple) && !Opts->HostTriple.empty()) {
+ llvm::Triple HostTriple(llvm::Triple::normalize(Opts->HostTriple));
+ if (!adaptsToHostTarget(HostTriple) &&
+ HostTriple.getArch() != llvm::Triple::UnknownArch &&
+ Triple.getArchPointerBitWidth() !=
+ HostTriple.getArchPointerBitWidth()) {
+ Diags.Report(diag::err_target_unsupported_host_device_pointer_width)
+ << Triple.str() << Triple.getArchPointerBitWidth() << HostTriple.str()
+ << HostTriple.getArchPointerBitWidth();
+ return nullptr;
+ }
+ }
+
// Construct the target
std::unique_ptr<TargetInfo> Target = AllocateTarget(Triple, *Opts);
if (!Target) {
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 20d8efdc83234..17f90e80dc5fd 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -254,16 +254,18 @@ class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo {
: SPIRTargetInfo(Triple, Opts) {
assert(Triple.getArch() == llvm::Triple::spir &&
"Invalid architecture for 32-bit SPIR.");
- // FIXME: Assert that a present host target's pointer types match the ones
- // set below, once the driver diagnoses unsupported host/device combinations
- // (until then such an assert would fire on existing tests).
PointerWidth = PointerAlign = 32;
- const TargetInfo *HostTarget = getHostTarget();
- if (!HostTarget || HostTarget->getPointerWidth(LangAS::Default) != 32) {
+ if (!getHostTarget()) {
SizeType = TargetInfo::UnsignedInt;
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
}
+ // Host and device pointer related type widths must match.
+ assert(PointerWidth == 32 && PointerAlign == 32 &&
+ getTypeWidth(SizeType) == 32 && getTypeWidth(PtrDiffType) == 32 &&
+ getTypeWidth(IntPtrType) == 32 &&
+ "Invalid pointer related types for SPIR32");
+
// SPIR32 has support for atomic ops if atomic extension is enabled.
// Take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
@@ -281,16 +283,18 @@ class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
: SPIRTargetInfo(Triple, Opts) {
assert(Triple.getArch() == llvm::Triple::spir64 &&
"Invalid architecture for 64-bit SPIR.");
- // FIXME: Assert that a present host target's pointer types match the ones
- // set below, once the driver diagnoses unsupported host/device combinations
- // (until then such an assert would fire on existing tests).
PointerWidth = PointerAlign = 64;
- const TargetInfo *HostTarget = getHostTarget();
- if (!HostTarget || HostTarget->getPointerWidth(LangAS::Default) != 64) {
+ if (!getHostTarget()) {
SizeType = TargetInfo::UnsignedLong;
PtrDiffType = IntPtrType = TargetInfo::SignedLong;
}
+ // Host and device pointer related type widths must match.
+ assert(PointerWidth == 64 && PointerAlign == 64 &&
+ getTypeWidth(SizeType) == 64 && getTypeWidth(PtrDiffType) == 64 &&
+ getTypeWidth(IntPtrType) == 64 &&
+ "Invalid pointer related types for SPIR64");
+
// SPIR64 has support for atomic ops if atomic extension is enabled.
// Take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
@@ -379,15 +383,18 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
"32-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
"32-bit SPIR-V target must use unknown environment type");
- // FIXME: Assert that a present host target's pointer types match the ones
- // set below, once the driver diagnoses unsupported host/device combinations
- // (until then such an assert would fire on existing tests).
PointerWidth = PointerAlign = 32;
- const TargetInfo *HostTarget = getHostTarget();
- if (!HostTarget || HostTarget->getPointerWidth(LangAS::Default) != 32) {
+ if (!getHostTarget()) {
SizeType = TargetInfo::UnsignedInt;
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
}
+
+ // Host and device pointer related type widths must match.
+ assert(PointerWidth == 32 && PointerAlign == 32 &&
+ getTypeWidth(SizeType) == 32 && getTypeWidth(PtrDiffType) == 32 &&
+ getTypeWidth(IntPtrType) == 32 &&
+ "Invalid pointer related types for SPIR-V 32");
+
// SPIR-V has core support for atomic ops, and Int32 is always available;
// we take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
@@ -410,15 +417,18 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
"64-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
"64-bit SPIR-V target must use unknown environment type");
- // FIXME: Assert that a present host target's pointer types match the ones
- // set below, once the driver diagnoses unsupported host/device combinations
- // (until then such an assert would fire on existing tests).
PointerWidth = PointerAlign = 64;
- const TargetInfo *HostTarget = getHostTarget();
- if (!HostTarget || HostTarget->getPointerWidth(LangAS::Default) != 64) {
+ if (!getHostTarget()) {
SizeType = TargetInfo::UnsignedLong;
PtrDiffType = IntPtrType = TargetInfo::SignedLong;
}
+
+ // Host and device pointer related type widths must match.
+ assert(PointerWidth == 64 && PointerAlign == 64 &&
+ getTypeWidth(SizeType) == 64 && getTypeWidth(PtrDiffType) == 64 &&
+ getTypeWidth(IntPtrType) == 64 &&
+ "Invalid pointer related types for SPIR-V 64");
+
// SPIR-V has core support for atomic ops, and Int64 is always available;
// we take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 3b5d0c0aad981..cf7e49932a1a2 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1129,6 +1129,22 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
continue;
}
+ const llvm::Triple &HostTriple = C.getDefaultToolChain().getTriple();
+ // Logical SPIR-V is excluded; it overrides those types with fixed values.
+ auto AdaptsToHostTarget = [](const llvm::Triple &T) {
+ return (T.isSPIROrSPIRV() && T.getArch() != llvm::Triple::spirv) ||
+ T.isNVPTX();
+ };
+ // Target and host pointer related type widths must match.
+ if (AdaptsToHostTarget(Target) && !AdaptsToHostTarget(HostTriple) &&
+ Target.getArchPointerBitWidth() !=
+ HostTriple.getArchPointerBitWidth()) {
+ Diag(diag::err_target_unsupported_host_device_pointer_width)
+ << Target.str() << Target.getArchPointerBitWidth()
+ << HostTriple.str() << HostTriple.getArchPointerBitWidth();
+ continue;
+ }
+
std::string NormalizedName = Target.normalize();
auto [TripleIt, Inserted] =
FoundNormalizedTriples.try_emplace(NormalizedName, Target.str());
diff --git a/clang/test/CodeGenCUDA/anon-ns.cu b/clang/test/CodeGenCUDA/anon-ns.cu
index 651a20c653458..e2b290bd21c3d 100644
--- a/clang/test/CodeGenCUDA/anon-ns.cu
+++ b/clang/test/CodeGenCUDA/anon-ns.cu
@@ -11,12 +11,12 @@
// RUN: echo "GPU binary" > %t.fatbin
-// RUN: %clang_cc1 -triple nvptx -fcuda-is-device -cuid=abc \
+// RUN: %clang_cc1 -triple nvptx64 -fcuda-is-device -cuid=abc \
// RUN: -aux-triple x86_64-unknown-linux-gnu -std=c++17 -fgpu-rdc \
// RUN: -emit-llvm -o - %s > %t.dev
// RUN: %clang_cc1 -triple x86_64-gnu-linux -cuid=abc \
-// RUN: -aux-triple nvptx -std=c++17 -fgpu-rdc -fcuda-include-gpubinary %t.fatbin \
+// RUN: -aux-triple nvptx64 -std=c++17 -fgpu-rdc -fcuda-include-gpubinary %t.fatbin \
// RUN: -emit-llvm -o - %s > %t.host
// RUN: cat %t.dev %t.host | FileCheck -check-prefixes=CUDA,COMMON %s
diff --git a/clang/test/CodeGenCUDA/long-double.cu b/clang/test/CodeGenCUDA/long-double.cu
index b4116c0b81594..0a06fbe5db6d0 100644
--- a/clang/test/CodeGenCUDA/long-double.cu
+++ b/clang/test/CodeGenCUDA/long-double.cu
@@ -6,7 +6,7 @@
// RUN: -aux-triple x86_64-unknown-gnu-linux -fcuda-is-device \
// RUN: -emit-llvm -o - -x hip %s 2>&1 | FileCheck %s
-// RUN: %clang_cc1 -triple nvptx \
+// RUN: %clang_cc1 -triple nvptx64 \
// RUN: -aux-triple x86_64-unknown-gnu-linux -fcuda-is-device \
// RUN: -emit-llvm -o - %s 2>&1 | FileCheck %s
diff --git a/clang/test/CodeGenCUDASPIRV/copy-aggregate-byval.cu b/clang/test/CodeGenCUDASPIRV/copy-aggregate-byval.cu
index 2692ce4c92b28..fa6521b1fa5e3 100644
--- a/clang/test/CodeGenCUDASPIRV/copy-aggregate-byval.cu
+++ b/clang/test/CodeGenCUDASPIRV/copy-aggregate-byval.cu
@@ -2,12 +2,12 @@
// destructor, copy constructor or move constructor defined by user.
// RUN: %clang -emit-llvm --cuda-device-only --offload=spirv32 \
-// RUN: -nocudalib -nocudainc %s -o %t.bc -c 2>&1
+// RUN: --target=i386-unknown-linux-gnu -nocudalib -nocudainc %s -o %t.bc -c 2>&1
// RUN: llvm-dis %t.bc -o %t.ll
// RUN: FileCheck %s --input-file=%t.ll
// RUN: %clang -emit-llvm --cuda-device-only --offload=spirv64 \
-// RUN: -nocudalib -nocudainc %s -o %t.bc -c 2>&1
+// RUN: --target=x86_64-unknown-linux-gnu -nocudalib -nocudainc %s -o %t.bc -c 2>&1
// RUN: llvm-dis %t.bc -o %t.ll
// RUN: FileCheck %s --input-file=%t.ll
diff --git a/clang/test/CodeGenCUDASPIRV/kernel-argument.cu b/clang/test/CodeGenCUDASPIRV/kernel-argument.cu
index ab885eb3d85c4..8ec47949d0092 100644
--- a/clang/test/CodeGenCUDASPIRV/kernel-argument.cu
+++ b/clang/test/CodeGenCUDASPIRV/kernel-argument.cu
@@ -2,12 +2,12 @@
// RUN: %clang -emit-llvm --cuda-device-only --offload=spirv32 \
-// RUN: -nocudalib -nocudainc %s -o %t.bc -c 2>&1
+// RUN: --target=i386-unknown-linux-gnu -nocudalib -nocudainc %s -o %t.bc -c 2>&1
// RUN: llvm-dis %t.bc -o %t.ll
// RUN: FileCheck %s --input-file=%t.ll
// RUN: %clang -emit-llvm --cuda-device-only --offload=spirv64 \
-// RUN: -nocudalib -nocudainc %s -o %t.bc -c 2>&1
+// RUN: --target=x86_64-unknown-linux-gnu -nocudalib -nocudainc %s -o %t.bc -c 2>&1
// RUN: llvm-dis %t.bc -o %t.ll
// RUN: FileCheck %s --input-file=%t.ll
diff --git a/clang/test/CodeGenSYCL/kernel-caller-entry-point.cpp b/clang/test/CodeGenSYCL/kernel-caller-entry-point.cpp
index cc751cc683b59..bbbf4c037f760 100644
--- a/clang/test/CodeGenSYCL/kernel-caller-entry-point.cpp
+++ b/clang/test/CodeGenSYCL/kernel-caller-entry-point.cpp
@@ -1,26 +1,17 @@
// RUN: %clang_cc1 -fsycl-is-host -emit-llvm -triple x86_64-unknown-linux-gnu -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-HOST,CHECK-HOST-LINUX %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-unknown-linux-gnu -triple amdgpu-amd-amdhsa -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-AMDGCN %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-unknown-linux-gnu -triple nvptx-nvidia-cuda -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-NVPTX %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-unknown-linux-gnu -triple nvptx64-nvidia-cuda -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-NVPTX %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-unknown-linux-gnu -triple spir-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRNV %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-unknown-linux-gnu -triple spir64-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRNV %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-unknown-linux-gnu -triple spirv32-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRV %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-unknown-linux-gnu -triple spirv64-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRV %s
// RUN: %clang_cc1 -fsycl-is-host -emit-llvm -triple x86_64-pc-windows-msvc -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-HOST,CHECK-HOST-WINDOWS %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-pc-windows-msvc -triple amdgpu-amd-amdhsa -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-AMDGCN %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-pc-windows-msvc -triple nvptx-nvidia-cuda -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-NVPTX %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-pc-windows-msvc -triple nvptx64-nvidia-cuda -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-NVPTX %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-pc-windows-msvc -triple spir-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRNV %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-pc-windows-msvc -triple spir64-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRNV %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-pc-windows-msvc -triple spirv32-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRV %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-pc-windows-msvc -triple spirv64-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRV %s
// RUN: %clang_cc1 -fsycl-is-host -emit-llvm -triple x86_64-uefi -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-HOST,CHECK-HOST-WINDOWS %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-uefi -triple amdgpu-amd-amdhsa -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-AMDGCN %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-uefi -triple nvptx-nvidia-cuda -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-NVPTX %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-uefi -triple nvptx64-nvidia-cuda -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-NVPTX %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-uefi -triple spir-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRNV %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-uefi -triple spir64-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRNV %s
-// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-uefi -triple spirv32-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRV %s
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -aux-triple x86_64-uefi -triple spirv64-unknown-unknown -std=c++17 %s -o - | FileCheck --check-prefixes=CHECK-DEVICE,CHECK-SPIR,CHECK-SPIRV %s
// Test code generation for functions declared with the sycl_kernel_entry_point
diff --git a/clang/test/Driver/cuda-device-triple.cu b/clang/test/Driver/cuda-device-triple.cu
index 8acd4585b8c82..5abdcbf2b7381 100644
--- a/clang/test/Driver/cuda-device-triple.cu
+++ b/clang/test/Driver/cuda-device-triple.cu
@@ -1,4 +1,4 @@
-// RUN: %clang -### -emit-llvm --cuda-device-only \
+// RUN: %clang -### -emit-llvm --cuda-device-only --target=i386-unknown-linux-gnu \
// RUN: -nocudalib -nocudainc --offload=spirv32-unknown-unknown -c %s 2>&1 | FileCheck %s
// Make sure there's no sm_* suffix on the output name
diff --git a/clang/test/Frontend/sycl-aux-triple.cpp b/clang/test/Frontend/sycl-aux-triple.cpp
index 38b6a24fb3ce9..2ab23fd1cf7e8 100644
--- a/clang/test/Frontend/sycl-aux-triple.cpp
+++ b/clang/test/Frontend/sycl-aux-triple.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 %s -triple spir -aux-triple x86_64-unknown-linux-gnu -E -dM | FileCheck %s
-// RUN: %clang_cc1 %s -fsycl-is-device -triple spir -aux-triple x86_64-unknown-linux-gnu -E -dM | FileCheck --check-prefix=CHECK-SYCL %s
+// RUN: %clang_cc1 %s -triple spir64 -aux-triple x86_64-unknown-linux-gnu -E -dM | FileCheck %s
+// RUN: %clang_cc1 %s -fsycl-is-device -triple spir64 -aux-triple x86_64-unknown-linux-gnu -E -dM | FileCheck --check-prefix=CHECK-SYCL %s
// CHECK-NOT:#define __x86_64__ 1
// CHECK-SYCL:#define __x86_64__ 1
diff --git a/clang/test/SemaCUDA/allow-int128.cu b/clang/test/SemaCUDA/allow-int128.cu
index 44f8fefa3aa05..5d2f484bcd44d 100644
--- a/clang/test/SemaCUDA/allow-int128.cu
+++ b/clang/test/SemaCUDA/allow-int128.cu
@@ -4,7 +4,7 @@
// RUN: %clang_cc1 -triple spirv64-amd-amdhsa \
// RUN: -aux-triple x86_64-unknown-linux-gnu \
// RUN: -fcuda-is-device -verify -fsyntax-only %s
-// RUN: %clang_cc1 -triple nvptx \
+// RUN: %clang_cc1 -triple nvptx64 \
// RUN: -aux-triple x86_64-unknown-linux-gnu \
// RUN: -fcuda-is-device -verify -fsyntax-only %s
diff --git a/clang/test/SemaCUDA/cuda-inherits-calling-conv.cu b/clang/test/SemaCUDA/cuda-inherits-calling-conv.cu
index a6928e71f3ae0..a4a6292e012e4 100644
--- a/clang/test/SemaCUDA/cuda-inherits-calling-conv.cu
+++ b/clang/test/SemaCUDA/cuda-inherits-calling-conv.cu
@@ -5,7 +5,7 @@
// RUN: -aux-triple i386-windows-msvc -fsyntax-only \
// RUN: -fcuda-is-device -verify %s
-// RUN: %clang_cc1 -std=c++11 -triple nvptx-nvidia-cuda \
+// RUN: %clang_cc1 -std=c++11 -triple nvptx64-nvidia-cuda \
// RUN: -aux-triple x86_64-linux-gnu -fsyntax-only \
// RUN: -fcuda-is-device -verify -verify-ignore-unexpected=note \
// RUN: -DEXPECT_ERR %s
diff --git a/clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip b/clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip
index c3e7e1a5cd59e..66bf9b359e65a 100644
--- a/clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip
+++ b/clang/test/SemaHIP/amdgcnspirv-implicit-alloc-function-calling-conv.hip
@@ -1,10 +1,8 @@
// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv32 -verify
// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64 -verify
// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64-amd-amdhsa -verify
-// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv32 -aux-triple x86_64-unknown-linux-gnu -verify
// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64 -aux-triple x86_64-unknown-linux-gnu -verify
// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64-amd-amdhsa -aux-triple x86_64-unknown-linux-gnu -verify
-// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv32 -aux-triple x86_64-pc-windows-msvc -verify
// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64 -aux-triple x86_64-pc-windows-msvc -verify
// RUN: %clang_cc1 %s -fcuda-is-device -std=c++17 -triple spirv64-amd-amdhsa -aux-triple x86_64-pc-windows-msvc -verify
>From 306f69d8643631f04d935f9b3834f1031f61576a Mon Sep 17 00:00:00 2001
From: Sindhu Chittireddy <sindhu.chittireddy at intel.com>
Date: Fri, 28 Aug 2026 10:44:07 -0700
Subject: [PATCH 2/2] Diagnose other type and size mismatches in addition to
pointer width
---
clang/docs/ReleaseNotes.md | 9 ++-
.../clang/Basic/DiagnosticCommonKinds.td | 7 +-
clang/include/clang/Basic/TargetInfo.h | 30 +++++++
clang/lib/Basic/Targets.cpp | 79 ++++++++++++++-----
clang/lib/Basic/Targets/SPIR.h | 32 +-------
clang/lib/Driver/Driver.cpp | 18 ++---
clang/lib/Frontend/CompilerInstance.cpp | 8 +-
clang/test/Driver/hip-autolink.hip | 6 +-
clang/test/SemaCUDA/amdgpu-bf16.cu | 4 +-
9 files changed, 121 insertions(+), 72 deletions(-)
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index d1651cdb92581..42f52a2fd1a83 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -51,11 +51,12 @@ The previous behavior can be restored with `-Wno-error=unicode-whitespace`.
Clang will stop accepting non-ascii whitespaces as token separators
in a future version of Clang.
-- Offload compilations that pair a SPIR, physical SPIR-V, or NVPTX device target
- with a host of a different pointer width are now rejected, for example
- `--offload=spirv32` with an `x86_64` host. These targets take `size_t`,
+- Offload compilations that pair a SPIR, physical SPIR-V, NVPTX, or AMDGPU device
+ target with an incompatible host target are now rejected, for example
+ `--offload=spirv32` with an `x86_64` host, or `--offload-arch=gfx906` with an
+ `i386` host. These targets take the pointer width and alignment, `size_t`,
`ptrdiff_t`, and `intptr_t` from the host, so a mismatch disagreed with the
- device data layout. Select a device target whose width matches the host's.
+ device data layout. Select a host and device target that agree on those types.
### C++ Specific Potentially Breaking Changes
diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index ece27b02f840e..bbf9882ffda06 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -338,9 +338,10 @@ def err_target_unknown_cpu : Error<"unknown target CPU '%0'">;
def note_valid_options : Note<"valid target CPU values are: %0">;
def err_target_unsupported_cpu_for_micromips : Error<
"micromips is not supported for target CPU '%0'">;
-def err_target_unsupported_host_device_pointer_width : Error<
- "device target '%0' with %1-bit pointers is incompatible with host target "
- "'%2' with %3-bit pointers">;
+def err_target_unsupported_host_pointer_related_type : Error<
+ "device target '%0' takes %select{a pointer width|a pointer alignment|"
+ "a 'size_t' width|a 'ptrdiff_t' width|an 'intptr_t' width}2 of %3 bits from "
+ "host target '%1', but requires %4 bits">;
def err_target_unknown_abi : Error<"unknown target ABI '%0'">;
def err_target_unsupported_abi : Error<"ABI '%0' is not supported on CPU '%1'">;
def err_target_unsupported_abi_for_triple : Error<
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h
index 6311b6b567a5e..f0f5bf735ae95 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -327,6 +327,36 @@ class TargetInfo : public TransferrableTargetInfo,
static TargetInfo *CreateTargetInfo(DiagnosticsEngine &Diags,
TargetOptions &Opts);
+ /// When a device target takes its pointer related types (the pointer width
+ /// and alignment, size_t, ptrdiff_t, and intptr_t) from a host target.
+ enum class HostAdaptation {
+ /// It keeps its own pointer related types.
+ None,
+ /// It adapts in its constructor, from TargetOptions::HostTriple.
+ Constructor,
+ SetAuxTarget,
+ };
+
+ /// Returns when the device target takes its pointer related types from the
+ /// host target, mirroring the conditions under which the TargetInfo
+ /// subclasses adapt. A device that declines a host keeps its own types, which
+ /// the driver's triple level check must not report as a mismatch.
+ static HostAdaptation getHostAdaptation(const llvm::Triple &DeviceTriple,
+ const llvm::Triple &HostTriple);
+
+ static bool adaptsToHostTarget(const llvm::Triple &DeviceTriple,
+ const llvm::Triple &HostTriple) {
+ return getHostAdaptation(DeviceTriple, HostTriple) != HostAdaptation::None;
+ }
+
+ /// Reports an error if this target adapts to the given host target at the
+ /// given stage and ended up with pointer related types that disagree with its
+ /// own data layout. Does nothing if it does not adapt at that stage. Returns
+ /// true if no error was reported.
+ bool checkHostPointerRelatedTypes(DiagnosticsEngine &Diags,
+ const llvm::Triple &HostTriple,
+ HostAdaptation Stage) const;
+
virtual ~TargetInfo();
/// Retrieve the target options.
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index a939eb9b94470..ed48400a947f9 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -836,12 +836,59 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
using namespace clang::targets;
-/// Returns true if Triple names a target that takes its pointer related types
-/// from a host target. Logical SPIR-V is excluded; it uses fixed values for
-/// those types regardless of the host.
-static bool adaptsToHostTarget(const llvm::Triple &Triple) {
- return (Triple.isSPIROrSPIRV() && Triple.getArch() != llvm::Triple::spirv) ||
- Triple.isNVPTX();
+TargetInfo::HostAdaptation
+TargetInfo::getHostAdaptation(const llvm::Triple &DeviceTriple,
+ const llvm::Triple &HostTriple) {
+ // No recognizable host triple, so nothing to adapt to.
+ if (HostTriple.getArch() == llvm::Triple::UnknownArch)
+ return HostAdaptation::None;
+
+ // setAuxTarget() overwrites these, so constructor values are not yet final.
+ if (DeviceTriple.isAMDGPU() ||
+ (DeviceTriple.getArch() == llvm::Triple::spirv64 &&
+ DeviceTriple.getOS() == llvm::Triple::AMDHSA))
+ return HostAdaptation::SetAuxTarget;
+
+ // Logical SPIR-V sets these itself, with a 32-bit size_t by design.
+ if (DeviceTriple.isSPIRVLogical())
+ return HostAdaptation::None;
+
+ if (DeviceTriple.isSPIROrSPIRV())
+ return HostTriple.isSPIROrSPIRV() ? HostAdaptation::None
+ : HostAdaptation::Constructor;
+ if (DeviceTriple.isNVPTX())
+ return HostTriple.isNVPTX() ? HostAdaptation::None
+ : HostAdaptation::Constructor;
+
+ return HostAdaptation::None;
+}
+
+bool TargetInfo::checkHostPointerRelatedTypes(DiagnosticsEngine &Diags,
+ const llvm::Triple &HostTriple,
+ HostAdaptation Stage) const {
+ assert(Stage != HostAdaptation::None && "Nothing to check");
+ if (getHostAdaptation(getTriple(), HostTriple) != Stage)
+ return true;
+
+ // The device data layout fixes the width of every one of these types.
+ unsigned Required = getTriple().getArchPointerBitWidth();
+ // The order matches the %select in the diagnostic below.
+ unsigned Widths[] = {getPointerWidth(LangAS::Default),
+ getPointerAlign(LangAS::Default),
+ getTypeWidth(getSizeType()),
+ getTypeWidth(getPtrDiffType(LangAS::Default)),
+ getTypeWidth(getIntPtrType())};
+
+ for (auto [Which, Width] : llvm::enumerate(Widths)) {
+ if (Width != Required) {
+ Diags.Report(diag::err_target_unsupported_host_pointer_related_type)
+ << getTriple().str() << HostTriple.str()
+ << static_cast<unsigned>(Which) << Width << Required;
+ return false;
+ }
+ }
+
+ return true;
}
/// CreateTargetInfo - Return the target info object for the specified target
@@ -852,21 +899,6 @@ TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple));
- // Host and device pointer related type widths must match. Reject a mismatch
- // before constructing the device target, which asserts on this.
- if (adaptsToHostTarget(Triple) && !Opts->HostTriple.empty()) {
- llvm::Triple HostTriple(llvm::Triple::normalize(Opts->HostTriple));
- if (!adaptsToHostTarget(HostTriple) &&
- HostTriple.getArch() != llvm::Triple::UnknownArch &&
- Triple.getArchPointerBitWidth() !=
- HostTriple.getArchPointerBitWidth()) {
- Diags.Report(diag::err_target_unsupported_host_device_pointer_width)
- << Triple.str() << Triple.getArchPointerBitWidth() << HostTriple.str()
- << HostTriple.getArchPointerBitWidth();
- return nullptr;
- }
- }
-
// Construct the target
std::unique_ptr<TargetInfo> Target = AllocateTarget(Triple, *Opts);
if (!Target) {
@@ -875,6 +907,11 @@ TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
}
Target->TargetOpts = Opts;
+ // Targets that adapt in their constructor have done so by now.
+ if (!Target->checkHostPointerRelatedTypes(
+ Diags, llvm::Triple(Opts->HostTriple), HostAdaptation::Constructor))
+ return nullptr;
+
// Set the target CPU if specified.
if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 17f90e80dc5fd..b5400cddf575c 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -254,18 +254,12 @@ class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo {
: SPIRTargetInfo(Triple, Opts) {
assert(Triple.getArch() == llvm::Triple::spir &&
"Invalid architecture for 32-bit SPIR.");
- PointerWidth = PointerAlign = 32;
if (!getHostTarget()) {
+ PointerWidth = PointerAlign = 32;
SizeType = TargetInfo::UnsignedInt;
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
}
- // Host and device pointer related type widths must match.
- assert(PointerWidth == 32 && PointerAlign == 32 &&
- getTypeWidth(SizeType) == 32 && getTypeWidth(PtrDiffType) == 32 &&
- getTypeWidth(IntPtrType) == 32 &&
- "Invalid pointer related types for SPIR32");
-
// SPIR32 has support for atomic ops if atomic extension is enabled.
// Take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
@@ -283,18 +277,12 @@ class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
: SPIRTargetInfo(Triple, Opts) {
assert(Triple.getArch() == llvm::Triple::spir64 &&
"Invalid architecture for 64-bit SPIR.");
- PointerWidth = PointerAlign = 64;
if (!getHostTarget()) {
+ PointerWidth = PointerAlign = 64;
SizeType = TargetInfo::UnsignedLong;
PtrDiffType = IntPtrType = TargetInfo::SignedLong;
}
- // Host and device pointer related type widths must match.
- assert(PointerWidth == 64 && PointerAlign == 64 &&
- getTypeWidth(SizeType) == 64 && getTypeWidth(PtrDiffType) == 64 &&
- getTypeWidth(IntPtrType) == 64 &&
- "Invalid pointer related types for SPIR64");
-
// SPIR64 has support for atomic ops if atomic extension is enabled.
// Take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
@@ -383,18 +371,12 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
"32-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
"32-bit SPIR-V target must use unknown environment type");
- PointerWidth = PointerAlign = 32;
if (!getHostTarget()) {
+ PointerWidth = PointerAlign = 32;
SizeType = TargetInfo::UnsignedInt;
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
}
- // Host and device pointer related type widths must match.
- assert(PointerWidth == 32 && PointerAlign == 32 &&
- getTypeWidth(SizeType) == 32 && getTypeWidth(PtrDiffType) == 32 &&
- getTypeWidth(IntPtrType) == 32 &&
- "Invalid pointer related types for SPIR-V 32");
-
// SPIR-V has core support for atomic ops, and Int32 is always available;
// we take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
@@ -417,18 +399,12 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
"64-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
"64-bit SPIR-V target must use unknown environment type");
- PointerWidth = PointerAlign = 64;
if (!getHostTarget()) {
+ PointerWidth = PointerAlign = 64;
SizeType = TargetInfo::UnsignedLong;
PtrDiffType = IntPtrType = TargetInfo::SignedLong;
}
- // Host and device pointer related type widths must match.
- assert(PointerWidth == 64 && PointerAlign == 64 &&
- getTypeWidth(SizeType) == 64 && getTypeWidth(PtrDiffType) == 64 &&
- getTypeWidth(IntPtrType) == 64 &&
- "Invalid pointer related types for SPIR-V 64");
-
// SPIR-V has core support for atomic ops, and Int64 is always available;
// we take the maximum because it's possible the Host supports wider types.
MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64);
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index cf7e49932a1a2..f90c2804b805c 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -55,6 +55,7 @@
#include "ToolChains/ZOS.h"
#include "clang/Basic/DiagnosticDriver.h"
#include "clang/Basic/TargetID.h"
+#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/Version.h"
#include "clang/Config/config.h"
#include "clang/Driver/Action.h"
@@ -1129,19 +1130,16 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
continue;
}
+ // A triple level approximation that catches the common cases early; the
+ // types are checked once the device adapts.
const llvm::Triple &HostTriple = C.getDefaultToolChain().getTriple();
- // Logical SPIR-V is excluded; it overrides those types with fixed values.
- auto AdaptsToHostTarget = [](const llvm::Triple &T) {
- return (T.isSPIROrSPIRV() && T.getArch() != llvm::Triple::spirv) ||
- T.isNVPTX();
- };
- // Target and host pointer related type widths must match.
- if (AdaptsToHostTarget(Target) && !AdaptsToHostTarget(HostTriple) &&
+ if (TargetInfo::adaptsToHostTarget(Target, HostTriple) &&
Target.getArchPointerBitWidth() !=
HostTriple.getArchPointerBitWidth()) {
- Diag(diag::err_target_unsupported_host_device_pointer_width)
- << Target.str() << Target.getArchPointerBitWidth()
- << HostTriple.str() << HostTriple.getArchPointerBitWidth();
+ Diag(diag::err_target_unsupported_host_pointer_related_type)
+ << Target.str() << HostTriple.str() << /*pointer width*/ 0
+ << HostTriple.getArchPointerBitWidth()
+ << Target.getArchPointerBitWidth();
continue;
}
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 66662a786e6fc..7a7373b82ebb9 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -167,9 +167,15 @@ bool CompilerInstance::createTarget() {
// created. This complexity should be lifted elsewhere.
getTarget().adjust(getDiagnostics(), getLangOpts(), getAuxTarget());
- if (auto *Aux = getAuxTarget())
+ if (auto *Aux = getAuxTarget()) {
getTarget().setAuxTarget(Aux);
+ if (!getTarget().checkHostPointerRelatedTypes(
+ getDiagnostics(), Aux->getTriple(),
+ TargetInfo::HostAdaptation::SetAuxTarget))
+ return false;
+ }
+
return true;
}
diff --git a/clang/test/Driver/hip-autolink.hip b/clang/test/Driver/hip-autolink.hip
index cce3977375d2e..e37c6e5d7e502 100644
--- a/clang/test/Driver/hip-autolink.hip
+++ b/clang/test/Driver/hip-autolink.hip
@@ -1,10 +1,10 @@
-// RUN: %clang --target=i386-pc-windows-msvc --cuda-gpu-arch=gfx906 -nogpulib -nogpuinc \
+// RUN: %clang --target=x86_64-pc-windows-msvc --cuda-gpu-arch=gfx906 -nogpulib -nogpuinc \
// RUN: --cuda-device-only %s -### 2>&1 | FileCheck --check-prefix=DEV %s
-// RUN: %clang --target=i386-pc-windows-msvc --cuda-gpu-arch=gfx906 -nogpulib -nogpuinc \
+// RUN: %clang --target=x86_64-pc-windows-msvc --cuda-gpu-arch=gfx906 -nogpulib -nogpuinc \
// RUN: --cuda-host-only %s -### 2>&1 | FileCheck --check-prefix=HOST %s
// DEV: "-cc1" "-triple" "amdgcn-amd-amdhsa"
// DEV-SAME: "-fno-autolink"
-// HOST: "-cc1" "-triple" "i386-pc-windows-msvc{{.*}}"
+// HOST: "-cc1" "-triple" "x86_64-pc-windows-msvc{{.*}}"
// HOST-NOT: "-fno-autolink"
diff --git a/clang/test/SemaCUDA/amdgpu-bf16.cu b/clang/test/SemaCUDA/amdgpu-bf16.cu
index 0b5ce1a4f64cf..b14a3dd608aeb 100644
--- a/clang/test/SemaCUDA/amdgpu-bf16.cu
+++ b/clang/test/SemaCUDA/amdgpu-bf16.cu
@@ -1,8 +1,8 @@
// REQUIRES: amdgpu-registered-target
// REQUIRES: x86-registered-target
-// RUN: %clang_cc1 "-aux-triple" "x86_64-unknown-linux-gnu" "-triple" "r600-unknown-unknown"\
-// RUN: -fcuda-is-device "-aux-target-cpu" "x86-64" -fsyntax-only -verify=r600 %s
+// RUN: %clang_cc1 "-aux-triple" "i386-unknown-linux-gnu" "-triple" "r600-unknown-unknown"\
+// RUN: -fcuda-is-device "-aux-target-cpu" "i686" -fsyntax-only -verify=r600 %s
// AMDGCN has storage-only support for bf16. R600 does not support it should error out when
// it's the main target.
More information about the cfe-commits
mailing list