[llvm] Add PreLegalizer pattern matching for degrees GL extension (PR #216506)

via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 24 21:05:51 PDT 2026


https://github.com/albertbolt1 updated https://github.com/llvm/llvm-project/pull/216506

>From bc2c8f057db19e353d10915fc7f16f9e9a77f95f Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sun, 16 Aug 2026 01:04:30 +0530
Subject: [PATCH 01/19] Added required code and test case

---
 llvm/lib/Target/SPIRV/SPIRVCombine.td         | 10 +++-
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 49 +++++++++++++++++++
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h   |  2 +
 .../hlsl-intrinsics/degrees_nointrinsic.ll    | 14 ++++++
 4 files changed, 73 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombine.td b/llvm/lib/Target/SPIRV/SPIRVCombine.td
index e6c4e69673b97..a9f1dab6269e6 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombine.td
+++ b/llvm/lib/Target/SPIRV/SPIRVCombine.td
@@ -38,10 +38,16 @@ def matrix_multiply_lowering
                                  m_GIntrinsic<Intrinsic::matrix_multiply>()); }]),
           (apply [{ Helper.applyMatrixMultiply(*${root}); }])>;
 
+def degrees_lowering
+    : GICombineRule<(defs root:$root),
+                    (match (wip_match_opcode G_FMUL):$root,
+                        [{ return Helper.matchDegrees(*${root}); }]),
+                    (apply [{ Helper.applyDegrees(*${root}); }])>;
+
 def SPIRVPreLegalizerCombiner
     : GICombiner<"SPIRVPreLegalizerCombinerImpl",
                  [vector_length_sub_to_distance_lowering,
                   vector_select_to_faceforward_lowering,
-                  matrix_transpose_lowering, matrix_multiply_lowering]> {
+                  matrix_transpose_lowering, matrix_multiply_lowering, degrees_lowering]> {
   let CombineAllMethodName = "tryCombineAllImpl";
-}
+}
\ No newline at end of file
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index d6166e5c4e46a..dc31bb4318f0f 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -363,3 +363,52 @@ void SPIRVCombinerHelper::applyMatrixMultiply(MachineInstr &MI) const {
     Builder.buildBuildVector(ResReg, ResultScalars);
   MI.eraseFromParent();
 }
