https://github.com/wenju-he updated 
https://github.com/llvm/llvm-project/pull/224506

>From f5d87ef6e00a7266be4e7a1e7d2a36ef32067c18 Mon Sep 17 00:00:00 2001
From: Wenju He <[email protected]>
Date: Fri, 18 Sep 2026 05:32:51 +0200
Subject: [PATCH 1/3] [clang-sycl-linker] Make AOT temp files land relative to
 cwd, not -o's dir

Derive the CodeGen/AOT Stem from -o's basename instead of its full
path. Previously the full path put .spv/.out in -o's directory while
.bc (via createTempFile's cwd-relative prefix) landed in cwd,
splitting a single run's -save-temps intermediates across two
locations. This aligns CodeGen/AOT with the cwd-relative convention
.bc already uses.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
---
 clang/test/OffloadTools/clang-sycl-linker/basic.ll | 8 ++++++++
 clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp  | 2 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/clang/test/OffloadTools/clang-sycl-linker/basic.ll 
b/clang/test/OffloadTools/clang-sycl-linker/basic.ll
index 00e3bba8d297e..09eced37fb894 100644
--- a/clang/test/OffloadTools/clang-sycl-linker/basic.ll
+++ b/clang/test/OffloadTools/clang-sycl-linker/basic.ll
@@ -135,6 +135,14 @@
 ; AOT-INTEL-CPU-NEXT: sycl-bundle: image kind: o, triple: spirv64, arch: 
graniterapids
 ; AOT-INTEL-CPU-NOT:  {{.+}}
 ;
+; Test that AOT temp file names ("<stem>_<index>.spv"/".out") are derived from
+; -o's basename only, not its full path, so they land in the current directory.
+; RUN: mkdir -p %t/outdir
+; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit 
-arch=bmg_g21 %t/input1.bc -o %t/outdir/nested.out 2>&1 \
+; RUN:   | FileCheck %s --check-prefix=AOT-STEM-BASENAME
+; AOT-STEM-BASENAME:      LLVM backend: input: {{.*}}.bc, output: nested_0.spv
+; AOT-STEM-BASENAME-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-output nested_0.out -file 
nested_0.spv
+;
 ; Check that the output file must be specified.
 ; RUN: not clang-sycl-linker --dry-run %t/input1.bc %t/input2.bc 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=NOOUTPUT
diff --git a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp 
b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
index 70afc6d6c4cea..a63c30b6262c3 100644
--- a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
+++ b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
@@ -985,7 +985,7 @@ static Error 
runSYCLLink(ArrayRef<std::unique_ptr<MemoryBuffer>> Inputs,
 
   // Code generation step.
   for (size_t I = 0, E = SplitModules.size(); I != E; ++I) {
-    StringRef Stem = OutputFile.rsplit('.').first;
+    StringRef Stem = sys::path::filename(OutputFile).rsplit('.').first;
     std::string CodeGenFile = (Stem + "_" + Twine(I) + 
OutputFileNameExt).str();
 
     if (Error Err = runCodeGen(SplitModules[I].ModuleFilePath,

>From 32e8db1af6dbb7945f1372998200f53b2b00ad52 Mon Sep 17 00:00:00 2001
From: Wenju He <[email protected]>
Date: Fri, 18 Sep 2026 06:49:37 +0200
Subject: [PATCH 2/3] [clang-sycl-linker] Give AOT/SPV temp files
 per-invocation uniqueness

Route the SPIR-V translation and AOT compile outputs through
createTempFile instead of building "<stem>_<index>.ext" directly, so
parallel invocations that share an output basename (but differ in
output directory) don't collide on the same cwd-relative intermediate
files. The --spirv-dump-device-code copy still uses the clean stem
name for readability.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
---
 .../OffloadTools/clang-sycl-linker/basic.ll   | 22 ++++++++++---------
 .../clang-sycl-linker/split-mode.ll           | 12 +++++-----
 .../clang-sycl-linker/ClangSYCLLinker.cpp     | 15 ++++++++++---
 3 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/clang/test/OffloadTools/clang-sycl-linker/basic.ll 
b/clang/test/OffloadTools/clang-sycl-linker/basic.ll
index 09eced37fb894..a9e62bbbd82bb 100644
--- a/clang/test/OffloadTools/clang-sycl-linker/basic.ll
+++ b/clang/test/OffloadTools/clang-sycl-linker/basic.ll
@@ -29,7 +29,7 @@
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit 
%t/input1.bc %t/input2.bc -o %t/spirv.out 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=SIMPLE-FO
 ; SIMPLE-FO:      link: inputs: {{.*}}.bc, {{.*}}.bc output: 
[[LLVMLINKOUT:.*]].bc
-; SIMPLE-FO-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: {{.*}}_0.spv
+; SIMPLE-FO-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
{{.*}}_0{{.*}}.spv
 ; SIMPLE-FO-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SIMPLE-FO-NOT:  {{.+}}
 ;
@@ -41,7 +41,7 @@
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit 
%t/input1.bc %t/input2.bc --library-path=%t/libs --whole-archive -l device -o 
/dev/null 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=DEVLIBS
 ; DEVLIBS:      link: inputs: {{.*}}.bc, {{.*}}.bc, 
{{.*}}libdevice.a(lib1.bc), {{.*}}libdevice.a(lib2.bc) output: 
[[LLVMLINKOUT:.*]].bc
-; DEVLIBS-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: {{.*}}_0.spv
+; DEVLIBS-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
{{.*}}_0{{.*}}.spv
 ; DEVLIBS-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; DEVLIBS-NOT:  {{.+}}
 ;
@@ -113,8 +113,8 @@
 ; RUN:     --ocloc-options="-a -b" \
 ; RUN:   | FileCheck %s --check-prefix=AOT-INTEL-GPU
 ; AOT-INTEL-GPU:      link: inputs: {{.*}}.bc, {{.*}}.bc output: 
[[LLVMLINKOUT:.*]].bc
-; AOT-INTEL-GPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[SPIRVTRANSLATIONOUT:.*]]_0.spv
-; AOT-INTEL-GPU-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-device bmg_g21 -a -b 
{{.*}}-output [[SPIRVTRANSLATIONOUT]]_0.out -file [[SPIRVTRANSLATIONOUT]]_0.spv
+; AOT-INTEL-GPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[SPIRVTRANSLATIONOUT:.*]]_0{{.*}}.spv
+; AOT-INTEL-GPU-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-device bmg_g21 -a -b 
{{.*}}-output [[SPIRVTRANSLATIONOUT]]_0{{.*}}.out -file 
[[SPIRVTRANSLATIONOUT]]_0{{.*}}.spv
 ; AOT-INTEL-GPU-NEXT: sycl-bundle: image kind: o, triple: spirv64, arch: 
bmg_g21
 ; AOT-INTEL-GPU-NOT:  {{.+}}
 ;
@@ -130,18 +130,20 @@
 ; RUN:     --opencl-aot-options="-a -b" \
 ; RUN:   | FileCheck %s --check-prefix=AOT-INTEL-CPU
 ; AOT-INTEL-CPU:      link: inputs: {{.*}}.bc, {{.*}}.bc output: 
[[LLVMLINKOUT:.*]].bc
-; AOT-INTEL-CPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[SPIRVTRANSLATIONOUT:.*]]_0.spv
-; AOT-INTEL-CPU-NEXT: "{{.*}}opencl-aot{{.*}}" {{.*}}--device=cpu -a -b 
{{.*}}-o [[SPIRVTRANSLATIONOUT]]_0.out [[SPIRVTRANSLATIONOUT]]_0.spv
+; AOT-INTEL-CPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[SPIRVTRANSLATIONOUT:.*]]_0{{.*}}.spv
+; AOT-INTEL-CPU-NEXT: "{{.*}}opencl-aot{{.*}}" {{.*}}--device=cpu -a -b 
{{.*}}-o [[SPIRVTRANSLATIONOUT]]_0{{.*}}.out [[SPIRVTRANSLATIONOUT]]_0{{.*}}.spv
 ; AOT-INTEL-CPU-NEXT: sycl-bundle: image kind: o, triple: spirv64, arch: 
graniterapids
 ; AOT-INTEL-CPU-NOT:  {{.+}}
 ;
-; Test that AOT temp file names ("<stem>_<index>.spv"/".out") are derived from
-; -o's basename only, not its full path, so they land in the current directory.
+; Test that AOT temp file names ("<stem>_<index>-<unique>.spv"/".out") are
+; derived from -o's basename only, not its full path, so they land in the
+; current directory (with a unique suffix to avoid collisions between
+; concurrent invocations sharing an output basename).
 ; RUN: mkdir -p %t/outdir
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit 
-arch=bmg_g21 %t/input1.bc -o %t/outdir/nested.out 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=AOT-STEM-BASENAME
-; AOT-STEM-BASENAME:      LLVM backend: input: {{.*}}.bc, output: nested_0.spv
-; AOT-STEM-BASENAME-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-output nested_0.out -file 
nested_0.spv
+; AOT-STEM-BASENAME:      LLVM backend: input: {{.*}}.bc, output: 
[[STEM:nested_0]]{{.*}}.spv
+; AOT-STEM-BASENAME-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-output [[STEM]]{{.*}}.out 
-file [[STEM]]{{.*}}.spv
 ;
 ; Check that the output file must be specified.
 ; RUN: not clang-sycl-linker --dry-run %t/input1.bc %t/input2.bc 2>&1 \
diff --git a/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll 
b/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll
index 6aa05fa9b8a50..f3af0e53fd3d5 100644
--- a/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll
+++ b/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll
@@ -13,7 +13,7 @@
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit %t.bc -o 
%t-none.out 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=SPLIT-NONE
 ; SPLIT-NONE:      link: inputs: {{.*}}.bc output: [[LLVMLINKOUT:.*]].bc
-; SPLIT-NONE-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
{{.*}}_0.spv
+; SPLIT-NONE-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
{{.*}}_0{{.*}}.spv
 ; SPLIT-NONE-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-NONE-NOT:  {{.+}}
 ;
@@ -25,9 +25,9 @@
 ; SPLIT-KERNEL-NEXT: [[SPLIT0:.*]].bc [kernel_c ]
 ; SPLIT-KERNEL-NEXT: [[SPLIT1:.*]].bc [kernel_b ]
 ; SPLIT-KERNEL-NEXT: [[SPLIT2:.*]].bc [kernel_a ]
-; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT0]].bc, output: {{.*}}_0.spv
-; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT1]].bc, output: {{.*}}_1.spv
-; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT2]].bc, output: {{.*}}_2.spv
+; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT0]].bc, output: 
{{.*}}_0{{.*}}.spv
+; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT1]].bc, output: 
{{.*}}_1{{.*}}.spv
+; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT2]].bc, output: 
{{.*}}_2{{.*}}.spv
 ; SPLIT-KERNEL-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-KERNEL-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-KERNEL-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
