https://github.com/MrSidims updated 
https://github.com/llvm/llvm-project/pull/189383

>From 0240c8254b0d1d6950a312f0f6cc661779494d8c Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <[email protected]>
Date: Mon, 30 Mar 2026 08:40:39 -0500
Subject: [PATCH 1/4] [HIP][SPIR-V] Enable optimizations for amdgcnspirv target

We should be able to allow most of optimizations pre-SPIR-V generation
if these optimizations are more-or-less target agnostic.

This patch sets O3 as default for HIP compilation through SPIR-V and
respects user-provided opt level. Regardless of opt level
target-specific optimizations such as: vectorization, unrolling are
disabled.
---
 clang/lib/Driver/ToolChains/AMDGPU.cpp      | 20 +++++------
 clang/lib/Driver/ToolChains/HIPAMD.cpp      | 30 +++++++++++++----
 clang/test/Driver/hip-spirv-backend-opt.c   |  2 +-
 clang/test/Driver/hip-spirv-optimizations.c | 37 +++++++++++++++++++++
 clang/test/Driver/hip-toolchain-no-rdc.hip  |  2 +-
 clang/test/Driver/spirv-amd-toolchain.c     |  4 +--
 6 files changed, 72 insertions(+), 23 deletions(-)
 create mode 100644 clang/test/Driver/hip-spirv-optimizations.c

diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp 
b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 03bd88f0d4f47..a3e10c848eef4 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -849,19 +849,15 @@ void AMDGPUToolChain::addClangTargetOptions(
     CC1Args.push_back("-fapply-global-visibility-to-externs");
   }
 
-  // For SPIR-V we want to retain the pristine output of Clang CodeGen, since
-  // optimizations might lose structure / information that is necessary for
-  // generating optimal concrete AMDGPU code.
-  // TODO: using the below option is a temporary placeholder until Clang
-  //       provides the required functionality, which essentially boils down to
-  //       -O0 being refactored / reworked to not imply optnone / remove TBAA.
-  //       Once that is added, we should pivot to that functionality, being
-  //       mindful to not corrupt the user provided and subsequently embedded
-  //       command-line (i.e. if the user asks for -O3 this is what the
-  //       finalisation should use).
+  // For SPIR-V, enable basic optimizations but disable target-specific
+  // transformations that could harm JIT performance.
   if (getTriple().isSPIRV() &&
-      !DriverArgs.hasArg(options::OPT_disable_llvm_optzns))
-    CC1Args.push_back("-disable-llvm-optzns");
+      !DriverArgs.hasArg(options::OPT_disable_llvm_optzns)) {
+    CC1Args.append({"-mllvm", "-vectorize-loops=false"});
+    CC1Args.append({"-mllvm", "-vectorize-slp=false"});
+    CC1Args.push_back("-fno-unroll-loops");
+    CC1Args.append({"-mllvm", "-interleave-loops=false"});
+  }
 
   if (DeviceOffloadingKind == Action::OFK_None)
     addOpenCLBuiltinsLib(getDriver(), getTriple(), DriverArgs, CC1Args);
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp 
b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index b08f610b21a16..c4e473dc19324 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -177,7 +177,9 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
     const char *Triple =
         C.getArgs().MakeArgString("-triple=spirv64-amd-amdhsa");
 
