[clang] bb957a8 - [CUDA] Make the new driver properly ignore non-CUDA inputs

Joseph Huber via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 15 14:38:45 PDT 2022


Author: Joseph Huber
Date: 2022-07-15T17:38:34-04:00
New Revision: bb957a8d524cd38d6c5f7d547302258026049438

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

LOG: [CUDA] Make the new driver properly ignore non-CUDA inputs

The new driver generated offloadinga actions for each active toolchain.
However, for CUDA and HIP it is possible for the toolchain to be active
but one of the files is not a valid input. This can occur if the user
compiles both a CUDA and C source file in the same compiler invocation.
This patch adds some simple logic to quit if the input is not valid as
well.

Reviewed By: tra, MaskRay

Differential Revision: https://reviews.llvm.org/D129885

Added: 
    

Modified: 
    clang/lib/Driver/Driver.cpp
    clang/test/Driver/cuda-phases.cu

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 3a8400a557416..bd2b9a5b39b39 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4432,6 +4432,11 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
     types::ID InputType = Input.first;
     const Arg *InputArg = Input.second;
 
+    // The toolchain can be active for unsupported file types.
+    if ((Kind == Action::OFK_Cuda && !types::isCuda(InputType)) ||
+        (Kind == Action::OFK_HIP && !types::isHIP(InputType)))
+      continue;
+
     // Get the product of all bound architectures and toolchains.
     SmallVector<std::pair<const ToolChain *, StringRef>> TCAndArchs;
     for (const ToolChain *TC : ToolChains)
@@ -4486,6 +4491,9 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
   if (offloadDeviceOnly())
     return C.MakeAction<OffloadAction>(DDeps, types::TY_Nothing);
 
