diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ad650704a1615..6e08b12196156 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8593,7 +8593,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, } } - if (IsCuda) { + // Propagate -fcuda-short-ptr if compiling CUDA or SYCL for NVPTX + if (IsCuda || (IsSYCLDevice && Triple.isNVPTX())) { if (Args.hasFlag(options::OPT_fcuda_short_ptr, options::OPT_fno_cuda_short_ptr, false)) CmdArgs.push_back("-fcuda-short-ptr"); diff --git a/clang/test/CodeGenSYCL/nvptx-short-ptr.cpp b/clang/test/CodeGenSYCL/nvptx-short-ptr.cpp new file mode 100644 index 0000000000000..90db7373eb967 --- /dev/null +++ b/clang/test/CodeGenSYCL/nvptx-short-ptr.cpp @@ -0,0 +1,27 @@ +// Check that when we see the expected data layouts for NVPTX when we pass the +// -nvptx-short-ptr option. + +// RUN: %clang_cc1 -fsycl-is-device -disable-llvm-passes \ +// RUN: -triple nvptx-nvidia-cuda -emit-llvm %s -o - \ +// RUN: | FileCheck %s --check-prefix CHECK32 + +// RUN: %clang_cc1 -fsycl-is-device -disable-llvm-passes \ +// RUN: -triple nvptx-nvidia-cuda -emit-llvm -fcuda-short-ptr -mllvm -nvptx-short-ptr %s -o - \ +// RUN: | FileCheck %s --check-prefix CHECK32 + +// RUN: %clang_cc1 -fsycl-is-device -disable-llvm-passes \ +// RUN: -triple nvptx64-nvidia-cuda -emit-llvm %s -o - \ +// RUN: | FileCheck %s --check-prefix CHECK64-DEFAULT + +// RUN: %clang_cc1 -fsycl-is-device -disable-llvm-passes \ +// RUN: -triple nvptx64-nvidia-cuda -emit-llvm -fcuda-short-ptr -mllvm -nvptx-short-ptr %s -o - \ +// RUN: | FileCheck %s --check-prefix CHECK64-SHORT + +// Targeting a 32-bit NVPTX, check that we see universal 32-bit pointers (the +// option changes nothing) +// CHECK32: target datalayout = "e-p:32:32-i64:64-i128:128-v16:16-v32:32-n16:32:64" + +// Targeting a 64-bit NVPTX target, check that we see 32-bit pointers for +// shared (3), const (4), and local (5) address spaces only. +// CHECK64-DEFAULT: target datalayout = "e-i64:64-i128:128-v16:16-v32:32-n16:32:64" +// CHECK64-SHORT: target datalayout = "e-p3:32:32-p4:32:32-p5:32:32-i64:64-i128:128-v16:16-v32:32-n16:32:64" diff --git a/clang/test/Driver/sycl-nvptx-short-ptr.cpp b/clang/test/Driver/sycl-nvptx-short-ptr.cpp new file mode 100644 index 0000000000000..e83ba5954d5cf --- /dev/null +++ b/clang/test/Driver/sycl-nvptx-short-ptr.cpp @@ -0,0 +1,14 @@ +// RUN: %clang -### -nocudalib \ +// RUN: -fsycl -fsycl-targets=nvptx64-nvidia-cuda %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-DEFAULT %s + +// RUN: %clang -### -nocudalib \ +// RUN: -fsycl -fsycl-targets=nvptx64-nvidia-cuda -fcuda-short-ptr %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SHORT %s + + +// CHECK-SHORT: "-mllvm" "--nvptx-short-ptr" +// CHECK-SHORT: "-fcuda-short-ptr" + +// CHECK-DEFAULT-NOT: "--nvptx-short-ptr" +// CHECK-DEFAULT-NOT: "-fcuda-short-ptr"