-    CmdArgs.append({"-cc1", Triple, "-emit-obj", "-disable-llvm-optzns",
+    CmdArgs.append({"-cc1", Triple, "-emit-obj", "-mllvm",
+                    "-vectorize-loops=false", "-mllvm", "-vectorize-slp=false",
+                    "-fno-unroll-loops", "-mllvm", "-interleave-loops=false",
                     LinkedBCFile.getFilename(), "-o", Output.getFilename()});
 
     const Driver &Driver = getToolChain().getDriver();
@@ -272,12 +274,18 @@ void HIPAMDToolChain::addClangTargetOptions(
     // with options that match the user-supplied ones.
     if (!DriverArgs.hasArg(options::OPT_fembed_bitcode_marker))
       CC1Args.push_back("-fembed-bitcode=marker");
-    // For SPIR-V we want to retain the pristine output of Clang CodeGen, since
-    // optimizations might lose structure / information that is necessary for
-    // generating optimal concrete AMDGPU code. We duplicate this because the
-    // HIP TC doesn't invoke the base AMDGPU TC addClangTargetOptions.
-    if (!DriverArgs.hasArg(options::OPT_disable_llvm_passes))
-      CC1Args.push_back("-disable-llvm-passes");
+    // Enable basic optimizations but disable target-specific transformations
+    // that could harm JIT performance. The JIT will make target-specific
+    // decisions. Users can pass -disable-llvm-passes to disable all opts.
+    if (!DriverArgs.hasArg(options::OPT_disable_llvm_passes)) {
+      // Disable vectorization (problematic with SPIR-V, let JIT decide)
+      CC1Args.append({"-mllvm", "-vectorize-loops=false"});
+      CC1Args.append({"-mllvm", "-vectorize-slp=false"});
+      // Disable loop unrolling (let JIT decide based on target)
+      CC1Args.push_back("-fno-unroll-loops");
+      // Disable loop interleaving
+      CC1Args.append({"-mllvm", "-interleave-loops=false"});
+    }
     return; // No DeviceLibs for SPIR-V.
   }
 
@@ -315,6 +323,14 @@ HIPAMDToolChain::TranslateArgs(const 
llvm::opt::DerivedArgList &Args,
     DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_flto_partitions_EQ),
                       "8");
 
+  // For SPIR-V, apply the default -O3 optimization level if no optimization
+  // level is specified, matching the behavior of OpenCL compilation.
+  if (getTriple().isSPIRV() &&
+      !Args.hasArg(options::OPT_O, options::OPT_O0, options::OPT_O4,
+                   options::OPT_Ofast))
+    DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_O),
+                      getOptionDefault(options::OPT_O));
+
   return DAL;
 }
 
diff --git a/clang/test/Driver/hip-spirv-backend-opt.c 
b/clang/test/Driver/hip-spirv-backend-opt.c
index 10d9a0b01caf3..475a262ece856 100644
--- a/clang/test/Driver/hip-spirv-backend-opt.c
+++ b/clang/test/Driver/hip-spirv-backend-opt.c
@@ -56,6 +56,6 @@
 // CHECK-SPIRV-BACKEND-BINARY: "{{.*clang(\.exe)?}}" "-cc1" "-triple" 
"spirv64-amd-amdhsa" {{.*}} "-emit-obj"
 // CHECK-SPIRV-BACKEND-BC: "{{.*clang(\.exe)?}}" "-cc1" "-triple" 
"spirv64-amd-amdhsa" {{.*}} "-emit-llvm-bc"
 // CHECK-SPIRV-BACKEND-LL: "{{.*clang(\.exe)?}}" "-cc1" "-triple" 
"spirv64-amd-amdhsa" {{.*}} "-emit-llvm"
-// CHECK-SPIRV-BACKEND-BINARY-EQ-TRIPLE: "{{.*clang(\.exe)?}}" "-cc1" 
{{.*}}"-triple=spirv64-amd-amdhsa" {{.*}}"-emit-obj"
+// CHECK-SPIRV-BACKEND-BINARY-EQ-TRIPLE: "{{.*clang(\.exe)?}}" "-cc1" 
"-triple=spirv64-amd-amdhsa" "-emit-obj" "-mllvm" "-vectorize-loops=false"
 // CHECK-FGPU-RDC-SAME: {{.*}} "-fgpu-rdc"
 // CHECK-CLANG-LINKER-WRAPPER: "{{.*}}clang-linker-wrapper" 