+  if (OffloadActions.empty())
+    return HostAction;
+
   OffloadAction::DeviceDependences DDep;
   if (C.isOffloadingHostKind(Action::OFK_Cuda) &&
       !Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, false)) {

diff  --git a/clang/test/Driver/cuda-phases.cu b/clang/test/Driver/cuda-phases.cu
index dc469f1bf168a..4e0c66aefab5b 100644
--- a/clang/test/Driver/cuda-phases.cu
+++ b/clang/test/Driver/cuda-phases.cu
@@ -221,48 +221,76 @@
 //
 // Test the phases generated when using the new offloading driver.
 //
-// RUN: %clang -### -target powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver -fgpu-rdc \
-// RUN: --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER-RDC %s
-// NEW-DRIVER-RDC: 0: input, "[[INPUT:.+]]", cuda
-// NEW-DRIVER-RDC: 1: preprocessor, {0}, cuda-cpp-output
-// NEW-DRIVER-RDC: 2: compiler, {1}, ir
-// NEW-DRIVER-RDC: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
-// NEW-DRIVER-RDC: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
-// NEW-DRIVER-RDC: 5: compiler, {4}, ir, (device-cuda, sm_52)
-// NEW-DRIVER-RDC: 6: backend, {5}, assembler, (device-cuda, sm_52)
-// NEW-DRIVER-RDC: 7: assembler, {6}, object, (device-cuda, sm_52)
-// NEW-DRIVER-RDC: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
-// NEW-DRIVER-RDC: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
-// NEW-DRIVER-RDC: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
-// NEW-DRIVER-RDC: 11: compiler, {10}, ir, (device-cuda, sm_70)
-// NEW-DRIVER-RDC: 12: backend, {11}, assembler, (device-cuda, sm_70)
-// NEW-DRIVER-RDC: 13: assembler, {12}, object, (device-cuda, sm_70)
-// NEW-DRIVER-RDC: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
-// NEW-DRIVER-RDC: 15: clang-offload-packager, {8, 14}, image
-// NEW-DRIVER-RDC: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
-// NEW-DRIVER-RDC: 17: backend, {16}, assembler, (host-cuda)
-// NEW-DRIVER-RDC: 18: assembler, {17}, object, (host-cuda)
-// NEW-DRIVER-RDC: 19: clang-linker-wrapper, {18}, image, (host-cuda)
+// RUN: %clang -### --target=powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver -fgpu-rdc \
+// RUN:   --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER-RDC %s
+//      NEW-DRIVER-RDC: 0: input, "[[INPUT:.+]]", cuda
+// NEW-DRIVER-RDC-NEXT: 1: preprocessor, {0}, cuda-cpp-output
+// NEW-DRIVER-RDC-NEXT: 2: compiler, {1}, ir
+// NEW-DRIVER-RDC-NEXT: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
+// NEW-DRIVER-RDC-NEXT: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
+// NEW-DRIVER-RDC-NEXT: 5: compiler, {4}, ir, (device-cuda, sm_52)
+// NEW-DRIVER-RDC-NEXT: 6: backend, {5}, assembler, (device-cuda, sm_52)
+// NEW-DRIVER-RDC-NEXT: 7: assembler, {6}, object, (device-cuda, sm_52)
+// NEW-DRIVER-RDC-NEXT: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
+// NEW-DRIVER-RDC-NEXT: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
+// NEW-DRIVER-RDC-NEXT: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
+// NEW-DRIVER-RDC-NEXT: 11: compiler, {10}, ir, (device-cuda, sm_70)
+// NEW-DRIVER-RDC-NEXT: 12: backend, {11}, assembler, (device-cuda, sm_70)
+// NEW-DRIVER-RDC-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70)
+// NEW-DRIVER-RDC-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
+// NEW-DRIVER-RDC-NEXT: 15: clang-offload-packager, {8, 14}, image
+// NEW-DRIVER-RDC-NEXT: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
+// NEW-DRIVER-RDC-NEXT: 17: backend, {16}, assembler, (host-cuda)
+// NEW-DRIVER-RDC-NEXT: 18: assembler, {17}, object, (host-cuda)
+// NEW-DRIVER-RDC-NEXT: 19: clang-linker-wrapper, {18}, image, (host-cuda)
 
 // RUN: %clang -### -target powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver -fgpu-rdc \
-// RUN: --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER %s
-// NEW-DRIVER: 0: input, "[[INPUT:.+]]", cuda
-// NEW-DRIVER: 1: preprocessor, {0}, cuda-cpp-output
-// NEW-DRIVER: 2: compiler, {1}, ir
-// NEW-DRIVER: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
-// NEW-DRIVER: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
-// NEW-DRIVER: 5: compiler, {4}, ir, (device-cuda, sm_52)
-// NEW-DRIVER: 6: backend, {5}, assembler, (device-cuda, sm_52)
-// NEW-DRIVER: 7: assembler, {6}, object, (device-cuda, sm_52)
-// NEW-DRIVER: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
-// NEW-DRIVER: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
-// NEW-DRIVER: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
-// NEW-DRIVER: 11: compiler, {10}, ir, (device-cuda, sm_70)
-// NEW-DRIVER: 12: backend, {11}, assembler, (device-cuda, sm_70)
-// NEW-DRIVER: 13: assembler, {12}, object, (device-cuda, sm_70)
-// NEW-DRIVER: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
-// NEW-DRIVER: 15: clang-offload-packager, {8, 14}, image
-// NEW-DRIVER: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
-// NEW-DRIVER: 17: backend, {16}, assembler, (host-cuda)
-// NEW-DRIVER: 18: assembler, {17}, object, (host-cuda)
-// NEW-DRIVER: 19: clang-linker-wrapper, {18}, image, (host-cuda)
+// RUN:   --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER %s
+//      NEW-DRIVER: 0: input, "[[INPUT:.+]]", cuda
+// NEW-DRIVER-NEXT: 1: preprocessor, {0}, cuda-cpp-output
+// NEW-DRIVER-NEXT: 2: compiler, {1}, ir
+// NEW-DRIVER-NEXT: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
+// NEW-DRIVER-NEXT: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
+// NEW-DRIVER-NEXT: 5: compiler, {4}, ir, (device-cuda, sm_52)
+// NEW-DRIVER-NEXT: 6: backend, {5}, assembler, (device-cuda, sm_52)
+// NEW-DRIVER-NEXT: 7: assembler, {6}, object, (device-cuda, sm_52)
+// NEW-DRIVER-NEXT: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
+// NEW-DRIVER-NEXT: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
+// NEW-DRIVER-NEXT: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
+// NEW-DRIVER-NEXT: 11: compiler, {10}, ir, (device-cuda, sm_70)
+// NEW-DRIVER-NEXT: 12: backend, {11}, assembler, (device-cuda, sm_70)
+// NEW-DRIVER-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70)
+// NEW-DRIVER-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
+// NEW-DRIVER-NEXT: 15: clang-offload-packager, {8, 14}, image
+// NEW-DRIVER-NEXT: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
+// NEW-DRIVER-NEXT: 17: backend, {16}, assembler, (host-cuda)
+// NEW-DRIVER-NEXT: 18: assembler, {17}, object, (host-cuda)
+// NEW-DRIVER-NEXT: 19: clang-linker-wrapper, {18}, image, (host-cuda)
+
+// RUN: %clang -### --target=powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver \
+// RUN:   --offload-arch=sm_52 --offload-arch=sm_70 %s %S/Inputs/empty.cpp 2>&1 | FileCheck --check-prefix=NON-CUDA-INPUT %s
+//      NON-CUDA-INPUT: 0: input, "[[CUDA:.+]]", cuda, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 1: preprocessor, {0}, cuda-cpp-output, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 2: compiler, {1}, ir, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 3: input, "[[CUDA]]", cuda, (device-cuda, sm_52)
+// NON-CUDA-INPUT-NEXT: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
+// NON-CUDA-INPUT-NEXT: 5: compiler, {4}, ir, (device-cuda, sm_52)
+// NON-CUDA-INPUT-NEXT: 6: backend, {5}, assembler, (device-cuda, sm_52)
+// NON-CUDA-INPUT-NEXT: 7: assembler, {6}, object, (device-cuda, sm_52)
+// NON-CUDA-INPUT-NEXT: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
+// NON-CUDA-INPUT-NEXT: 9: input, "[[CUDA]]", cuda, (device-cuda, sm_70)
+// NON-CUDA-INPUT-NEXT: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
+// NON-CUDA-INPUT-NEXT: 11: compiler, {10}, ir, (device-cuda, sm_70)
+// NON-CUDA-INPUT-NEXT: 12: backend, {11}, assembler, (device-cuda, sm_70)
+// NON-CUDA-INPUT-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70)
+// NON-CUDA-INPUT-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
+// NON-CUDA-INPUT-NEXT: 15: linker, {8, 14}, cuda-fatbin, (device-cuda)
+// NON-CUDA-INPUT-NEXT: 16: offload, "host-cuda (powerpc64le-ibm-linux-gnu)" {2}, "device-cuda (nvptx64-nvidia-cuda)" {15}, ir
+// NON-CUDA-INPUT-NEXT: 17: backend, {16}, assembler, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 18: assembler, {17}, object, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 19: input, "[[CPP:.+]]", c++, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 20: preprocessor, {19}, c++-cpp-output, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 21: compiler, {20}, ir, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 22: backend, {21}, assembler, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 23: assembler, {22}, object, (host-cuda)
+// NON-CUDA-INPUT-NEXT: 24: clang-linker-wrapper, {18, 23}, image, (host-cuda)


        


More information about the cfe-commits mailing list