Author: Fangrui Song
Date: 2023-07-20T21:17:04-07:00
New Revision: 99b2a1143f932c2da8395a69072f177f596547b2

URL: 
https://github.com/llvm/llvm-project/commit/99b2a1143f932c2da8395a69072f177f596547b2
DIFF: 
https://github.com/llvm/llvm-project/commit/99b2a1143f932c2da8395a69072f177f596547b2.diff

LOG: [Driver] -fopenmp-targets=: stabilize OrderedOffloadingToolchains value 
order

to make actions deterministic.
StringSet iteration order is not guaranteed to be deterministic
(https://llvm.org/docs/ProgrammersManual.html#llvm-adt-stringmap-h).

Added: 
    

Modified: 
    clang/lib/Driver/Driver.cpp
    clang/test/Driver/openmp-offload-gpu.c
    clang/test/Driver/openmp-offload.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index fc52f47df00b5d..488350169efa49 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -70,7 +70,6 @@
 #include "clang/Driver/Types.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSet.h"
@@ -100,6 +99,7 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <set>
 #include <utility>
 #if LLVM_ON_UNIX
 #include <unistd.h> // getpid
@@ -858,7 +858,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation 
&C,
 
     llvm::StringMap<llvm::DenseSet<StringRef>> DerivedArchs;
     llvm::StringMap<StringRef> FoundNormalizedTriples;
-    llvm::SmallVector<StringRef, 4> OpenMPTriples;
+    std::multiset<StringRef> OpenMPTriples;
 
     // If the user specified -fopenmp-targets= we create a toolchain for each
     // valid triple. Otherwise, if only --offload-arch= was specified we 
instead
@@ -870,7 +870,8 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation 
&C,
             << OpenMPTargets->getAsString(C.getInputArgs());
         return;
       }
-      llvm::copy(OpenMPTargets->getValues(), 
std::back_inserter(OpenMPTriples));
+      for (StringRef T : OpenMPTargets->getValues())
+        OpenMPTriples.insert(T);
     } else if (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ) &&
                !IsHIP && !IsCuda) {
       const ToolChain *HostTC = 
C.getSingleOffloadToolChain<Action::OFK_Host>();
@@ -925,7 +926,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation 
&C,
       }
 
       for (const auto &TripleAndArchs : DerivedArchs)
-        OpenMPTriples.push_back(TripleAndArchs.first());
+        OpenMPTriples.insert(TripleAndArchs.first());
     }
 
     for (StringRef Val : OpenMPTriples) {

diff  --git a/clang/test/Driver/openmp-offload-gpu.c 
b/clang/test/Driver/openmp-offload-gpu.c
index e89d2099c01a8d..6bb10029b8ba5d 100644
--- a/clang/test/Driver/openmp-offload-gpu.c
+++ b/clang/test/Driver/openmp-offload-gpu.c
@@ -292,10 +292,10 @@
 // RUN:     -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-NVIDIA-AMDGPU
 
 // CHECK-NVIDIA-AMDGPU: "x86_64-unknown-linux-gnu" - "clang", inputs: 
["[[INPUT:.+]]"], output: "[[HOST_BC:.+]]"
+// CHECK-NVIDIA-AMDGPU: "amdgcn-amd-amdhsa" - "clang", inputs: ["[[INPUT]]", 
"[[HOST_BC]]"], output: "[[AMD_BC:.+]]"
 // CHECK-NVIDIA-AMDGPU: "nvptx64-nvidia-cuda" - "clang", inputs: ["[[INPUT]]", 
"[[HOST_BC]]"], output: "[[NVIDIA_PTX:.+]]"
 // CHECK-NVIDIA-AMDGPU: "nvptx64-nvidia-cuda" - "NVPTX::Assembler", inputs: 
["[[NVIDIA_PTX]]"], output: "[[NVIDIA_CUBIN:.+]]"
-// CHECK-NVIDIA-AMDGPU: "amdgcn-amd-amdhsa" - "clang", inputs: ["[[INPUT]]", 
"[[HOST_BC]]"], output: "[[AMD_BC:.+]]"
-// CHECK-NVIDIA-AMDGPU: "x86_64-unknown-linux-gnu" - "Offload::Packager", 
inputs: ["[[NVIDIA_CUBIN]]", "[[AMD_BC]]"], output: "[[BINARY:.*]]"
+// CHECK-NVIDIA-AMDGPU: "x86_64-unknown-linux-gnu" - "Offload::Packager", 
inputs: ["[[AMD_BC]]", "[[NVIDIA_CUBIN]]"], output: "[[BINARY:.*]]"
 // CHECK-NVIDIA-AMDGPU: "x86_64-unknown-linux-gnu" - "clang", inputs: 