"--should-extract=amdgcnspirv" {{.*}} 
"--device-compiler=spirv64-amd-amdhsa=-use-spirv-backend"
diff --git a/clang/test/Driver/hip-spirv-optimizations.c 
b/clang/test/Driver/hip-spirv-optimizations.c
new file mode 100644
index 0000000000000..92b02d905b7c4
--- /dev/null
+++ b/clang/test/Driver/hip-spirv-optimizations.c
@@ -0,0 +1,37 @@
+// Verify SPIR-V compilation enables basic optimizations with targeted disables
+// and defaults to -O3
+// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
+// RUN:         -nogpuinc -nogpulib -### -x hip %s 2>&1 | FileCheck %s
+
+// CHECK-NOT: -disable-llvm-passes
+// CHECK-NOT: -disable-llvm-optzns
+// CHECK-DAG: "-O3"
+// CHECK-DAG: "-mllvm" "-vectorize-loops=false"
+// CHECK-DAG: "-mllvm" "-vectorize-slp=false"
+// CHECK-DAG: "-fno-unroll-loops"
+// CHECK-DAG: "-mllvm" "-interleave-loops=false"
+
+// Verify user-specified optimization level is respected and targeted disables
+// are still present
+// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
+// RUN:         -nogpuinc -nogpulib -O2 -### -x hip %s 2>&1 \
+// RUN:         | FileCheck %s --check-prefix=CHECK-O2
+// CHECK-O2: "-O2"
+// CHECK-O2-NOT: "-O3"
+// CHECK-O2-DAG: "-mllvm" "-vectorize-loops=false"
+// CHECK-O2-DAG: "-mllvm" "-vectorize-slp=false"
+// CHECK-O2-DAG: "-fno-unroll-loops"
+// CHECK-O2-DAG: "-mllvm" "-interleave-loops=false"
+
+// Verify -O0 is respected
+// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
+// RUN:         -nogpuinc -nogpulib -O0 -### -x hip %s 2>&1 \
+// RUN:         | FileCheck %s --check-prefix=CHECK-O0
+// CHECK-O0: "-O0"
+// CHECK-O0-NOT: "-O3"
+
+// Verify user can still disable all optimizations
+// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
+// RUN:         -nogpuinc -nogpulib -disable-llvm-passes -### -x hip %s 2>&1 \
+// RUN:         | FileCheck %s --check-prefix=CHECK-DISABLED
+// CHECK-DISABLED: -disable-llvm-passes
diff --git a/clang/test/Driver/hip-toolchain-no-rdc.hip 
b/clang/test/Driver/hip-toolchain-no-rdc.hip
index 024129e4435ff..b8058468cca04 100644
--- a/clang/test/Driver/hip-toolchain-no-rdc.hip
+++ b/clang/test/Driver/hip-toolchain-no-rdc.hip
@@ -212,7 +212,7 @@
 // Check mixed AMDGCNSPIRV and concrete GPU arch.
 //
 
-// AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" 
{{.*}}"-fembed-bitcode=marker" "-disable-llvm-passes" {{.*}} "-o" 
"[[AMDGCNSPV_BC:.*bc]]"
+// AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" 
{{.*}}"-fembed-bitcode=marker"{{.*}}"-mllvm" "-vectorize-loops=false"{{.*}} 
"-o" "[[AMDGCNSPV_BC:.*bc]]"
 // AMDGCNSPIRV: {{".*llvm-link.*"}} "-o" "[[AMDGCNSPV_TMP:.*bc]]" 
"[[AMDGCNSPV_BC]]"
 // AMDGCNSPIRV: {{".*llvm-spirv.*"}} "--spirv-max-version=1.6" 
"--spirv-ext=+all,-SPV_KHR_untyped_pointers" {{.*}} "[[AMDGCNSPV_TMP]]" 
{{.*}}"-o" "[[AMDGCNSPV_CO:.*out]]"
 // AMDGCNSPIRV: "-cc1" "-triple" "amdgcn-amd-amdhsa" {{.*}}"-emit-obj" 
{{.*}}"-target-cpu" "gfx900"{{.*}} "-o" "[[GFX900_OBJ:.*o]]"
diff --git a/clang/test/Driver/spirv-amd-toolchain.c 
b/clang/test/Driver/spirv-amd-toolchain.c
index 4c7a673ef85fe..3808de7f0911c 100644
--- a/clang/test/Driver/spirv-amd-toolchain.c
+++ b/clang/test/Driver/spirv-amd-toolchain.c
@@ -19,12 +19,12 @@
 
 // RUN: %clang -### --target=spirv64-amd-amdhsa %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=INVOCATION
-// INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" 
{{.*}}"-disable-llvm-optzns" {{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"
+// INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-mllvm" 
"-vectorize-loops=false"{{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"
 // INVOCATION: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" "[[OUTPUT]]"
 // INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" 
"--spirv-ext=+all,-SPV_KHR_untyped_pointers" "--spirv-allow-unknown-intrinsics" 
"--spirv-lower-const-expr" "--spirv-preserve-auxdata" 
"--spirv-debug-info-version=nonsemantic-shader-200" "[[LINKED_OUTPUT]]" "-o" 
"a.out"
 
 // RUN: %clang -### -use-spirv-backend --target=spirv64-amd-amdhsa %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=INVOCATION-SPIRV-BACKEND
-// INVOCATION-SPIRV-BACKEND: "-cc1" "-triple" "spirv64-amd-amdhsa" 
{{.*}}"-disable-llvm-optzns" {{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"
+// INVOCATION-SPIRV-BACKEND: "-cc1" "-triple" "spirv64-amd-amdhsa" 
{{.*}}"-mllvm" "-vectorize-loops=false"{{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"
 // INVOCATION-SPIRV-BACKEND: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" 
"[[OUTPUT]]"
 // INVOCATION-SPIRV-BACKEND: "-cc1" "-triple=spirv64-amd-amdhsa" "-emit-obj" 
{{.*}} "[[LINKED_OUTPUT]]" "-o" "a.out"

>From 5849ebf92a8b5643b7dc58da50ee5b03949ce973 Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <[email protected]>
Date: Tue, 31 Mar 2026 06:03:09 -0500
Subject: [PATCH 2/4] remove all opt customizations for SPIR-V

---
 clang/lib/Driver/ToolChains/AMDGPU.cpp      | 10 ----------
 clang/lib/Driver/ToolChains/HIPAMD.cpp      | 12 ------------
 clang/test/Driver/hip-spirv-optimizations.c | 16 +++-------------
 clang/test/Driver/hip-toolchain-no-rdc.hip  |  2 +-
 clang/test/Driver/spirv-amd-toolchain.c     |  4 ++--
 5 files changed, 6 insertions(+), 38 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp 
b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index a3e10c848eef4..81c32964b54e1 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -849,16 +849,6 @@ void AMDGPUToolChain::addClangTargetOptions(
     CC1Args.push_back("-fapply-global-visibility-to-externs");
   }
 
-  // For SPIR-V, enable basic optimizations but disable target-specific
-  // transformations that could harm JIT performance.
-  if (getTriple().isSPIRV() &&
-      !DriverArgs.hasArg(options::OPT_disable_llvm_optzns)) {
-    CC1Args.append({"-mllvm", "-vectorize-loops=false"});
-    CC1Args.append({"-mllvm", "-vectorize-slp=false"});
-    CC1Args.push_back("-fno-unroll-loops");
-    CC1Args.append({"-mllvm", "-interleave-loops=false"});
-  }
-
   if (DeviceOffloadingKind == Action::OFK_None)
     addOpenCLBuiltinsLib(getDriver(), getTriple(), DriverArgs, CC1Args);
 }
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp 
b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index c4e473dc19324..4833929b11c02 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -274,18 +274,6 @@ void HIPAMDToolChain::addClangTargetOptions(
     // with options that match the user-supplied ones.
     if (!DriverArgs.hasArg(options::OPT_fembed_bitcode_marker))
       CC1Args.push_back("-fembed-bitcode=marker");
-    // Enable basic optimizations but disable target-specific transformations
-    // that could harm JIT performance. The JIT will make target-specific
-    // decisions. Users can pass -disable-llvm-passes to disable all opts.
-    if (!DriverArgs.hasArg(options::OPT_disable_llvm_passes)) {
-      // Disable vectorization (problematic with SPIR-V, let JIT decide)
-      CC1Args.append({"-mllvm", "-vectorize-loops=false"});
-      CC1Args.append({"-mllvm", "-vectorize-slp=false"});
-      // Disable loop unrolling (let JIT decide based on target)
-      CC1Args.push_back("-fno-unroll-loops");
-      // Disable loop interleaving
-      CC1Args.append({"-mllvm", "-interleave-loops=false"});
-    }
     return; // No DeviceLibs for SPIR-V.
   }
 
diff --git a/clang/test/Driver/hip-spirv-optimizations.c 
b/clang/test/Driver/hip-spirv-optimizations.c
index 92b02d905b7c4..45299a53d7f8e 100644
--- a/clang/test/Driver/hip-spirv-optimizations.c
+++ b/clang/test/Driver/hip-spirv-optimizations.c
@@ -1,27 +1,17 @@
-// Verify SPIR-V compilation enables basic optimizations with targeted disables
-// and defaults to -O3
+// Verify SPIR-V compilation enables optimizations and defaults to -O3
 // RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
 // RUN:         -nogpuinc -nogpulib -### -x hip %s 2>&1 | FileCheck %s
 
 // CHECK-NOT: -disable-llvm-passes
 // CHECK-NOT: -disable-llvm-optzns
-// CHECK-DAG: "-O3"
-// CHECK-DAG: "-mllvm" "-vectorize-loops=false"
-// CHECK-DAG: "-mllvm" "-vectorize-slp=false"
-// CHECK-DAG: "-fno-unroll-loops"
-// CHECK-DAG: "-mllvm" "-interleave-loops=false"
+// CHECK: "-O3"
 
-// Verify user-specified optimization level is respected and targeted disables
-// are still present
+// Verify user-specified optimization level is respected
 // RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
 // RUN:         -nogpuinc -nogpulib -O2 -### -x hip %s 2>&1 \
 // RUN:         | FileCheck %s --check-prefix=CHECK-O2
 // CHECK-O2: "-O2"
 // CHECK-O2-NOT: "-O3"
-// CHECK-O2-DAG: "-mllvm" "-vectorize-loops=false"
-// CHECK-O2-DAG: "-mllvm" "-vectorize-slp=false"
-// CHECK-O2-DAG: "-fno-unroll-loops"
-// CHECK-O2-DAG: "-mllvm" "-interleave-loops=false"
 
 // Verify -O0 is respected
 // RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
diff --git a/clang/test/Driver/hip-toolchain-no-rdc.hip 
b/clang/test/Driver/hip-toolchain-no-rdc.hip
index b8058468cca04..e76714b18062d 100644
--- a/clang/test/Driver/hip-toolchain-no-rdc.hip
+++ b/clang/test/Driver/hip-toolchain-no-rdc.hip
@@ -212,7 +212,7 @@
 // Check mixed AMDGCNSPIRV and concrete GPU arch.
 //
 
-// AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" 
{{.*}}"-fembed-bitcode=marker"{{.*}}"-mllvm" "-vectorize-loops=false"{{.*}} 
"-o" "[[AMDGCNSPV_BC:.*bc]]"
+// AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" 
{{.*}}"-fembed-bitcode=marker"{{.*}} "-o" "[[AMDGCNSPV_BC:.*bc]]"
 // AMDGCNSPIRV: {{".*llvm-link.*"}} "-o" "[[AMDGCNSPV_TMP:.*bc]]" 
"[[AMDGCNSPV_BC]]"
 // AMDGCNSPIRV: {{".*llvm-spirv.*"}} "--spirv-max-version=1.6" 
"--spirv-ext=+all,-SPV_KHR_untyped_pointers" {{.*}} "[[AMDGCNSPV_TMP]]" 
{{.*}}"-o" "[[AMDGCNSPV_CO:.*out]]"
 // AMDGCNSPIRV: "-cc1" "-triple" "amdgcn-amd-amdhsa" {{.*}}"-emit-obj" 
{{.*}}"-target-cpu" "gfx900"{{.*}} "-o" "[[GFX900_OBJ:.*o]]"
diff --git a/clang/test/Driver/spirv-amd-toolchain.c 
b/clang/test/Driver/spirv-amd-toolchain.c
index 3808de7f0911c..59e64da2c598b 100644
--- a/clang/test/Driver/spirv-amd-toolchain.c
+++ b/clang/test/Driver/spirv-amd-toolchain.c
@@ -19,12 +19,12 @@
 
 // RUN: %clang -### --target=spirv64-amd-amdhsa %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=INVOCATION
-// INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-mllvm" 
"-vectorize-loops=false"{{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"
+// INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}} "-o" 
"[[OUTPUT:.+]]" "-x" "c"
 // INVOCATION: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" "[[OUTPUT]]"
 // INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" 
"--spirv-ext=+all,-SPV_KHR_untyped_pointers" "--spirv-allow-unknown-intrinsics" 
"--spirv-lower-const-expr" "--spirv-preserve-auxdata" 
"--spirv-debug-info-version=nonsemantic-shader-200" "[[LINKED_OUTPUT]]" "-o" 
"a.out"
 
 // RUN: %clang -### -use-spirv-backend --target=spirv64-amd-amdhsa %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=INVOCATION-SPIRV-BACKEND
-// INVOCATION-SPIRV-BACKEND: "-cc1" "-triple" "spirv64-amd-amdhsa" 
{{.*}}"-mllvm" "-vectorize-loops=false"{{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"
+// INVOCATION-SPIRV-BACKEND: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}} "-o" 
"[[OUTPUT:.+]]" "-x" "c"
 // INVOCATION-SPIRV-BACKEND: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" 
"[[OUTPUT]]"
 // INVOCATION-SPIRV-BACKEND: "-cc1" "-triple=spirv64-amd-amdhsa" "-emit-obj" 
{{.*}} "[[LINKED_OUTPUT]]" "-o" "a.out"

>From 6b315f0e5a6bd2da094228e79878a9311a060405 Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <[email protected]>
Date: Tue, 31 Mar 2026 07:34:24 -0500
Subject: [PATCH 3/4] continue applying

---
 clang/lib/Driver/ToolChains/HIPAMD.cpp    | 6 ++----
 clang/test/Driver/hip-spirv-backend-opt.c | 2 +-
 clang/test/Driver/spirv-amd-toolchain.c   | 2 +-
 3 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp 
b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index 4833929b11c02..5f0187f09d14b 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -177,10 +177,8 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
     const char *Triple =
         C.getArgs().MakeArgString("-triple=spirv64-amd-amdhsa");
 
-    CmdArgs.append({"-cc1", Triple, "-emit-obj", "-mllvm",
-                    "-vectorize-loops=false", "-mllvm", "-vectorize-slp=false",
-                    "-fno-unroll-loops", "-mllvm", "-interleave-loops=false",
-                    LinkedBCFile.getFilename(), "-o", Output.getFilename()});
+    CmdArgs.append({"-cc1", Triple, "-emit-obj", LinkedBCFile.getFilename(),
+                    "-o", Output.getFilename()});
 
     const Driver &Driver = getToolChain().getDriver();
     const char *Exec = Driver.getClangProgramPath();
diff --git a/clang/test/Driver/hip-spirv-backend-opt.c 
b/clang/test/Driver/hip-spirv-backend-opt.c
index 475a262ece856..0150ebb415e4f 100644
--- a/clang/test/Driver/hip-spirv-backend-opt.c
+++ b/clang/test/Driver/hip-spirv-backend-opt.c
@@ -56,6 +56,6 @@
 // CHECK-SPIRV-BACKEND-BINARY: "{{.*clang(\.exe)?}}" "-cc1" "-triple" 
"spirv64-amd-amdhsa" {{.*}} "-emit-obj"
 // CHECK-SPIRV-BACKEND-BC: "{{.*clang(\.exe)?}}" "-cc1" "-triple" 
"spirv64-amd-amdhsa" {{.*}} "-emit-llvm-bc"
 // CHECK-SPIRV-BACKEND-LL: "{{.*clang(\.exe)?}}" "-cc1" "-triple" 
"spirv64-amd-amdhsa" {{.*}} "-emit-llvm"
-// CHECK-SPIRV-BACKEND-BINARY-EQ-TRIPLE: "{{.*clang(\.exe)?}}" "-cc1" 
"-triple=spirv64-amd-amdhsa" "-emit-obj" "-mllvm" "-vectorize-loops=false"
+// CHECK-SPIRV-BACKEND-BINARY-EQ-TRIPLE: "{{.*clang(\.exe)?}}" "-cc1" 
"-triple=spirv64-amd-amdhsa" "-emit-obj"
 // CHECK-FGPU-RDC-SAME: {{.*}} "-fgpu-rdc"
 // CHECK-CLANG-LINKER-WRAPPER: "{{.*}}clang-linker-wrapper" 
"--should-extract=amdgcnspirv" {{.*}} 
"--device-compiler=spirv64-amd-amdhsa=-use-spirv-backend"
diff --git a/clang/test/Driver/spirv-amd-toolchain.c 
b/clang/test/Driver/spirv-amd-toolchain.c
index 59e64da2c598b..01ccccb30bfa7 100644
--- a/clang/test/Driver/spirv-amd-toolchain.c
+++ b/clang/test/Driver/spirv-amd-toolchain.c
@@ -27,4 +27,4 @@
 // RUN:   | FileCheck %s --check-prefix=INVOCATION-SPIRV-BACKEND
 // INVOCATION-SPIRV-BACKEND: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}} "-o" 
"[[OUTPUT:.+]]" "-x" "c"
 // INVOCATION-SPIRV-BACKEND: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" 
"[[OUTPUT]]"
-// INVOCATION-SPIRV-BACKEND: "-cc1" "-triple=spirv64-amd-amdhsa" "-emit-obj" 
{{.*}} "[[LINKED_OUTPUT]]" "-o" "a.out"
+// INVOCATION-SPIRV-BACKEND: "-cc1" "-triple=spirv64-amd-amdhsa" "-emit-obj" 
"[[LINKED_OUTPUT]]" "-o" "a.out"

>From a4a2f1817a51fe914c47d707a29ac2a70b04e21e Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <[email protected]>
Date: Wed, 1 Apr 2026 06:48:29 -0500
Subject: [PATCH 4/4] remove O3

---
 clang/lib/Driver/ToolChains/HIPAMD.cpp      |  8 ------
 clang/test/Driver/hip-spirv-optimizations.c | 27 ---------------------
 2 files changed, 35 deletions(-)
 delete mode 100644 clang/test/Driver/hip-spirv-optimizations.c

diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp 
b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index 5f0187f09d14b..338ccc97cb796 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -309,14 +309,6 @@ HIPAMDToolChain::TranslateArgs(const 
llvm::opt::DerivedArgList &Args,
     DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_flto_partitions_EQ),
                       "8");
 
-  // For SPIR-V, apply the default -O3 optimization level if no optimization
-  // level is specified, matching the behavior of OpenCL compilation.
-  if (getTriple().isSPIRV() &&
-      !Args.hasArg(options::OPT_O, options::OPT_O0, options::OPT_O4,
-                   options::OPT_Ofast))
-    DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_O),
-                      getOptionDefault(options::OPT_O));
-
   return DAL;
 }
 
diff --git a/clang/test/Driver/hip-spirv-optimizations.c 
b/clang/test/Driver/hip-spirv-optimizations.c
deleted file mode 100644
index 45299a53d7f8e..0000000000000
--- a/clang/test/Driver/hip-spirv-optimizations.c
+++ /dev/null
@@ -1,27 +0,0 @@
-// Verify SPIR-V compilation enables optimizations and defaults to -O3
-// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
-// RUN:         -nogpuinc -nogpulib -### -x hip %s 2>&1 | FileCheck %s
-
-// CHECK-NOT: -disable-llvm-passes
-// CHECK-NOT: -disable-llvm-optzns
-// CHECK: "-O3"
-
-// Verify user-specified optimization level is respected
-// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
-// RUN:         -nogpuinc -nogpulib -O2 -### -x hip %s 2>&1 \
-// RUN:         | FileCheck %s --check-prefix=CHECK-O2
-// CHECK-O2: "-O2"
-// CHECK-O2-NOT: "-O3"
-
-// Verify -O0 is respected
-// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
-// RUN:         -nogpuinc -nogpulib -O0 -### -x hip %s 2>&1 \
-// RUN:         | FileCheck %s --check-prefix=CHECK-O0
-// CHECK-O0: "-O0"
-// CHECK-O0-NOT: "-O3"
-
-// Verify user can still disable all optimizations
-// RUN: %clang --target=x86_64-linux-gnu --offload-arch=amdgcnspirv \
-// RUN:         -nogpuinc -nogpulib -disable-llvm-passes -### -x hip %s 2>&1 \
-// RUN:         | FileCheck %s --check-prefix=CHECK-DISABLED
-// CHECK-DISABLED: -disable-llvm-passes

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

Reply via email to