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