@@ -47,8 +47,8 @@
 ; SPLIT-SRC-NEXT: sycl-module-split: input: [[LLVMLINKOUT]].bc, mode: 
translation_unit
 ; SPLIT-SRC-NEXT: [[S0:.*]].bc [kernel_b kernel_c ]
 ; SPLIT-SRC-NEXT: [[S1:.*]].bc [kernel_a ]
-; SPLIT-SRC-NEXT: LLVM backend: input: [[S0]].bc, output: {{.*}}_0.spv
-; SPLIT-SRC-NEXT: LLVM backend: input: [[S1]].bc, output: {{.*}}_1.spv
+; SPLIT-SRC-NEXT: LLVM backend: input: [[S0]].bc, output: {{.*}}_0{{.*}}.spv
+; SPLIT-SRC-NEXT: LLVM backend: input: [[S1]].bc, output: {{.*}}_1{{.*}}.spv
 ; SPLIT-SRC-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-SRC-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-SRC-NOT:  {{.+}}
diff --git a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp 
b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
index a63c30b6262c3..8604c3c26d98c 100644
--- a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
+++ b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
@@ -986,7 +986,13 @@ static Error 
runSYCLLink(ArrayRef<std::unique_ptr<MemoryBuffer>> Inputs,
   // Code generation step.
   for (size_t I = 0, E = SplitModules.size(); I != E; ++I) {
     StringRef Stem = sys::path::filename(OutputFile).rsplit('.').first;
-    std::string CodeGenFile = (Stem + "_" + Twine(I) + 
OutputFileNameExt).str();
+    SmallString<64> Prefix;
+    (Stem + "_" + Twine(I)).toVector(Prefix);
+    auto CodeGenFileOrErr =
+        createTempFile(Args, Prefix, OutputFileNameExt.drop_front());
+    if (!CodeGenFileOrErr)
+      return CodeGenFileOrErr.takeError();
+    StringRef CodeGenFile = *CodeGenFileOrErr;
 
     if (Error Err = runCodeGen(SplitModules[I].ModuleFilePath,
                                Result.TargetTriple, Args, CodeGenFile, C))
@@ -994,14 +1000,17 @@ static Error 
runSYCLLink(ArrayRef<std::unique_ptr<MemoryBuffer>> Inputs,
 
     if (!SPIRVDumpDir.empty() && !DryRun) {
       SmallString<128> DumpFile(SPIRVDumpDir);
-      sys::path::append(DumpFile, sys::path::filename(CodeGenFile));
+      sys::path::append(DumpFile, Twine(Prefix) + OutputFileNameExt);
       if (std::error_code EC = sys::fs::copy_file(CodeGenFile, DumpFile))
         return createFileError(DumpFile, EC);
     }
 
     SplitModules[I].ModuleFilePath = CodeGenFile;
     if (IsAOTCompileNeeded) {
-      std::string AOTFile = (Stem + "_" + Twine(I) + ".out").str();
+      auto AOTFileOrErr = createTempFile(Args, Prefix, "out");
+      if (!AOTFileOrErr)
+        return AOTFileOrErr.takeError();
+      StringRef AOTFile = *AOTFileOrErr;
       if (Error Err = runAOTCompile(CodeGenFile, AOTFile, Args))
         return Err;
       SplitModules[I].ModuleFilePath = AOTFile;

>From a5e80e11bd8eb75bd1f56e1117ca5de3a7b9b3ec Mon Sep 17 00:00:00 2001
From: Wenju He <[email protected]>
Date: Sat, 19 Sep 2026 07:38:42 +0200
Subject: [PATCH 3/3] [clang-sycl-linker] Drop redundant per-split index from
 temp file names

The random suffix createTempFile() already adds makes the "_<index>"
prefix unnecessary for CodeGen/AOT temp files, so drop it there. Keep
it for --spirv-dump-device-code output, which has no random suffix and
still needs the index to avoid one split's dump overwriting another's.
Also rm -rf a reused %t/outdir test directory before recreating it.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
---
 .../OffloadTools/clang-sycl-linker/basic.ll   | 20 +++++++++----------
 .../clang-sycl-linker/split-mode.ll           | 12 +++++------
 .../clang-sycl-linker/ClangSYCLLinker.cpp     | 13 ++++++------
 3 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/clang/test/OffloadTools/clang-sycl-linker/basic.ll 
b/clang/test/OffloadTools/clang-sycl-linker/basic.ll
index a9e62bbbd82bb..8db9c797d860c 100644
--- a/clang/test/OffloadTools/clang-sycl-linker/basic.ll
+++ b/clang/test/OffloadTools/clang-sycl-linker/basic.ll
@@ -29,7 +29,7 @@
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit 
%t/input1.bc %t/input2.bc -o %t/spirv.out 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=SIMPLE-FO
 ; SIMPLE-FO:      link: inputs: {{.*}}.bc, {{.*}}.bc output: 
[[LLVMLINKOUT:.*]].bc
-; SIMPLE-FO-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
{{.*}}_0{{.*}}.spv
+; SIMPLE-FO-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: {{.*}}.spv
 ; SIMPLE-FO-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SIMPLE-FO-NOT:  {{.+}}
 ;
@@ -41,7 +41,7 @@
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit 
%t/input1.bc %t/input2.bc --library-path=%t/libs --whole-archive -l device -o 
/dev/null 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=DEVLIBS
 ; DEVLIBS:      link: inputs: {{.*}}.bc, {{.*}}.bc, 
{{.*}}libdevice.a(lib1.bc), {{.*}}libdevice.a(lib2.bc) output: 
[[LLVMLINKOUT:.*]].bc
-; DEVLIBS-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
{{.*}}_0{{.*}}.spv
+; DEVLIBS-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: {{.*}}.spv
 ; DEVLIBS-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; DEVLIBS-NOT:  {{.+}}
 ;
@@ -113,8 +113,8 @@
 ; RUN:     --ocloc-options="-a -b" \
 ; RUN:   | FileCheck %s --check-prefix=AOT-INTEL-GPU
 ; AOT-INTEL-GPU:      link: inputs: {{.*}}.bc, {{.*}}.bc output: 
[[LLVMLINKOUT:.*]].bc
-; AOT-INTEL-GPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[SPIRVTRANSLATIONOUT:.*]]_0{{.*}}.spv
-; AOT-INTEL-GPU-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-device bmg_g21 -a -b 
{{.*}}-output [[SPIRVTRANSLATIONOUT]]_0{{.*}}.out -file 
[[SPIRVTRANSLATIONOUT]]_0{{.*}}.spv
+; AOT-INTEL-GPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[STEM:.*]]-{{[0-9a-f]+}}.spv
+; AOT-INTEL-GPU-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-device bmg_g21 -a -b 
{{.*}}-output [[STEM]]-{{[0-9a-f]+}}.out -file [[STEM]]-{{[0-9a-f]+}}.spv
 ; AOT-INTEL-GPU-NEXT: sycl-bundle: image kind: o, triple: spirv64, arch: 
bmg_g21
 ; AOT-INTEL-GPU-NOT:  {{.+}}
 ;
@@ -130,19 +130,19 @@
 ; RUN:     --opencl-aot-options="-a -b" \
 ; RUN:   | FileCheck %s --check-prefix=AOT-INTEL-CPU
 ; AOT-INTEL-CPU:      link: inputs: {{.*}}.bc, {{.*}}.bc output: 
[[LLVMLINKOUT:.*]].bc
-; AOT-INTEL-CPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[SPIRVTRANSLATIONOUT:.*]]_0{{.*}}.spv
-; AOT-INTEL-CPU-NEXT: "{{.*}}opencl-aot{{.*}}" {{.*}}--device=cpu -a -b 
{{.*}}-o [[SPIRVTRANSLATIONOUT]]_0{{.*}}.out [[SPIRVTRANSLATIONOUT]]_0{{.*}}.spv
+; AOT-INTEL-CPU-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
[[STEM:.*]]-{{[0-9a-f]+}}.spv
+; AOT-INTEL-CPU-NEXT: "{{.*}}opencl-aot{{.*}}" {{.*}}--device=cpu -a -b 
{{.*}}-o [[STEM]]-{{[0-9a-f]+}}.out [[STEM]]-{{[0-9a-f]+}}.spv
 ; AOT-INTEL-CPU-NEXT: sycl-bundle: image kind: o, triple: spirv64, arch: 
graniterapids
 ; AOT-INTEL-CPU-NOT:  {{.+}}
 ;
-; Test that AOT temp file names ("<stem>_<index>-<unique>.spv"/".out") are
-; derived from -o's basename only, not its full path, so they land in the
+; Test that AOT temp file names ("<stem>-<unique>.spv"/"<stem>-<unique>.out")
+; are derived from -o's basename only, not its full path, so they land in the
 ; current directory (with a unique suffix to avoid collisions between
 ; concurrent invocations sharing an output basename).
-; RUN: mkdir -p %t/outdir
+; RUN: rm -rf %t/outdir && mkdir -p %t/outdir
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit 
-arch=bmg_g21 %t/input1.bc -o %t/outdir/nested.out 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=AOT-STEM-BASENAME
-; AOT-STEM-BASENAME:      LLVM backend: input: {{.*}}.bc, output: 
[[STEM:nested_0]]{{.*}}.spv
+; AOT-STEM-BASENAME:      LLVM backend: input: {{.*}}.bc, output: 
[[STEM:nested]]{{.*}}.spv
 ; AOT-STEM-BASENAME-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-output [[STEM]]{{.*}}.out 
-file [[STEM]]{{.*}}.spv
 ;
 ; Check that the output file must be specified.
diff --git a/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll 
b/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll
index f3af0e53fd3d5..7bc227aafc007 100644
--- a/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll
+++ b/clang/test/OffloadTools/clang-sycl-linker/split-mode.ll
@@ -13,7 +13,7 @@
 ; RUN: clang-sycl-linker --dry-run -v --module-split-mode=link_unit %t.bc -o 
%t-none.out 2>&1 \
 ; RUN:   | FileCheck %s --check-prefix=SPLIT-NONE
 ; SPLIT-NONE:      link: inputs: {{.*}}.bc output: [[LLVMLINKOUT:.*]].bc
-; SPLIT-NONE-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: 
{{.*}}_0{{.*}}.spv
+; SPLIT-NONE-NEXT: LLVM backend: input: [[LLVMLINKOUT]].bc, output: {{.*}}.spv
 ; SPLIT-NONE-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-NONE-NOT:  {{.+}}
 ;
@@ -25,9 +25,9 @@
 ; SPLIT-KERNEL-NEXT: [[SPLIT0:.*]].bc [kernel_c ]
 ; SPLIT-KERNEL-NEXT: [[SPLIT1:.*]].bc [kernel_b ]
 ; SPLIT-KERNEL-NEXT: [[SPLIT2:.*]].bc [kernel_a ]
-; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT0]].bc, output: 
{{.*}}_0{{.*}}.spv
-; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT1]].bc, output: 
{{.*}}_1{{.*}}.spv
-; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT2]].bc, output: 
{{.*}}_2{{.*}}.spv
+; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT0]].bc, output: {{.*}}.spv
+; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT1]].bc, output: {{.*}}.spv
+; SPLIT-KERNEL-NEXT: LLVM backend: input: [[SPLIT2]].bc, output: {{.*}}.spv
 ; SPLIT-KERNEL-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-KERNEL-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-KERNEL-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