["[[HOST_BC]]", "[[BINARY]]"], output: "[[HOST_OBJ:.+]]"
 // CHECK-NVIDIA-AMDGPU: "x86_64-unknown-linux-gnu" - "Offload::Linker", 
inputs: ["[[HOST_OBJ]]"], output: "a.out"
 

diff  --git a/clang/test/Driver/openmp-offload.c 
b/clang/test/Driver/openmp-offload.c
index 25ef25b7b32d53..9626c976d2c81c 100644
--- a/clang/test/Driver/openmp-offload.c
+++ b/clang/test/Driver/openmp-offload.c
@@ -128,17 +128,17 @@
 // CHK-PHASES-FILES-NEXT: 4: input, "[[INPUT]]", c, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 5: preprocessor, {4}, cpp-output, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 6: compiler, {5}, ir, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 7: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{3}, "device-openmp (x86_64-pc-linux-gnu)" {6}, ir
+// CHK-PHASES-FILES-NEXT: 7: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{3}, "device-openmp (powerpc64-ibm-linux-gnu)" {6}, ir
 // CHK-PHASES-FILES-NEXT: 8: backend, {7}, assembler, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 9: assembler, {8}, object, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 10: offload, "device-openmp (x86_64-pc-linux-gnu)" 
{9}, object
+// CHK-PHASES-FILES-NEXT: 10: offload, "device-openmp 
(powerpc64-ibm-linux-gnu)" {9}, object
 // CHK-PHASES-FILES-NEXT: 11: input, "[[INPUT]]", c, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 12: preprocessor, {11}, cpp-output, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 13: compiler, {12}, ir, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 14: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{3}, "device-openmp (powerpc64-ibm-linux-gnu)" {13}, ir
+// CHK-PHASES-FILES-NEXT: 14: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{3}, "device-openmp (x86_64-pc-linux-gnu)" {13}, ir
 // CHK-PHASES-FILES-NEXT: 15: backend, {14}, assembler, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 16: assembler, {15}, object, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 17: offload, "device-openmp 
(powerpc64-ibm-linux-gnu)" {16}, object
+// CHK-PHASES-FILES-NEXT: 17: offload, "device-openmp (x86_64-pc-linux-gnu)" 
{16}, object
 // CHK-PHASES-FILES-NEXT: 18: clang-offload-packager, {10, 17}, image, 
(device-openmp)
 // CHK-PHASES-FILES-NEXT: 19: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{3}, "device-openmp (powerpc64-ibm-linux-gnu)" {18}, ir
 // CHK-PHASES-FILES-NEXT: 20: backend, {19}, assembler, (host-openmp)
@@ -149,17 +149,17 @@
 // CHK-PHASES-FILES-NEXT: 25: input, "[[INPUT]]", c, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 26: preprocessor, {25}, cpp-output, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 27: compiler, {26}, ir, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 28: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{24}, "device-openmp (x86_64-pc-linux-gnu)" {27}, ir
+// CHK-PHASES-FILES-NEXT: 28: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{24}, "device-openmp (powerpc64-ibm-linux-gnu)" {27}, ir
 // CHK-PHASES-FILES-NEXT: 29: backend, {28}, assembler, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 30: assembler, {29}, object, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 31: offload, "device-openmp (x86_64-pc-linux-gnu)" 
{30}, object
+// CHK-PHASES-FILES-NEXT: 31: offload, "device-openmp 
(powerpc64-ibm-linux-gnu)" {30}, object
 // CHK-PHASES-FILES-NEXT: 32: input, "[[INPUT]]", c, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 33: preprocessor, {32}, cpp-output, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 34: compiler, {33}, ir, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 35: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{24}, "device-openmp (powerpc64-ibm-linux-gnu)" {34}, ir
+// CHK-PHASES-FILES-NEXT: 35: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{24}, "device-openmp (x86_64-pc-linux-gnu)" {34}, ir
 // CHK-PHASES-FILES-NEXT: 36: backend, {35}, assembler, (device-openmp)
 // CHK-PHASES-FILES-NEXT: 37: assembler, {36}, object, (device-openmp)
-// CHK-PHASES-FILES-NEXT: 38: offload, "device-openmp 
(powerpc64-ibm-linux-gnu)" {37}, object
+// CHK-PHASES-FILES-NEXT: 38: offload, "device-openmp (x86_64-pc-linux-gnu)" 
{37}, object
 // CHK-PHASES-FILES-NEXT: 39: clang-offload-packager, {31, 38}, image, 
(device-openmp)
 // CHK-PHASES-FILES-NEXT: 40: offload, "host-openmp (powerpc64-ibm-linux-gnu)" 
{24}, "device-openmp (powerpc64-ibm-linux-gnu)" {39}, ir
 // CHK-PHASES-FILES-NEXT: 41: backend, {40}, assembler, (host-openmp)


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to