[llvm] Add PreLegalizer pattern matching for degrees GL extension (PR #216506)
Kaitlin Peng via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 10:48:58 PDT 2026
================
@@ -381,3 +381,53 @@ 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 / llvm::numbers::pi);
+ bool LostInfo = false;
+ Expected.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &LostInfo);
+
+ if (Expected.compare(Val) != APFloat::cmpEqual)
+ return false;
+
+ return true;
----------------
kmpeng wrote:
In general, `matchDegrees` is too complicated for what it's supposed to be matching and you're double checking a lot of conditions. If you use `mi_match` your code should become much simpler. Look at the distance and faceforward matchers for reference.
https://github.com/llvm/llvm-project/pull/216506
More information about the llvm-commits
mailing list