https://github.com/jmmartinez created 
https://github.com/llvm/llvm-project/pull/136853

When using -no-integrated-cpp, before, the driver won't collapse actions when 
the input was not llvm-ir
or it would collapse them too aggressively with -save-temps

The original code was checking the action type (which is IR too for 
preprocessed->bc actions) instead of the action inputs.

From 8ec68be502ca53975994f37eb348115174976270 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?= <juama...@amd.com>
Date: Wed, 16 Apr 2025 14:20:53 +0200
Subject: [PATCH 1/2] Pre-commit test: [Clang][Driver] Fix condition in
 combineBackendCompile when using -no-integrated-cpp

---
 clang/test/Driver/no-integrated-cpp.c | 80 +++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)
 create mode 100644 clang/test/Driver/no-integrated-cpp.c

diff --git a/clang/test/Driver/no-integrated-cpp.c 
b/clang/test/Driver/no-integrated-cpp.c
new file mode 100644
index 0000000000000..c775f407ffd71
--- /dev/null
+++ b/clang/test/Driver/no-integrated-cpp.c
@@ -0,0 +1,80 @@
+// RUN: %clang -O2 %s -E -o %t.i
+//
+// RUN: %clang -O2 %s -c -o a.o -no-integrated-cpp -### 2>&1 | FileCheck %s 
--check-prefixes=SRC
+// SRC: "-E"
+// SRC-SAME: "-o" "[[PREPROC:.*.i]]"
+// SRC-SAME: "-x" "c" "{{.*}}no-integrated-cpp.c"
+//
+// SRC-NEXT: "-emit-obj"
+// SRC-SAME: "-o" "a.o"
+// SRC-SAME: "-x" "cpp-output" "[[PREPROC]]"
+//
+// RUN: %clang -O2 %s -c -o a.o -no-integrated-cpp -save-temps -### 2>&1 | 
FileCheck %s --check-prefixes=SRC-SAVE
+// SRC-SAVE: "-E"
+// SRC-SAVE-SAME: "-o" "[[PREPROC:.*.i]]"
+// SRC-SAVE-SAME: "-x" "c" "{{.*}}no-integrated-cpp.c"
+//
+// SRC-SAVE-NEXT: "-emit-llvm-bc"
+// SRC-SAVE-SAME: "-o" "[[BITCODE:.*.bc]]"
+// SRC-SAVE-SAME: "-x" "cpp-output" "[[PREPROC]]"
+//
+// SRC-SAVE-NEXT: "-S"
+// SRC-SAVE-SAME: "-o" "[[ASM:.*.s]]"
+// SRC-SAVE-SAME: "-x" "ir" "[[BITCODE]]"
+//
+// SRC-SAVE-NEXT: "-cc1as"
+// SRC-SAVE-SAME: "-o" "a.o" "[[ASM]]"
+//
+// RUN: %clang -O2 %t.i  -c -o a.o -no-integrated-cpp -### 2>&1 | FileCheck %s 
--check-prefixes=PRE
+// PRE-NOT: "-E"
+// PRE: "-emit-obj"
+// PRE-SAME: "-o" "a.o"
+// PRE-SAME: "-x" "cpp-output" "{{.*}}no-integrated-cpp.c.tmp.i"
+//
+// RUN: %clang -O2 %t.i  -c -o a.o -no-integrated-cpp -save-temps -### 2>&1 | 
FileCheck %s --check-prefixes=PRE-SAVE
+// PRE-SAVE-NOT: "-E"
+// PRE-SAVE-NOT: "-emit-llvm-bc"
+// PRE-SAVE: "-S"
+// PRE-SAVE-SAME: "-o" "[[ASM:.*.s]]"
+// PRE-SAVE-SAME: "-x" "cpp-output" "{{.*}}no-integrated-cpp.c.tmp.i"
+//
+// PRE-SAVE-NEXT: "-cc1as"
+// PRE-SAVE-SAME: "-o" "a.o" "[[ASM]]"
+//
+// RUN: %clang -O2 %s -c -emit-llvm -o a.bc -no-integrated-cpp -### 2>&1 | 
FileCheck %s --check-prefixes=LLVM
+// LLVM: "-E"
+// LLVM-SAME: "-o" "[[PREPROC:.*.i]]"
+// LLVM-SAME: "-x" "c" "{{.*}}no-integrated-cpp.c"
+//
+// LLVM-NEXT: "-emit-llvm-bc"
+// LLVM-SAME: "-o" "[[BITCODE:.*.bc]]"
+// LLVM-SAME: "-x" "cpp-output" "[[PREPROC]]"
+//
+// LLVM-NEXT: "-emit-llvm-bc"
+// LLVM-SAME: "-o" "a.bc"
+// LLVM-SAME: "-x" "ir" "[[BITCODE]]"
+//
+// RUN: %clang -O2 %s -c -emit-llvm -o a.bc -no-integrated-cpp -save-temps 
-### 2>&1 | FileCheck %s --check-prefixes=LLVM-SAVE
+// LLVM-SAVE: "-E"
+// LLVM-SAVE-SAME: "-o" "[[PREPROC:.*.i]]"
+// LLVM-SAVE-SAME: "-x" "c" "{{.*}}no-integrated-cpp.c"
+//
+// LLVM-SAVE-NEXT: "-emit-llvm-bc"
+// LLVM-SAVE-SAME: "-o" "[[BITCODE:.*.bc]]"
+// LLVM-SAVE-SAME: "-x" "cpp-output" "[[PREPROC]]"
+//
+// LLVM-SAVE-NEXT: "-emit-llvm-bc"
+// LLVM-SAVE-SAME: "-o" "a.bc"
+// LLVM-SAVE-SAME: "-x" "ir" "[[BITCODE]]"
+//
+// RUN: %clang -O2 %t.i -c -emit-llvm -o a.bc -no-integrated-cpp -### 2>&1 | 
FileCheck %s --check-prefixes=PRE-LLVM
+// PRE-LLVM-NOT: "-E"
+// PRE-LLVM: "-emit-llvm-bc"
+// PRE-LLVM-SAME: "-o" "a.bc"
+// PRE-LLVM-SAME: "-x" "cpp-output" "{{.*}}no-integrated-cpp.c.tmp.i"
+//
+// RUN: %clang -O2 %t.i -c -emit-llvm -o a.bc -no-integrated-cpp -save-temps 
-### 2>&1 | FileCheck %s --check-prefixes=PRE-LLVM-SAVE
+// PRE-LLVM-SAVE-NOT: "-E"
+// PRE-LLVM-SAVE: "-emit-llvm-bc"
+// PRE-LLVM-SAVE-SAME: "-o" "a.bc"
+// PRE-LLVM-SAVE-SAME: "-x" "cpp-output" "{{.*}}no-integrated-cpp.c.tmp.i"