+
+bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
+  if (MI.getOpcode() != TargetOpcode::G_FMUL)
+    return false;
+  Register Op1 = MI.getOperand(1).getReg();
+  Register Op2 = MI.getOperand(2).getReg();
+  MachineInstr *Op1Def = MRI.getVRegDef(Op1);
+  MachineInstr *Op2Def = MRI.getVRegDef(Op2);
+
+  if (!Op1Def || !Op2Def)
+    return false;
+
+  if (Op1Def->getOpcode() != TargetOpcode::G_FCONSTANT && Op2Def->getOpcode() != TargetOpcode::G_FCONSTANT)
+    return false;
+
+  MachineInstr *constantMachineInstruction = (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op1Def : Op2Def;
+  MachineOperand &ConstantOperand = constantMachineInstruction->getOperand(1);
+
+  if (!ConstantOperand.isFPImm())
+    return false;
+
+  const ConstantFP *Constant = ConstantOperand.getFPImm();
+  const APFloat &Val = Constant->getValueAPF();
+  APFloat Expected(180.0 / std::acos(-1.0));
+  bool LostInfo = false;
+  Expected.convert(Val.getSemantics(),
+                            APFloat::rmNearestTiesToEven,
+                            &LostInfo);
+
+  if (Expected.compare(Val) != APFloat::cmpEqual)
+    return false;
+
+  return true;
+}
+
+void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
+  Register ResultReg = MI.getOperand(0).getReg();
+  Register Op1 = MI.getOperand(1).getReg();
+  Register Op2 = MI.getOperand(2).getReg();
+  MachineInstr *Op1Def = MRI.getVRegDef(Op1);
+  MachineInstr *Op2Def = MRI.getVRegDef(Op2);
+  Register nonConstantReg = (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op2 : Op1;
+  
+  Builder.setInstrAndDebugLoc(MI);
+  Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg)
+      .addUse(nonConstantReg);
+
+  MI.eraseFromParent();
+}
\ No newline at end of file
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
index 26deb9d146653..4e46618704146 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
@@ -35,6 +35,8 @@ class SPIRVCombinerHelper : public CombinerHelper {
   void applySPIRVFaceForward(MachineInstr &MI) const;
   void applyMatrixTranspose(MachineInstr &MI) const;
   void applyMatrixMultiply(MachineInstr &MI) const;
+  bool matchDegrees(MachineInstr &MI) const;
+  void applyDegrees(MachineInstr &MI) const;
 
 private:
   SPIRVTypeInst getDotProductVectorType(Register ResReg, uint32_t K,
diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll
new file mode 100644
index 0000000000000..4554559ca6b14
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll
@@ -0,0 +1,14 @@
+; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s
+
+; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450"
+; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32
+
+; CHECK-LABEL: Begin function fmul_to_degrees
+; CHECK: %[[#arg:]] = OpFunctionParameter %[[#float_32]]
+; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
+
+define noundef float @fmul_to_degrees(float noundef %x) {
+entry:
+  %mul = fmul reassoc nnan ninf nsz arcp afn float %x, f0x42652EE1
+  ret float %mul
+}
\ No newline at end of file

>From 117ead02b19e1b2eaea4e15da6be6637486ae48c Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sun, 16 Aug 2026 01:17:48 +0530
Subject: [PATCH 02/19] Added required code and test case

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index dc31bb4318f0f..77f291d03dd7b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -375,10 +375,12 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
   if (!Op1Def || !Op2Def)
     return false;
 
-  if (Op1Def->getOpcode() != TargetOpcode::G_FCONSTANT && Op2Def->getOpcode() != TargetOpcode::G_FCONSTANT)
+  if (Op1Def->getOpcode() != TargetOpcode::G_FCONSTANT && 
+      Op2Def->getOpcode() != TargetOpcode::G_FCONSTANT)
     return false;
 
-  MachineInstr *constantMachineInstruction = (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op1Def : Op2Def;
+  MachineInstr *constantMachineInstruction = 
+      (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op1Def : Op2Def;
   MachineOperand &ConstantOperand = constantMachineInstruction->getOperand(1);
 
   if (!ConstantOperand.isFPImm())
@@ -388,9 +390,7 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
   const APFloat &Val = Constant->getValueAPF();
   APFloat Expected(180.0 / std::acos(-1.0));
   bool LostInfo = false;
-  Expected.convert(Val.getSemantics(),
-                            APFloat::rmNearestTiesToEven,
-                            &LostInfo);
+  Expected.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &LostInfo);
 
   if (Expected.compare(Val) != APFloat::cmpEqual)
     return false;
@@ -404,7 +404,8 @@ void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
   Register Op2 = MI.getOperand(2).getReg();
   MachineInstr *Op1Def = MRI.getVRegDef(Op1);
   MachineInstr *Op2Def = MRI.getVRegDef(Op2);
-  Register nonConstantReg = (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op2 : Op1;
+  Register nonConstantReg = 
+      (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op2 : Op1;
   
   Builder.setInstrAndDebugLoc(MI);
   Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg)

>From 4cab79c57c1f81acfe347fd2bf182c2c8dc69d5c Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sun, 16 Aug 2026 01:21:51 +0530
Subject: [PATCH 03/19] clang format

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 77f291d03dd7b..ee2d2350fa430 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -375,11 +375,11 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
   if (!Op1Def || !Op2Def)
     return false;
 
-  if (Op1Def->getOpcode() != TargetOpcode::G_FCONSTANT && 
+  if (Op1Def->getOpcode() != TargetOpcode::G_FCONSTANT &&
       Op2Def->getOpcode() != TargetOpcode::G_FCONSTANT)
     return false;
 
-  MachineInstr *constantMachineInstruction = 
+  MachineInstr *constantMachineInstruction =
       (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op1Def : Op2Def;
   MachineOperand &ConstantOperand = constantMachineInstruction->getOperand(1);
 
@@ -404,9 +404,9 @@ void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
   Register Op2 = MI.getOperand(2).getReg();
   MachineInstr *Op1Def = MRI.getVRegDef(Op1);
   MachineInstr *Op2Def = MRI.getVRegDef(Op2);
-  Register nonConstantReg = 
+  Register nonConstantReg =
       (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op2 : Op1;
-  
+
   Builder.setInstrAndDebugLoc(MI);
   Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg)
       .addUse(nonConstantReg);

>From b4a254f72e175caf1d185a874a99f4865ac2d1c6 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sun, 16 Aug 2026 09:49:51 +0530
Subject: [PATCH 04/19] using llvm pi instead of acos

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index ee2d2350fa430..df03e4fe265b8 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -388,7 +388,8 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
 
   const ConstantFP *Constant = ConstantOperand.getFPImm();
   const APFloat &Val = Constant->getValueAPF();
-  APFloat Expected(180.0 / std::acos(-1.0));
+
+  APFloat Expected(180.0 / llvm::numbers::pi);
   bool LostInfo = false;
   Expected.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &LostInfo);
 

>From 2b06cc655aaf45dee761bfb227cd2fe518623572 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sun, 16 Aug 2026 23:23:58 +0530
Subject: [PATCH 05/19] removed unused variable

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index df03e4fe265b8..dcc19349d5cb2 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -404,7 +404,6 @@ void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
   Register Op1 = MI.getOperand(1).getReg();
   Register Op2 = MI.getOperand(2).getReg();
   MachineInstr *Op1Def = MRI.getVRegDef(Op1);
-  MachineInstr *Op2Def = MRI.getVRegDef(Op2);
   Register nonConstantReg =
       (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op2 : Op1;
 

>From baa2c53c620424cdd3379b89363a0814330c2561 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 22 Aug 2026 20:36:55 +0530
Subject: [PATCH 06/19] review comments handled

---
 llvm/lib/Target/SPIRV/SPIRVCombine.td         |  12 +-
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 109 ++++++++++--------
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h   |   5 +-
 .../prelegalizercombiner-fmul-to-degrees.mir  |  54 +++++++++
 .../CodeGen/SPIRV/hlsl-intrinsics/degrees.ll  |  18 +++
 .../hlsl-intrinsics/degrees_nointrinsic.ll    |  14 ---
 llvm/test/CodeGen/SPIRV/opencl/degrees.ll     |  18 +++
 7 files changed, 158 insertions(+), 72 deletions(-)
 create mode 100644 llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
 delete mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombine.td b/llvm/lib/Target/SPIRV/SPIRVCombine.td
index a9f1dab6269e6..b2fb477b73c2e 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombine.td
+++ b/llvm/lib/Target/SPIRV/SPIRVCombine.td
@@ -22,6 +22,12 @@ def vector_select_to_faceforward_lowering : GICombineRule <
   (apply [{ Helper.applySPIRVFaceForward(*${root}); }])
 >;
 
+def degrees_lowering
+    : GICombineRule<(defs root:$root),
+                    (match (wip_match_opcode G_FMUL):$root,
+                        [{ return Helper.matchDegrees(*${root}); }]),
+                    (apply [{ Helper.applyDegrees(*${root}); }])>;
+
 def matrix_transpose_lowering
     : GICombineRule<
           (defs root:$root),
@@ -38,12 +44,6 @@ def matrix_multiply_lowering
                                  m_GIntrinsic<Intrinsic::matrix_multiply>()); }]),
           (apply [{ Helper.applyMatrixMultiply(*${root}); }])>;
 
-def degrees_lowering
-    : GICombineRule<(defs root:$root),
-                    (match (wip_match_opcode G_FMUL):$root,
-                        [{ return Helper.matchDegrees(*${root}); }]),
-                    (apply [{ Helper.applyDegrees(*${root}); }])>;
-
 def SPIRVPreLegalizerCombiner
     : GICombiner<"SPIRVPreLegalizerCombinerImpl",
                  [vector_length_sub_to_distance_lowering,
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index dcc19349d5cb2..79a6b7473308e 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -185,6 +185,65 @@ void SPIRVCombinerHelper::applySPIRVFaceForward(MachineInstr &MI) const {
   MI.eraseFromParent();
 }
 
+/// This match is part of a combine that
+/// rewrites fmul (x,180/pi) to degrees(x)
+///   (f32 (g_fmul
+///          (f32 X)
+///          (f32 180/pi)))
+/// ->
+///   (f32 (g_intrinsic degrees
+///          (f32 X)))
+///
+/// The constant operand may also be a splat for vector types:
+///   (vXf32 (g_fmul
+///            (vXf32 X)
+///            (vXf32 splat(180/pi))))
+/// ->
+///   (vXf32 (g_intrinsic degrees
+///            (vXf32 X)))
+bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
+  Register NonConstReg;
+  std::optional<FPValueAndVReg> ConstVal;
+
+  if (!mi_match(MI.getOperand(0).getReg(), MRI,
+                m_GFMul(m_Reg(NonConstReg), m_GFCstOrSplat(ConstVal))) &&
+      !mi_match(MI.getOperand(0).getReg(), MRI,
+                m_GFMul(m_GFCstOrSplat(ConstVal), m_Reg(NonConstReg))))
+    return false;
+
+  if (!ConstVal)
+    return false;
+
+  APFloat Expected(180.0 / llvm::numbers::pi);
+  bool LostInfo = false;
+  Expected.convert(ConstVal->Value.getSemantics(), APFloat::rmNearestTiesToEven,
+                   &LostInfo);
+  return Expected.compare(ConstVal->Value) == APFloat::cmpEqual;
+}
+
+void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
+  Register ResultReg = MI.getOperand(0).getReg();
+  Register NonConstReg;
+  std::optional<FPValueAndVReg> ConstVal;
+
+  if (!mi_match(MI.getOperand(0).getReg(), MRI,
+                m_GFMul(m_Reg(NonConstReg), m_GFCstOrSplat(ConstVal))) &&
+      !mi_match(MI.getOperand(0).getReg(), MRI,
+                m_GFMul(m_GFCstOrSplat(ConstVal), m_Reg(NonConstReg)))) {
+    return;
+  }
+
+  Builder.setInstrAndDebugLoc(MI);
+  Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg).addUse(NonConstReg);
+
+  MI.eraseFromParent();
+}
+
+bool SPIRVCombinerHelper::matchMatrixTranspose(MachineInstr &MI) const {
+  return MI.getOpcode() == TargetOpcode::G_INTRINSIC &&
+         cast<GIntrinsic>(MI).getIntrinsicID() == Intrinsic::matrix_transpose;
+}
+
 void SPIRVCombinerHelper::applyMatrixTranspose(MachineInstr &MI) const {
   Register ResReg = MI.getOperand(0).getReg();
   Register InReg = MI.getOperand(2).getReg();
@@ -362,54 +421,4 @@ void SPIRVCombinerHelper::applyMatrixMultiply(MachineInstr &MI) const {
   else
     Builder.buildBuildVector(ResReg, ResultScalars);
   MI.eraseFromParent();
-}
-
-bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
-  if (MI.getOpcode() != TargetOpcode::G_FMUL)
-    return false;
-  Register Op1 = MI.getOperand(1).getReg();
-  Register Op2 = MI.getOperand(2).getReg();
-  MachineInstr *Op1Def = MRI.getVRegDef(Op1);
-  MachineInstr *Op2Def = MRI.getVRegDef(Op2);
-
-  if (!Op1Def || !Op2Def)
-    return false;
-
-  if (Op1Def->getOpcode() != TargetOpcode::G_FCONSTANT &&
-      Op2Def->getOpcode() != TargetOpcode::G_FCONSTANT)
-    return false;
-
-  MachineInstr *constantMachineInstruction =
-      (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op1Def : Op2Def;
-  MachineOperand &ConstantOperand = constantMachineInstruction->getOperand(1);
-
-  if (!ConstantOperand.isFPImm())
-    return false;
-
-  const ConstantFP *Constant = ConstantOperand.getFPImm();
-  const APFloat &Val = Constant->getValueAPF();
-
-  APFloat Expected(180.0 / llvm::numbers::pi);
-  bool LostInfo = false;
-  Expected.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &LostInfo);
-
-  if (Expected.compare(Val) != APFloat::cmpEqual)
-    return false;
-
-  return true;
-}
-
-void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
-  Register ResultReg = MI.getOperand(0).getReg();
-  Register Op1 = MI.getOperand(1).getReg();
-  Register Op2 = MI.getOperand(2).getReg();
-  MachineInstr *Op1Def = MRI.getVRegDef(Op1);
-  Register nonConstantReg =
-      (Op1Def->getOpcode() == TargetOpcode::G_FCONSTANT) ? Op2 : Op1;
-
-  Builder.setInstrAndDebugLoc(MI);
-  Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg)
-      .addUse(nonConstantReg);
-
-  MI.eraseFromParent();
 }
