Skip to content

Commit 9778952

Browse files
authored
[Driver][SYCL] Allow for known aliases to be used for -fsycl-targets (#3984)
When using -fsycl-targets, usage is clumsy as we want the full triple to be used: spir64-unknown-unknown-sycldevice Allow for just the 'arch' to be specified, which will be expanded: spir64 -> spir64-unknown-unknown-sycldevice spir64_gen -> spir64_gen-unknown-unknown-sycldevice spir64_fpga -> spir64_fpga-unknown-unknown-sycldevice spir64_x86_64 -> spir64_x86_64-unknown-unknown-sycldevice
1 parent b21b3c3 commit 9778952

File tree

5 files changed

+49
-20
lines changed

5 files changed

+49
-20
lines changed

clang/lib/Driver/Driver.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
909909
if (SYCLTargetsValues) {
910910
if (SYCLTargetsValues->getNumValues()) {
911911
for (StringRef Val : SYCLTargetsValues->getValues()) {
912-
llvm::Triple TT(Val);
912+
llvm::Triple TT(MakeSYCLDeviceTriple(Val));
913913
if (!isValidSYCLTriple(TT)) {
914914
Diag(clang::diag::err_drv_invalid_sycl_target) << Val;
915915
continue;
@@ -1858,12 +1858,18 @@ void Driver::PrintHelp(bool ShowHidden) const {
18581858
}
18591859

18601860
llvm::Triple Driver::MakeSYCLDeviceTriple(StringRef TargetArch) const {
1861-
llvm::Triple TT;
1862-
TT.setArchName(TargetArch);
1863-
TT.setVendor(llvm::Triple::UnknownVendor);
1864-
TT.setOS(llvm::Triple::UnknownOS);
1865-
TT.setEnvironment(llvm::Triple::SYCLDevice);
1866-
return TT;
1861+
ArrayRef<StringRef> SYCLAlias = {"spir", "spir64", "spir64_fpga",
1862+
"spir64_x86_64", "spir64_gen"};
1863+
if (std::find(SYCLAlias.begin(), SYCLAlias.end(), TargetArch) !=
1864+
SYCLAlias.end()) {
1865+
llvm::Triple TT;
1866+
TT.setArchName(TargetArch);
1867+
TT.setVendor(llvm::Triple::UnknownVendor);
1868+
TT.setOS(llvm::Triple::UnknownOS);
1869+
TT.setEnvironment(llvm::Triple::SYCLDevice);
1870+
return TT;
1871+
}
1872+
return llvm::Triple(TargetArch);
18671873
}
18681874

18691875
// Print the help from any of the given tools which are used for AOT
@@ -4624,7 +4630,7 @@ class OffloadingActionBuilder final {
46244630
if (SYCLTargets) {
46254631
llvm::StringMap<StringRef> FoundNormalizedTriples;
46264632
for (const char *Val : SYCLTargets->getValues()) {
4627-
llvm::Triple TT(Val);
4633+
llvm::Triple TT(C.getDriver().MakeSYCLDeviceTriple(Val));
46284634
std::string NormalizedName = TT.normalize();
46294635

46304636
// Make sure we don't have a duplicate triple.

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ void SYCLToolChain::TranslateTargetOpt(const llvm::opt::ArgList &Args,
677677
OptNoTriple = A->getOption().matches(Opt);
678678
if (A->getOption().matches(Opt_EQ)) {
679679
// Passing device args: -X<Opt>=<triple> -opt=val.
680-
if (A->getValue() != getTripleString())
680+
if (getDriver().MakeSYCLDeviceTriple(A->getValue()) != getTriple())
681681
// Provided triple does not match current tool chain.
682682
continue;
683683
} else if (!OptNoTriple)

clang/test/Driver/sycl-offload.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,24 @@
9696

9797
/// Check no error for -fsycl-targets with good triple
9898
// RUN: %clang -### -fsycl-targets=spir-unknown-unknown-sycldevice -fsycl %s 2>&1 \
99-
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
99+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
100+
// RUN: %clang -### -fsycl-targets=spir64 -fsycl %s 2>&1 \
101+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
100102
// RUN: %clang -### -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fsycl %s 2>&1 \
101-
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
103+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
104+
// RUN: %clang -### -fsycl-targets=spir64_fpga -fsycl %s 2>&1 \
105+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
102106
// RUN: %clang -### -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -fsycl %s 2>&1 \
103-
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
107+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
108+
// RUN: %clang -### -fsycl-targets=spir64_x86_64 -fsycl %s 2>&1 \
109+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
104110
// RUN: %clang -### -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -fsycl %s 2>&1 \
105-
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
111+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
112+
// RUN: %clang -### -fsycl-targets=spir64_gen -fsycl %s 2>&1 \
113+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
106114
// RUN: %clang_cl -### -fsycl-targets=spir-unknown-unknown-sycldevice -fsycl %s 2>&1 \
107-
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
108-
// CHK-SYCL-FPGA-TRIPLE-NOT: error: SYCL target is invalid
115+
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
116+
// CHK-SYCL-TARGET-NOT: error: SYCL target is invalid
109117

110118
/// Check error for -fsycl-[add|link]-targets with bad triple
111119
// RUN: %clang -### -fsycl-add-targets=spir64_bad-unknown-unknown-sycldevice:dummy.spv -fsycl %s 2>&1 \
@@ -302,6 +310,8 @@
302310
// RUN: touch %t.o
303311
// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t.o 2>&1 \
304312
// RUN: | FileCheck -DINPUT=%t.o -check-prefix=CHK-UBACTIONS %s
313+
// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -o %t.out -lsomelib -fsycl-targets=spir64 %t.o 2>&1 \
314+
// RUN: | FileCheck -DINPUT=%t.o -check-prefix=CHK-UBACTIONS %s
305315
// RUN: mkdir -p %t_dir
306316
// RUN: touch %t_dir/dummy
307317
// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t_dir/dummy 2>&1 \
@@ -625,10 +635,16 @@
625635
/// Ahead of Time compilation for fpga, gen, cpu
626636
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s 2>&1 \
627637
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-FPGA
638+
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_fpga %s 2>&1 \
639+
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-FPGA
628640
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s 2>&1 \
629641
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN
642+
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_gen %s 2>&1 \
643+
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN
630644
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s 2>&1 \
631645
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU
646+
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64 %s 2>&1 \
647+
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU
632648
// CHK-PHASES-AOT: 0: input, "[[INPUT:.+\.c]]", c++, (host-sycl)
633649
// CHK-PHASES-AOT: 1: preprocessor, {0}, c++-cpp-output, (host-sycl)
634650
// CHK-PHASES-AOT: 2: append-footer, {1}, c++, (host-sycl)
@@ -804,6 +820,9 @@
804820
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice,spir64_gen-unknown-unknown-sycldevice \
805821
// RUN: -Xsycl-target-backend=spir64_gen-unknown-unknown-sycldevice "-device skl -cl-opt-disable" -Xsycl-target-linker=spir64-unknown-unknown-sycldevice "-cl-denorms-are-zero" %s 2>&1 \
806822
// RUN: | FileCheck -check-prefixes=CHK-TOOLS-MULT-OPTS,CHK-TOOLS-MULT-OPTS-NEG %s
823+
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64,spir64_gen \
824+
// RUN: -Xsycl-target-backend=spir64_gen "-device skl -cl-opt-disable" -Xsycl-target-linker=spir64 "-cl-denorms-are-zero" %s 2>&1 \
825+
// RUN: | FileCheck -check-prefixes=CHK-TOOLS-MULT-OPTS,CHK-TOOLS-MULT-OPTS-NEG %s
807826
// CHK-TOOLS-MULT-OPTS: clang-offload-wrapper{{.*}} "-link-opts=-cl-denorms-are-zero"{{.*}} "-target=spir64"
808827
// CHK-TOOLS-MULT-OPTS: ocloc{{.*}} "-device" "skl"{{.*}} "-cl-opt-disable"
809828
// CHK-TOOLS-MULT-OPTS-NEG-NOT: clang-offload-wrapper{{.*}} "-compile-opts=-device skl -cl-opt-disable"{{.*}} "-target=spir64"

sycl/doc/GetStartedGuide.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -525,19 +525,21 @@ clang++ -fsycl -fsycl-targets=amdgcn-amd-amdhsa-sycldevice \
525525
```
526526
527527
To build simple-sycl-app ahead of time for GPU, CPU or Accelerator devices,
528-
specify the target architecture:
528+
specify the target architecture. The examples provided use a supported
529+
alias for the target, representing a full triple. Additional details can
530+
be found in the [Users Manual](UsersManual.md#generic-options).
529531
530-
```-fsycl-targets=spir64_gen-unknown-unknown-sycldevice``` for GPU,
531-
```-fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice``` for CPU,
532-
```-fsycl-targets=spir64_fpga-unknown-unknown-sycldevice``` for Accelerator.
532+
```-fsycl-targets=spir64_gen``` for GPU,
533+
```-fsycl-targets=spir64_x86_64``` for CPU,
534+
```-fsycl-targets=spir64_fpga``` for Accelerator.
533535
534536
Multiple target architectures are supported.
535537
536538
E.g., this command builds simple-sycl-app for GPU and CPU devices in
537539
ahead of time mode:
538540
539541
```bash
540-
clang++ -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice,spir64_x86_64-unknown-unknown-sycldevice simple-sycl-app.cpp -o simple-sycl-app-aot.exe
542+
clang++ -fsycl -fsycl-targets=spir64_gen,spir64_x86_64 simple-sycl-app.cpp -o simple-sycl-app-aot.exe
541543
```
542544
543545
Additionally, user can pass specific options of AOT compiler to

sycl/doc/UsersManual.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ and not recommended to use in production environment.
3131
Intel FPGA;
3232
* spir64_gen-unknown-unknown-sycldevice - generate code ahead of time for
3333
Intel Processor Graphics;
34+
Shorter aliases of the above triples can also be used:
35+
* spir64, spir64_x86_64, spir64_fpga, spir64_gen
3436
Available in special build configuration:
3537
* nvptx64-nvidia-cuda-sycldevice - generate code ahead of time for CUDA
3638
target;

0 commit comments

Comments
 (0)