From 335eb33c774deafc426124a1ae0c7cef0056eecd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?= <juama...@amd.com>
Date: Mon, 14 Apr 2025 15:20:59 +0200
Subject: [PATCH 2/2] [Clang][Driver] Fix condition in combineBackendCompile
 when using -no-integrated-cpp

When using -no-integrated-cpp, before, the driver won't collapse actions when 
the input was not llvm-ir
or it would collapse them aggresively with -save-temps
---
 clang/lib/Driver/Driver.cpp           | 17 +++++++++--------
 clang/test/Driver/no-integrated-cpp.c | 21 ++++++++++++---------
 2 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 2b8c6e35263b1..2751bd919ae16 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -5609,19 +5609,20 @@ class ToolSelector final {
     if (!BJ || !CJ)
       return nullptr;
 
+    auto HasBitcodeInput = [](const JobActionInfo &AI) {
+      for (auto &Input : AI.JA->getInputs())
+        if (!types::isLLVMIR(Input->getType()))
+          return false;
+      return true;
+    };
+
     // Check if the initial input (to the compile job or its predessor if one
     // exists) is LLVM bitcode. In that case, no preprocessor step is required
     // and we can still collapse the compile and backend jobs when we have
     // -save-temps. I.e. there is no need for a separate compile job just to
     // emit unoptimized bitcode.
-    bool InputIsBitcode = true;
-    for (size_t i = 1; i < ActionInfo.size(); i++)
-      if (ActionInfo[i].JA->getType() != types::TY_LLVM_BC &&
-          ActionInfo[i].JA->getType() != types::TY_LTO_BC) {
-        InputIsBitcode = false;
-        break;
-      }
-    if (!InputIsBitcode && !canCollapsePreprocessorAction())
+    bool InputIsBitcode = all_of(ActionInfo, HasBitcodeInput);
+    if (SaveTemps && !InputIsBitcode)
       return nullptr;
 
     // Get compiler tool.
diff --git a/clang/test/Driver/no-integrated-cpp.c 
b/clang/test/Driver/no-integrated-cpp.c
index c775f407ffd71..a7dc847f08a67 100644
--- a/clang/test/Driver/no-integrated-cpp.c
+++ b/clang/test/Driver/no-integrated-cpp.c
@@ -33,11 +33,14 @@
 //
 // RUN: %clang -O2 %t.i  -c -o a.o -no-integrated-cpp -save-temps -### 2>&1 | 
FileCheck %s --check-prefixes=PRE-SAVE
 // PRE-SAVE-NOT: "-E"
-// PRE-SAVE-NOT: "-emit-llvm-bc"
-// PRE-SAVE: "-S"
-// PRE-SAVE-SAME: "-o" "[[ASM:.*.s]]"
+// PRE-SAVE: "-emit-llvm-bc"
+// PRE-SAVE-SAME: "-o" "[[BITCODE:.*.bc]]"
 // PRE-SAVE-SAME: "-x" "cpp-output" "{{.*}}no-integrated-cpp.c.tmp.i"
 //
+// PRE-SAVE-NEXT: "-S"
+// PRE-SAVE-SAME: "-o" "[[ASM:.*.s]]"
+// PRE-SAVE-SAME: "-x" "ir" "[[BITCODE]]"
+//
 // PRE-SAVE-NEXT: "-cc1as"
 // PRE-SAVE-SAME: "-o" "a.o" "[[ASM]]"
 //
@@ -47,12 +50,8 @@
 // LLVM-SAME: "-x" "c" "{{.*}}no-integrated-cpp.c"
 //
 // LLVM-NEXT: "-emit-llvm-bc"
-// LLVM-SAME: "-o" "[[BITCODE:.*.bc]]"
-// LLVM-SAME: "-x" "cpp-output" "[[PREPROC]]"
-//
-// LLVM-NEXT: "-emit-llvm-bc"
 // LLVM-SAME: "-o" "a.bc"
-// LLVM-SAME: "-x" "ir" "[[BITCODE]]"
+// LLVM-SAME: "-x" "cpp-output" "[[PREPROC]]"
 //
 // RUN: %clang -O2 %s -c -emit-llvm -o a.bc -no-integrated-cpp -save-temps 
-### 2>&1 | FileCheck %s --check-prefixes=LLVM-SAVE
 // LLVM-SAVE: "-E"
@@ -76,5 +75,9 @@
 // RUN: %clang -O2 %t.i -c -emit-llvm -o a.bc -no-integrated-cpp -save-temps 
-### 2>&1 | FileCheck %s --check-prefixes=PRE-LLVM-SAVE
 // PRE-LLVM-SAVE-NOT: "-E"
 // PRE-LLVM-SAVE: "-emit-llvm-bc"
-// PRE-LLVM-SAVE-SAME: "-o" "a.bc"
+// PRE-LLVM-SAVE-SAME: "-o" "[[BITCODE:.*.bc]]"
 // PRE-LLVM-SAVE-SAME: "-x" "cpp-output" "{{.*}}no-integrated-cpp.c.tmp.i"
+
+// PRE-LLVM-SAVE-NEXT: "-emit-llvm-bc"
+// PRE-LLVM-SAVE-SAME: "-o" "a.bc"
+// PRE-LLVM-SAVE-SAME: "-x" "ir" "[[BITCODE]]"

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [clang] [Clang][Driver] Fix ... Juan Manuel Martinez Caamaño via cfe-commits

Reply via email to