[llvm] [SPIR-V] Move structurizer to ISel prepare (PR #157886)

Nathan Gauër via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 10 08:48:46 PDT 2025


https://github.com/Keenuts created https://github.com/llvm/llvm-project/pull/157886

Some passes like LoopSimplify/SimplifyCFF are running between IRPasses and ISelPrepare. This is an issue because the structurizer generates OpSelectionMerge/OpLoopMerge instructions at specific places, and those passes are moving them.
Moving the structurizer later solves this issue.

>From 9ee7f91d756d7c0fc87e46e5d2ce8c19d60c8d5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brioche at google.com>
Date: Wed, 10 Sep 2025 17:29:06 +0200
Subject: [PATCH] [SPIR-V] Move structurizer to ISel prepare

Some passes like LoopSimplify/SimplifyCFF are running between
IRPasses and ISelPrepare. This is an issue because the structurizer
generates OpSelectionMerge/OpLoopMerge instructions at specific places,
and those passes are moving them.
Moving the structurizer later solves this issue.
---
 llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
index e0bfb77f4b530..9c58f468c9bd6 100644
--- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
@@ -189,6 +189,11 @@ TargetPassConfig *SPIRVTargetMachine::createPassConfig(PassManagerBase &PM) {
 void SPIRVPassConfig::addIRPasses() {
   TargetPassConfig::addIRPasses();
 
+  addPass(createSPIRVRegularizerPass());
+  addPass(createSPIRVPrepareFunctionsPass(TM));
+}
+
+void SPIRVPassConfig::addISelPrepare() {
   if (TM.getSubtargetImpl()->isShader()) {
     // Vulkan does not allow address space casts. This pass is run to remove
     // address space casts that can be removed.
@@ -220,12 +225,7 @@ void SPIRVPassConfig::addIRPasses() {
     addPass(createPromoteMemoryToRegisterPass());
   }
 
-  addPass(createSPIRVRegularizerPass());
-  addPass(createSPIRVPrepareFunctionsPass(TM));
   addPass(createSPIRVStripConvergenceIntrinsicsPass());
-}
-
-void SPIRVPassConfig::addISelPrepare() {
   addPass(createSPIRVLegalizeImplicitBindingPass());
   addPass(createSPIRVEmitIntrinsicsPass(&getTM<SPIRVTargetMachine>()));
   if (TM.getSubtargetImpl()->isLogicalSPIRV())



More information about the llvm-commits mailing list