\ No newline at end of file
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
index 4e46618704146..de727d5154414 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
@@ -33,10 +33,11 @@ class SPIRVCombinerHelper : public CombinerHelper {
   void applySPIRVDistance(MachineInstr &MI) const;
   bool matchSelectToFaceForward(MachineInstr &MI) const;
   void applySPIRVFaceForward(MachineInstr &MI) const;
-  void applyMatrixTranspose(MachineInstr &MI) const;
-  void applyMatrixMultiply(MachineInstr &MI) const;
   bool matchDegrees(MachineInstr &MI) const;
   void applyDegrees(MachineInstr &MI) const;
+  bool matchMatrixTranspose(MachineInstr &MI) const;
+  void applyMatrixTranspose(MachineInstr &MI) const;
+  void applyMatrixMultiply(MachineInstr &MI) const;
 
 private:
   SPIRVTypeInst getDotProductVectorType(Register ResReg, uint32_t K,
diff --git a/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
new file mode 100644
index 0000000000000..d2399379f97a2
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
@@ -0,0 +1,54 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -verify-machineinstrs -O0 -mtriple spirv-unknown-unknown -run-pass=spirv-prelegalizer-combiner %s -o - | FileCheck %s
+---
+name:            degrees_instcombine_float
+tracksRegLiveness: true
+legalized: true
+body:             |
+  bb.1.entry:
+    ; CHECK-LABEL: name: degrees_instcombine_float
+    ; CHECK: [[OpTypeFloat:%[0-9]+]]:type(s64) = OpTypeFloat 32
+    ; CHECK-NEXT: [[OpTypeFunction:%[0-9]+]]:type(s64) = OpTypeFunction [[OpTypeFloat]](s64), [[OpTypeFloat]](s64)
+    ; CHECK-NEXT: OpName %2(s32), 120
+    ; CHECK-NEXT: [[OpFunction:%[0-9]+]]:iid(s64) = OpFunction [[OpTypeFloat]](s64), 5, [[OpTypeFunction]](s64)
+    ; CHECK-NEXT: [[OpFunctionParameter:%[0-9]+]]:fid(s32) = OpFunctionParameter [[OpTypeFloat]](s64)
+    ; CHECK-NEXT: OpName [[OpFunction]](s64), 1949588063, 1718907749, 0
+    ; CHECK-NEXT: [[INT:%[0-9]+]]:id(s32) = G_INTRINSIC intrinsic(@llvm.spv.degrees), [[OpFunctionParameter]](s32)
+    ; CHECK-NEXT: OpReturnValue [[INT]](s32)
+    %1:type(s64) = OpTypeFloat 32
+    %3:type(s64) = OpTypeFunction %1(s64), %1(s64)
+    OpName %0(s32), 120
+    %2:iid(s64) = OpFunction %1(s64), 5, %3(s64)
+    %0:fid(s32) = OpFunctionParameter %1(s64)
+    OpName %2(s64), 1949588063, 1718907749, 0
+    %4:_(s32) = G_FCONSTANT float f0x42652EE1
+    %5:id(s32) = nnan ninf nsz arcp afn reassoc G_FMUL %0, %4
+    OpReturnValue %5(s32)
+...
+---
+name:            degrees_instcombine_float4
+tracksRegLiveness: true
+legalized: true
+body:             |
+  bb.1.entry:
+    ; CHECK-LABEL: name: degrees_instcombine_float4
+    ; CHECK: [[OpTypeVector:%[0-9]+]]:type(s64) = OpTypeVector %1(s64), 4
+    ; CHECK-NEXT: [[OpTypeFunction:%[0-9]+]]:type(s64) = OpTypeFunction [[OpTypeVector]](s64), [[OpTypeVector]](s64)
+    ; CHECK-NEXT: [[OpTypeFloat:%[0-9]+]]:type(s64) = OpTypeFloat 32
+    ; CHECK-NEXT: OpName %3(<4 x s32>), 118
+    ; CHECK-NEXT: [[OpFunction:%[0-9]+]]:iid(s64) = OpFunction [[OpTypeVector]](s64), 5, [[OpTypeFunction]](s64)
+    ; CHECK-NEXT: [[OpFunctionParameter:%[0-9]+]]:vfid(<4 x s32>) = OpFunctionParameter [[OpTypeVector]](s64)
+    ; CHECK-NEXT: OpName [[OpFunction]](s64), 808540767, 1953719668, 1952671062, 1984197231, 6709044
+    ; CHECK-NEXT: [[INT:%[0-9]+]]:id(<4 x s32>) = G_INTRINSIC intrinsic(@llvm.spv.degrees), [[OpFunctionParameter]](<4 x s32>)
+    ; CHECK-NEXT: OpReturnValue [[INT]](<4 x s32>)
+    %2:type(s64) = OpTypeVector %1(s64), 4
+    %4:type(s64) = OpTypeFunction %2(s64), %2(s64)
+    %1:type(s64) = OpTypeFloat 32
+    OpName %0(<4 x s32>), 118
+    %3:iid(s64) = OpFunction %2(s64), 5, %4(s64)
+    %0:vfid(<4 x s32>) = OpFunctionParameter %2(s64)
+    OpName %3(s64), 808540767, 1953719668, 1952671062, 1984197231, 6709044
+    %6:_(s32) = G_FCONSTANT float f0x42652EE1
+    %5:_(<4 x s32>) = G_BUILD_VECTOR %6(s32), %6(s32), %6(s32), %6(s32)
+    %7:id(<4 x s32>) = nnan ninf nsz arcp afn reassoc G_FMUL %0, %5
+    OpReturnValue %7(<4 x s32>)
diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
index d2d929b152cda..74fabad8b1b80 100644
--- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
+++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
@@ -45,6 +45,24 @@ entry:
   ret <4 x half> %elt.degrees
 }
 
+; CHECK-LABEL: Begin function fmul_to_degrees
+define noundef float @fmul_to_degrees(float noundef %x) {
+entry:
+; CHECK: %[[#arg:]] = OpFunctionParameter %[[#float_32]]
+; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
+  %mul = fmul reassoc nnan ninf nsz arcp afn float %x, f0x42652EE1
+  ret float %mul
+}
+
+; CHECK-LABEL: Begin function fmul_to_degrees_vector
+define hidden noundef nofpclass(nan inf) <4 x float> @fmul_to_degrees_vector(<4 x float> noundef nofpclass(nan inf) %v) local_unnamed_addr #0 {
+entry:
+; CHECK: %[[#arg:]] = OpFunctionParameter %[[#vec4_float_32]]
+; CHECK: %[[#]] = OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
+  %mul.i = fmul reassoc nnan ninf nsz arcp afn <4 x float> %v, splat (float f0x42652EE1)
+  ret <4 x float> %mul.i
+}
+
 declare half @llvm.spv.degrees.f16(half)
 declare float @llvm.spv.degrees.f32(float)
 
diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll
deleted file mode 100644
index 4554559ca6b14..0000000000000
--- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees_nointrinsic.ll
+++ /dev/null
@@ -1,14 +0,0 @@
-; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s
-
-; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450"
-; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32
-
-; CHECK-LABEL: Begin function fmul_to_degrees
-; CHECK: %[[#arg:]] = OpFunctionParameter %[[#float_32]]
-; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
-
-define noundef float @fmul_to_degrees(float noundef %x) {
-entry:
-  %mul = fmul reassoc nnan ninf nsz arcp afn float %x, f0x42652EE1
-  ret float %mul
-}
\ No newline at end of file
diff --git a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
index b8d4f52a28795..ed008c1cd348c 100644
--- a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
+++ b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
@@ -48,3 +48,21 @@ entry:
   %elt.degrees = call <4 x half> @llvm.spv.degrees.v4f16(<4 x half> %a)
   ret <4 x half> %elt.degrees
 }
+
+; CHECK-LABEL: Begin function fmul_to_degrees
+define noundef float @fmul_to_degrees(float noundef %x) {
+entry:
+; CHECK: %[[#float_32_arg:]] = OpFunctionParameter %[[#float_32]]
+; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_ocl]] degrees %[[#float_32_arg]]
+  %mul = fmul reassoc nnan ninf nsz arcp afn float %x, f0x42652EE1
+  ret float %mul
+}
+
+; CHECK-LABEL: Begin function fmul_to_degrees_vector
+define hidden noundef nofpclass(nan inf) <4 x float> @fmul_to_degrees_vector(<4 x float> noundef nofpclass(nan inf) %v) local_unnamed_addr #0 {
+entry:
+; CHECK: %[[#vec4_float_32_arg:]] = OpFunctionParameter %[[#vec4_float_32]]
+; CHECK: %[[#]] = OpExtInst %[[#vec4_float_32]] %[[#op_ext_ocl]] degrees %[[#vec4_float_32_arg]]
+  %mul.i = fmul reassoc nnan ninf nsz arcp afn <4 x float> %v, splat (float f0x42652EE1)
+  ret <4 x float> %mul.i
+}
\ No newline at end of file

>From 4c727af00327804eaf0e9cb9ee6bb010eab60e16 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 22 Aug 2026 20:44:30 +0530
Subject: [PATCH 07/19] review comments handled

---
 llvm/lib/Target/SPIRV/SPIRVCombine.td         | 2 +-
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 5 -----
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h   | 1 -
 3 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombine.td b/llvm/lib/Target/SPIRV/SPIRVCombine.td
index b2fb477b73c2e..a42fd707c973b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombine.td
+++ b/llvm/lib/Target/SPIRV/SPIRVCombine.td
@@ -48,6 +48,6 @@ def SPIRVPreLegalizerCombiner
     : GICombiner<"SPIRVPreLegalizerCombinerImpl",
                  [vector_length_sub_to_distance_lowering,
                   vector_select_to_faceforward_lowering,
-                  matrix_transpose_lowering, matrix_multiply_lowering, degrees_lowering]> {
+                  degrees_lowering, matrix_transpose_lowering, matrix_multiply_lowering]> {
   let CombineAllMethodName = "tryCombineAllImpl";
 }
\ No newline at end of file
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 79a6b7473308e..12c18544deba8 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -239,11 +239,6 @@ void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
   MI.eraseFromParent();
 }
 
-bool SPIRVCombinerHelper::matchMatrixTranspose(MachineInstr &MI) const {
-  return MI.getOpcode() == TargetOpcode::G_INTRINSIC &&
-         cast<GIntrinsic>(MI).getIntrinsicID() == Intrinsic::matrix_transpose;
-}
-
 void SPIRVCombinerHelper::applyMatrixTranspose(MachineInstr &MI) const {
   Register ResReg = MI.getOperand(0).getReg();
   Register InReg = MI.getOperand(2).getReg();
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
index de727d5154414..a693568af6817 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
@@ -35,7 +35,6 @@ class SPIRVCombinerHelper : public CombinerHelper {
   void applySPIRVFaceForward(MachineInstr &MI) const;
   bool matchDegrees(MachineInstr &MI) const;
   void applyDegrees(MachineInstr &MI) const;
-  bool matchMatrixTranspose(MachineInstr &MI) const;
   void applyMatrixTranspose(MachineInstr &MI) const;
   void applyMatrixMultiply(MachineInstr &MI) const;
 

>From f7a7aec1cb810a7ad11966361dd21abe1b20206f Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 22 Aug 2026 20:57:53 +0530
Subject: [PATCH 08/19] new line correction

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 2 +-
 llvm/test/CodeGen/SPIRV/opencl/degrees.ll     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 12c18544deba8..605412381061a 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -416,4 +416,4 @@ void SPIRVCombinerHelper::applyMatrixMultiply(MachineInstr &MI) const {
   else
     Builder.buildBuildVector(ResReg, ResultScalars);
   MI.eraseFromParent();
-}
\ No newline at end of file
+}
diff --git a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
index ed008c1cd348c..1e24e85d464dd 100644
--- a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
+++ b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
@@ -65,4 +65,4 @@ entry:
 ; CHECK: %[[#]] = OpExtInst %[[#vec4_float_32]] %[[#op_ext_ocl]] degrees %[[#vec4_float_32_arg]]
   %mul.i = fmul reassoc nnan ninf nsz arcp afn <4 x float> %v, splat (float f0x42652EE1)
   ret <4 x float> %mul.i
-}
\ No newline at end of file
+}

>From c482c3cbb2b76e071325f16f3f0ba5fc783ac114 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 22 Aug 2026 20:58:44 +0530
Subject: [PATCH 09/19] new line correction

---
 llvm/lib/Target/SPIRV/SPIRVCombine.td | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombine.td b/llvm/lib/Target/SPIRV/SPIRVCombine.td
index a42fd707c973b..11b8af5ca9231 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombine.td
+++ b/llvm/lib/Target/SPIRV/SPIRVCombine.td
@@ -50,4 +50,4 @@ def SPIRVPreLegalizerCombiner
                   vector_select_to_faceforward_lowering,
                   degrees_lowering, matrix_transpose_lowering, matrix_multiply_lowering]> {
   let CombineAllMethodName = "tryCombineAllImpl";
-}
\ No newline at end of file
+}

>From c3bf4fbdfbfc1ceb5c6b5ad8ee00c4997027b818 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sun, 23 Aug 2026 19:48:07 +0530
Subject: [PATCH 10/19] removed wip atch op

---
 llvm/lib/Target/SPIRV/SPIRVCombine.td | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombine.td b/llvm/lib/Target/SPIRV/SPIRVCombine.td
index 11b8af5ca9231..93bf86dda96ff 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombine.td
+++ b/llvm/lib/Target/SPIRV/SPIRVCombine.td
@@ -24,7 +24,7 @@ def vector_select_to_faceforward_lowering : GICombineRule <
 
 def degrees_lowering
     : GICombineRule<(defs root:$root),
-                    (match (wip_match_opcode G_FMUL):$root,
+                    (match (G_FMUL $dst, $lhs, $rhs):$root,
                         [{ return Helper.matchDegrees(*${root}); }]),
                     (apply [{ Helper.applyDegrees(*${root}); }])>;
 

>From 34d51b03452509ffd3a6877d80e7a4b31fc72809 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Wed, 26 Aug 2026 01:01:27 +0530
Subject: [PATCH 11/19] review suggestions resolved

---
 .../prelegalizercombiner-fmul-to-degrees.mir  | 28 ++++++-------------
 .../CodeGen/SPIRV/hlsl-intrinsics/degrees.ll  |  6 ++--
 llvm/test/CodeGen/SPIRV/opencl/degrees.ll     |  6 ++--
 3 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
index d2399379f97a2..73b42f37354a7 100644
--- a/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
+++ b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
@@ -7,14 +7,9 @@ legalized: true
 body:             |
   bb.1.entry:
     ; CHECK-LABEL: name: degrees_instcombine_float
-    ; CHECK: [[OpTypeFloat:%[0-9]+]]:type(s64) = OpTypeFloat 32
-    ; CHECK-NEXT: [[OpTypeFunction:%[0-9]+]]:type(s64) = OpTypeFunction [[OpTypeFloat]](s64), [[OpTypeFloat]](s64)
-    ; CHECK-NEXT: OpName %2(s32), 120
-    ; CHECK-NEXT: [[OpFunction:%[0-9]+]]:iid(s64) = OpFunction [[OpTypeFloat]](s64), 5, [[OpTypeFunction]](s64)
-    ; CHECK-NEXT: [[OpFunctionParameter:%[0-9]+]]:fid(s32) = OpFunctionParameter [[OpTypeFloat]](s64)
-    ; CHECK-NEXT: OpName [[OpFunction]](s64), 1949588063, 1718907749, 0
-    ; CHECK-NEXT: [[INT:%[0-9]+]]:id(s32) = G_INTRINSIC intrinsic(@llvm.spv.degrees), [[OpFunctionParameter]](s32)
-    ; CHECK-NEXT: OpReturnValue [[INT]](s32)
+    ; CHECK-NOT: %4:_(s32) = G_FCONSTANT float f0x42652EE1
+    ; CHECK-NOT: %5:id(s32) = G_FMUL %0, %4
+    ; CHECK: %5:id(s32) = G_INTRINSIC intrinsic(@llvm.spv.degrees), %2(s32)
     %1:type(s64) = OpTypeFloat 32
     %3:type(s64) = OpTypeFunction %1(s64), %1(s64)
     OpName %0(s32), 120
@@ -22,7 +17,7 @@ body:             |
     %0:fid(s32) = OpFunctionParameter %1(s64)
     OpName %2(s64), 1949588063, 1718907749, 0
     %4:_(s32) = G_FCONSTANT float f0x42652EE1
-    %5:id(s32) = nnan ninf nsz arcp afn reassoc G_FMUL %0, %4
+    %5:id(s32) = G_FMUL %0, %4
     OpReturnValue %5(s32)
 ...
 ---
@@ -32,15 +27,9 @@ legalized: true
 body:             |
   bb.1.entry:
     ; CHECK-LABEL: name: degrees_instcombine_float4
-    ; CHECK: [[OpTypeVector:%[0-9]+]]:type(s64) = OpTypeVector %1(s64), 4
-    ; CHECK-NEXT: [[OpTypeFunction:%[0-9]+]]:type(s64) = OpTypeFunction [[OpTypeVector]](s64), [[OpTypeVector]](s64)
-    ; CHECK-NEXT: [[OpTypeFloat:%[0-9]+]]:type(s64) = OpTypeFloat 32
-    ; CHECK-NEXT: OpName %3(<4 x s32>), 118
-    ; CHECK-NEXT: [[OpFunction:%[0-9]+]]:iid(s64) = OpFunction [[OpTypeVector]](s64), 5, [[OpTypeFunction]](s64)
-    ; CHECK-NEXT: [[OpFunctionParameter:%[0-9]+]]:vfid(<4 x s32>) = OpFunctionParameter [[OpTypeVector]](s64)
-    ; CHECK-NEXT: OpName [[OpFunction]](s64), 808540767, 1953719668, 1952671062, 1984197231, 6709044
-    ; CHECK-NEXT: [[INT:%[0-9]+]]:id(<4 x s32>) = G_INTRINSIC intrinsic(@llvm.spv.degrees), [[OpFunctionParameter]](<4 x s32>)
-    ; CHECK-NEXT: OpReturnValue [[INT]](<4 x s32>)
+    ; CHECK-NOT: %6:_(s32) = G_FCONSTANT float f0x42652EE1
+    ; CHECK-NOT: %7:id(<4 x s32>) = G_FMUL %0, %5
+    ; CHECK: %7:id(<4 x s32>) = G_INTRINSIC intrinsic(@llvm.spv.degrees), %3(<4 x s32>)
     %2:type(s64) = OpTypeVector %1(s64), 4
     %4:type(s64) = OpTypeFunction %2(s64), %2(s64)
     %1:type(s64) = OpTypeFloat 32
@@ -50,5 +39,6 @@ body:             |
     OpName %3(s64), 808540767, 1953719668, 1952671062, 1984197231, 6709044
     %6:_(s32) = G_FCONSTANT float f0x42652EE1
     %5:_(<4 x s32>) = G_BUILD_VECTOR %6(s32), %6(s32), %6(s32), %6(s32)
-    %7:id(<4 x s32>) = nnan ninf nsz arcp afn reassoc G_FMUL %0, %5
+    %7:id(<4 x s32>) = G_FMUL %0, %5
     OpReturnValue %7(<4 x s32>)
+...
diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
index 74fabad8b1b80..3011f9b2b2dcc 100644
--- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
+++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
@@ -50,16 +50,16 @@ define noundef float @fmul_to_degrees(float noundef %x) {
 entry:
 ; CHECK: %[[#arg:]] = OpFunctionParameter %[[#float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
-  %mul = fmul reassoc nnan ninf nsz arcp afn float %x, f0x42652EE1
+  %mul = fmul float %x, f0x42652EE1
   ret float %mul
 }
 
 ; CHECK-LABEL: Begin function fmul_to_degrees_vector
-define hidden noundef nofpclass(nan inf) <4 x float> @fmul_to_degrees_vector(<4 x float> noundef nofpclass(nan inf) %v) local_unnamed_addr #0 {
+define noundef <4 x float> @fmul_to_degrees_vector(<4 x float> %v) {
 entry:
 ; CHECK: %[[#arg:]] = OpFunctionParameter %[[#vec4_float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
-  %mul.i = fmul reassoc nnan ninf nsz arcp afn <4 x float> %v, splat (float f0x42652EE1)
+  %mul.i = fmul <4 x float> %v, splat (float f0x42652EE1)
   ret <4 x float> %mul.i
 }
 
diff --git a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
index 1e24e85d464dd..e4737897951a1 100644
--- a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
+++ b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
@@ -54,15 +54,15 @@ define noundef float @fmul_to_degrees(float noundef %x) {
 entry:
 ; CHECK: %[[#float_32_arg:]] = OpFunctionParameter %[[#float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_ocl]] degrees %[[#float_32_arg]]
-  %mul = fmul reassoc nnan ninf nsz arcp afn float %x, f0x42652EE1
+  %mul = fmul float %x, f0x42652EE1
   ret float %mul
 }
 
 ; CHECK-LABEL: Begin function fmul_to_degrees_vector
-define hidden noundef nofpclass(nan inf) <4 x float> @fmul_to_degrees_vector(<4 x float> noundef nofpclass(nan inf) %v) local_unnamed_addr #0 {
+define noundef <4 x float> @fmul_to_degrees_vector(<4 x float> %v) {
 entry:
 ; CHECK: %[[#vec4_float_32_arg:]] = OpFunctionParameter %[[#vec4_float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#vec4_float_32]] %[[#op_ext_ocl]] degrees %[[#vec4_float_32_arg]]
-  %mul.i = fmul reassoc nnan ninf nsz arcp afn <4 x float> %v, splat (float f0x42652EE1)
+  %mul.i = fmul <4 x float> %v, splat (float f0x42652EE1)
   ret <4 x float> %mul.i
 }

>From 039efdb6dfb999dab197950ee88d76b470dd0ac4 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Wed, 26 Aug 2026 14:29:56 +0530
Subject: [PATCH 12/19] used a consistently

---
 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll | 10 +++++-----
 llvm/test/CodeGen/SPIRV/opencl/degrees.ll          | 10 +++++-----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
index 3011f9b2b2dcc..3746592a38db7 100644
--- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
+++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll
@@ -46,21 +46,21 @@ entry:
 }
 
 ; CHECK-LABEL: Begin function fmul_to_degrees
-define noundef float @fmul_to_degrees(float noundef %x) {
+define noundef float @fmul_to_degrees(float noundef %a) {
 entry:
 ; CHECK: %[[#arg:]] = OpFunctionParameter %[[#float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
-  %mul = fmul float %x, f0x42652EE1
+  %mul = fmul float %a, f0x42652EE1
   ret float %mul
 }
 
 ; CHECK-LABEL: Begin function fmul_to_degrees_vector
-define noundef <4 x float> @fmul_to_degrees_vector(<4 x float> %v) {
+define noundef <4 x float> @fmul_to_degrees_vector(<4 x float> %a) {
 entry:
 ; CHECK: %[[#arg:]] = OpFunctionParameter %[[#vec4_float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#vec4_float_32]] %[[#op_ext_glsl]] Degrees %[[#arg]]
-  %mul.i = fmul <4 x float> %v, splat (float f0x42652EE1)
-  ret <4 x float> %mul.i
+  %mul = fmul <4 x float> %a, splat (float f0x42652EE1)
+  ret <4 x float> %mul
 }
 
 declare half @llvm.spv.degrees.f16(half)
diff --git a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
index e4737897951a1..bcfa28c8a5592 100644
--- a/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
+++ b/llvm/test/CodeGen/SPIRV/opencl/degrees.ll
@@ -50,19 +50,19 @@ entry:
 }
 
 ; CHECK-LABEL: Begin function fmul_to_degrees
-define noundef float @fmul_to_degrees(float noundef %x) {
+define noundef float @fmul_to_degrees(float noundef %a) {
 entry:
 ; CHECK: %[[#float_32_arg:]] = OpFunctionParameter %[[#float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#float_32]] %[[#op_ext_ocl]] degrees %[[#float_32_arg]]
-  %mul = fmul float %x, f0x42652EE1
+  %mul = fmul float %a, f0x42652EE1
   ret float %mul
 }
 
 ; CHECK-LABEL: Begin function fmul_to_degrees_vector
-define noundef <4 x float> @fmul_to_degrees_vector(<4 x float> %v) {
+define noundef <4 x float> @fmul_to_degrees_vector(<4 x float> %a) {
 entry:
 ; CHECK: %[[#vec4_float_32_arg:]] = OpFunctionParameter %[[#vec4_float_32]]
 ; CHECK: %[[#]] = OpExtInst %[[#vec4_float_32]] %[[#op_ext_ocl]] degrees %[[#vec4_float_32_arg]]
-  %mul.i = fmul <4 x float> %v, splat (float f0x42652EE1)
-  ret <4 x float> %mul.i
+  %mul = fmul <4 x float> %a, splat (float f0x42652EE1)
+  ret <4 x float> %mul
 }

>From 132cb62a4ded2ddc4821f568fd0570a85823ffed Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Tue, 1 Sep 2026 01:07:59 +0530
Subject: [PATCH 13/19] review suggestions considered

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp       | 13 +++++--------
 .../prelegalizercombiner-fmul-to-degrees.mir        |  2 +-
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 605412381061a..5299bdbb620e2 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -223,15 +223,12 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
 
 void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
   Register ResultReg = MI.getOperand(0).getReg();
-  Register NonConstReg;
-  std::optional<FPValueAndVReg> ConstVal;
 
-  if (!mi_match(MI.getOperand(0).getReg(), MRI,
-                m_GFMul(m_Reg(NonConstReg), m_GFCstOrSplat(ConstVal))) &&
-      !mi_match(MI.getOperand(0).getReg(), MRI,
-                m_GFMul(m_GFCstOrSplat(ConstVal), m_Reg(NonConstReg)))) {
-    return;
-  }
+  Register Operand1 = MI.getOperand(1).getReg();
+  Register Operand2 = MI.getOperand(2).getReg();
+  bool Operand2IsConst = getFConstantSplat(Operand2, MRI) ||
+                         getFConstantVRegValWithLookThrough(Operand2, MRI);
+  Register NonConstReg = Operand2IsConst ? Operand1 : Operand2;
 
   Builder.setInstrAndDebugLoc(MI);
   Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg).addUse(NonConstReg);
diff --git a/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
index 73b42f37354a7..fe1f176aebf11 100644
--- a/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
+++ b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
@@ -1,5 +1,5 @@
 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
-# RUN: llc -verify-machineinstrs -O0 -mtriple spirv-unknown-unknown -run-pass=spirv-prelegalizer-combiner %s -o - | FileCheck %s
+# RUN: llc -mtriple spirv-unknown-unknown -run-pass=spirv-prelegalizer-combiner %s -o - | FileCheck %s
 ---
 name:            degrees_instcombine_float
 tracksRegLiveness: true

>From 4b35306c1c34c3a3854d37b81382b853e0924bef Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Tue, 1 Sep 2026 01:34:32 +0530
Subject: [PATCH 14/19] removed autogenerated line from prelegalizer

---
 .../InstCombine/prelegalizercombiner-fmul-to-degrees.mir         | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
index fe1f176aebf11..155430d610b2e 100644
--- a/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
+++ b/llvm/test/CodeGen/SPIRV/GlobalISel/InstCombine/prelegalizercombiner-fmul-to-degrees.mir
@@ -1,4 +1,3 @@
-# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
 # RUN: llc -mtriple spirv-unknown-unknown -run-pass=spirv-prelegalizer-combiner %s -o - | FileCheck %s
 ---
 name:            degrees_instcombine_float

>From 1fab09fceeed962ce7f60c154473ca9b874d53c8 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 5 Sep 2026 19:50:28 +0530
Subject: [PATCH 15/19] comment for combiner changed

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 25 ++++++++-----------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index b94cd40a7684a..ca7ad57dadb90 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -235,20 +235,10 @@ void SPIRVCombinerHelper::applySPIRVFaceForward(MachineInstr &MI) const {
 
 /// This match is part of a combine that
 /// rewrites fmul (x,180/pi) to degrees(x)
-///   (f32 (g_fmul
-///          (f32 X)
-///          (f32 180/pi)))
-/// ->
-///   (f32 (g_intrinsic degrees
-///          (f32 X)))
-///
-/// The constant operand may also be a splat for vector types:
-///   (vXf32 (g_fmul
-///            (vXf32 X)
-///            (vXf32 splat(180/pi))))
-/// ->
-///   (vXf32 (g_intrinsic degrees
-///            (vXf32 X)))
+///   (fN (g_fmul (fN X) (fN 180/pi))) -> (fN (g_intrinsic degrees (fN X)))
+///   (vXfN (g_fmul (vXfN X) (vXfN splat(180/pi)))) ->
+///   (vXfN (g_intrinsic degrees (vXfN X)))
+/// where `fN` denotes a supported floating-point type.
 bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
   Register NonConstReg;
   std::optional<FPValueAndVReg> ConstVal;
@@ -376,6 +366,13 @@ Register SPIRVCombinerHelper::computeDotProduct(Register RowA, Register ColB,
 
   Register DotRes;
   if (isVectorType(SpvVecType)) {
+getOpcode() == SPIRV::OpTypeVector;
+  SPIRVTypeInst SpvScalarType = GR->getScalarOrVectorComponentType(SpvVecType);
+  bool IsFloatOp = SpvScalarType->getOpcode() == SPIRV::OpTypeFloat;
+  LLT VecTy = GR->getRegType(SpvVecType);
+
+  Register DotRes;
+  if (IsVectorOp) {
     LLT ScalarTy = VecTy.getElementType();
     Intrinsic::SPVIntrinsics DotIntrinsic =
         (IsFloatOp ? Intrinsic::spv_fdot : Intrinsic::spv_udot);

>From 0555529314ddceb62039acd4bed7faed43afc3d6 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 5 Sep 2026 19:53:35 +0530
Subject: [PATCH 16/19] cleaning

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index ca7ad57dadb90..968135125b5a8 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -366,13 +366,6 @@ Register SPIRVCombinerHelper::computeDotProduct(Register RowA, Register ColB,
 
   Register DotRes;
   if (isVectorType(SpvVecType)) {
-getOpcode() == SPIRV::OpTypeVector;
-  SPIRVTypeInst SpvScalarType = GR->getScalarOrVectorComponentType(SpvVecType);
-  bool IsFloatOp = SpvScalarType->getOpcode() == SPIRV::OpTypeFloat;
-  LLT VecTy = GR->getRegType(SpvVecType);
-
-  Register DotRes;
-  if (IsVectorOp) {
     LLT ScalarTy = VecTy.getElementType();
     Intrinsic::SPVIntrinsics DotIntrinsic =
         (IsFloatOp ? Intrinsic::spv_fdot : Intrinsic::spv_udot);

>From 046d47c5f5151a036daaa142797c3914aacf5f06 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 12 Sep 2026 23:27:34 +0530
Subject: [PATCH 17/19] review suggestions taken into consideration

---
 llvm/lib/Target/SPIRV/SPIRVCombine.td         |  7 ++++---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 15 +++++----------
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h   |  4 ++--
 3 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombine.td b/llvm/lib/Target/SPIRV/SPIRVCombine.td
index 74a576ba3a4da..4e0d30715b38b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombine.td
+++ b/llvm/lib/Target/SPIRV/SPIRVCombine.td
@@ -29,11 +29,12 @@ def vector_select_to_faceforward_lowering : GICombineRule <
   (apply [{ Helper.applySPIRVFaceForward(*${root}); }])
 >;
 
+def degrees_matchdata : GIDefMatchData<"Register">;
 def degrees_lowering
-    : GICombineRule<(defs root:$root),
+    : GICombineRule<(defs root:$root, degrees_matchdata:$matchinfo),
                     (match (G_FMUL $dst, $lhs, $rhs):$root,
-                        [{ return Helper.matchDegrees(*${root}); }]),
-                    (apply [{ Helper.applyDegrees(*${root}); }])>;
+                        [{ return Helper.matchDegrees(*${root}, ${matchinfo}); }]),
+                    (apply [{ Helper.applyDegrees(*${root}, ${matchinfo}); }])>;
 
 def matrix_transpose_lowering
     : GICombineRule<
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 968135125b5a8..21971e1197e49 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -239,7 +239,7 @@ void SPIRVCombinerHelper::applySPIRVFaceForward(MachineInstr &MI) const {
 ///   (vXfN (g_fmul (vXfN X) (vXfN splat(180/pi)))) ->
 ///   (vXfN (g_intrinsic degrees (vXfN X)))
 /// where `fN` denotes a supported floating-point type.
-bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
+bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI, Register &MatchInfo) const {
   Register NonConstReg;
   std::optional<FPValueAndVReg> ConstVal;
 
@@ -252,6 +252,7 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
   if (!ConstVal)
     return false;
 
+  MatchInfo = NonConstReg;
   APFloat Expected(180.0 / llvm::numbers::pi);
   bool LostInfo = false;
   Expected.convert(ConstVal->Value.getSemantics(), APFloat::rmNearestTiesToEven,
@@ -259,17 +260,11 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI) const {
   return Expected.compare(ConstVal->Value) == APFloat::cmpEqual;
 }
 
-void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI) const {
+void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI, Register &MatchInfo) const {
   Register ResultReg = MI.getOperand(0).getReg();
-
-  Register Operand1 = MI.getOperand(1).getReg();
-  Register Operand2 = MI.getOperand(2).getReg();
-  bool Operand2IsConst = getFConstantSplat(Operand2, MRI) ||
-                         getFConstantVRegValWithLookThrough(Operand2, MRI);
-  Register NonConstReg = Operand2IsConst ? Operand1 : Operand2;
-
+  
   Builder.setInstrAndDebugLoc(MI);
-  Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg).addUse(NonConstReg);
+  Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg).addUse(MatchInfo);
 
   MI.eraseFromParent();
 }
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
index 1315fa558fcf7..b105aac0b15ba 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
@@ -35,8 +35,8 @@ class SPIRVCombinerHelper : public CombinerHelper {
   void applySPIRVNormalize(MachineInstr &MI) const;
   bool matchSelectToFaceForward(MachineInstr &MI) const;
   void applySPIRVFaceForward(MachineInstr &MI) const;
-  bool matchDegrees(MachineInstr &MI) const;
-  void applyDegrees(MachineInstr &MI) const;
+  bool matchDegrees(MachineInstr &MI, Register &MatchInfo) const;
+  void applyDegrees(MachineInstr &MI, Register &MatchInfo) const;
   void applyMatrixTranspose(MachineInstr &MI) const;
   void applyMatrixMultiply(MachineInstr &MI) const;
 

>From 6466d1177c6a0785f1f15f7efccc725d6236eca9 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 12 Sep 2026 23:34:42 +0530
Subject: [PATCH 18/19] review suggestions taken into consideration

---
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 21971e1197e49..481b6b88ed314 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -239,7 +239,8 @@ void SPIRVCombinerHelper::applySPIRVFaceForward(MachineInstr &MI) const {
 ///   (vXfN (g_fmul (vXfN X) (vXfN splat(180/pi)))) ->
 ///   (vXfN (g_intrinsic degrees (vXfN X)))
 /// where `fN` denotes a supported floating-point type.
-bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI, Register &MatchInfo) const {
+bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI,
+                                       Register &MatchInfo) const {
   Register NonConstReg;
   std::optional<FPValueAndVReg> ConstVal;
 
@@ -260,9 +261,10 @@ bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI, Register &MatchInfo) co
   return Expected.compare(ConstVal->Value) == APFloat::cmpEqual;
 }
 
-void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI, Register &MatchInfo) const {
+void SPIRVCombinerHelper::applyDegrees(MachineInstr &MI,
+                                       Register &MatchInfo) const {
   Register ResultReg = MI.getOperand(0).getReg();
-  
+
   Builder.setInstrAndDebugLoc(MI);
   Builder.buildIntrinsic(Intrinsic::spv_degrees, ResultReg).addUse(MatchInfo);
 

>From 7873421831c25f0a95a7241521f2bec928b437a1 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 19 Sep 2026 02:14:30 +0530
Subject: [PATCH 19/19] review comments resolved regarding using lhs rhs

---
 llvm/lib/Target/SPIRV/SPIRVCombine.td         |  2 +-
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp | 10 +++-------
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h   |  2 +-
 3 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCombine.td b/llvm/lib/Target/SPIRV/SPIRVCombine.td
index 4e0d30715b38b..80c4c36d4ddc5 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombine.td
+++ b/llvm/lib/Target/SPIRV/SPIRVCombine.td
@@ -33,7 +33,7 @@ def degrees_matchdata : GIDefMatchData<"Register">;
 def degrees_lowering
     : GICombineRule<(defs root:$root, degrees_matchdata:$matchinfo),
                     (match (G_FMUL $dst, $lhs, $rhs):$root,
-                        [{ return Helper.matchDegrees(*${root}, ${matchinfo}); }]),
+                        [{ return Helper.matchDegrees(${lhs}.getReg(), ${rhs}.getReg(), ${matchinfo}); }]),
                     (apply [{ Helper.applyDegrees(*${root}, ${matchinfo}); }])>;
 
 def matrix_transpose_lowering
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 481b6b88ed314..4378edf9f94f2 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -239,21 +239,17 @@ void SPIRVCombinerHelper::applySPIRVFaceForward(MachineInstr &MI) const {
 ///   (vXfN (g_fmul (vXfN X) (vXfN splat(180/pi)))) ->
 ///   (vXfN (g_intrinsic degrees (vXfN X)))
 /// where `fN` denotes a supported floating-point type.
-bool SPIRVCombinerHelper::matchDegrees(MachineInstr &MI,
+bool SPIRVCombinerHelper::matchDegrees(Register LHS, Register RHS,
                                        Register &MatchInfo) const {
-  Register NonConstReg;
   std::optional<FPValueAndVReg> ConstVal;
 
-  if (!mi_match(MI.getOperand(0).getReg(), MRI,
-                m_GFMul(m_Reg(NonConstReg), m_GFCstOrSplat(ConstVal))) &&
-      !mi_match(MI.getOperand(0).getReg(), MRI,
-                m_GFMul(m_GFCstOrSplat(ConstVal), m_Reg(NonConstReg))))
+  if (!mi_match(RHS, MRI, m_GFCstOrSplat(ConstVal)))
     return false;
 
   if (!ConstVal)
     return false;
 
-  MatchInfo = NonConstReg;
+  MatchInfo = LHS;
   APFloat Expected(180.0 / llvm::numbers::pi);
   bool LostInfo = false;
   Expected.convert(ConstVal->Value.getSemantics(), APFloat::rmNearestTiesToEven,
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
index b105aac0b15ba..952dd3022cc59 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
@@ -35,7 +35,7 @@ class SPIRVCombinerHelper : public CombinerHelper {
   void applySPIRVNormalize(MachineInstr &MI) const;
   bool matchSelectToFaceForward(MachineInstr &MI) const;
   void applySPIRVFaceForward(MachineInstr &MI) const;
-  bool matchDegrees(MachineInstr &MI, Register &MatchInfo) const;
+  bool matchDegrees(Register LHS, Register RHS, Register &MatchInfo) const;
   void applyDegrees(MachineInstr &MI, Register &MatchInfo) const;
   void applyMatrixTranspose(MachineInstr &MI) const;
   void applyMatrixMultiply(MachineInstr &MI) const;



More information about the llvm-commits mailing list