@@ -47,8 +47,8 @@
 ; SPLIT-SRC-NEXT: sycl-module-split: input: [[LLVMLINKOUT]].bc, mode: 
translation_unit
 ; SPLIT-SRC-NEXT: [[S0:.*]].bc [kernel_b kernel_c ]
 ; SPLIT-SRC-NEXT: [[S1:.*]].bc [kernel_a ]
-; SPLIT-SRC-NEXT: LLVM backend: input: [[S0]].bc, output: {{.*}}_0{{.*}}.spv
-; SPLIT-SRC-NEXT: LLVM backend: input: [[S1]].bc, output: {{.*}}_1{{.*}}.spv
+; SPLIT-SRC-NEXT: LLVM backend: input: [[S0]].bc, output: {{.*}}.spv
+; SPLIT-SRC-NEXT: LLVM backend: input: [[S1]].bc, output: {{.*}}.spv
 ; SPLIT-SRC-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-SRC-NEXT: sycl-bundle: image kind: spv, triple: spirv64, arch: {{$}}
 ; SPLIT-SRC-NOT:  {{.+}}
diff --git a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp 
b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
index 8604c3c26d98c..7cfe6200783ef 100644
--- a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
+++ b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
@@ -984,12 +984,10 @@ static Error 
runSYCLLink(ArrayRef<std::unique_ptr<MemoryBuffer>> Inputs,
   StringRef OutputFileNameExt = ".spv";
 
   // Code generation step.
+  StringRef Stem = sys::path::filename(OutputFile).rsplit('.').first;
   for (size_t I = 0, E = SplitModules.size(); I != E; ++I) {
-    StringRef Stem = sys::path::filename(OutputFile).rsplit('.').first;
-    SmallString<64> Prefix;
-    (Stem + "_" + Twine(I)).toVector(Prefix);
     auto CodeGenFileOrErr =
-        createTempFile(Args, Prefix, OutputFileNameExt.drop_front());
+        createTempFile(Args, Stem, OutputFileNameExt.drop_front());
     if (!CodeGenFileOrErr)
       return CodeGenFileOrErr.takeError();
     StringRef CodeGenFile = *CodeGenFileOrErr;
@@ -999,15 +997,18 @@ static Error 
runSYCLLink(ArrayRef<std::unique_ptr<MemoryBuffer>> Inputs,
       return Err;
 
     if (!SPIRVDumpDir.empty() && !DryRun) {
+      // The dumped file doesn't get the unique suffix that createTempFile()
+      // adds, so index it explicitly to avoid one split's dump overwriting
+      // another's.
       SmallString<128> DumpFile(SPIRVDumpDir);
-      sys::path::append(DumpFile, Twine(Prefix) + OutputFileNameExt);
+      sys::path::append(DumpFile, Stem + "_" + Twine(I) + OutputFileNameExt);
       if (std::error_code EC = sys::fs::copy_file(CodeGenFile, DumpFile))
         return createFileError(DumpFile, EC);
     }
 
     SplitModules[I].ModuleFilePath = CodeGenFile;
     if (IsAOTCompileNeeded) {
-      auto AOTFileOrErr = createTempFile(Args, Prefix, "out");
+      auto AOTFileOrErr = createTempFile(Args, Stem, "out");
       if (!AOTFileOrErr)
         return AOTFileOrErr.takeError();
       StringRef AOTFile = *AOTFileOrErr;

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

Reply via email to