[llvm] GlobalISel needs fdiv 1 / sqrt(x) to rsq combine (PR #78673)
Pierre van Houtryve via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 19 00:06:42 PST 2024
================
@@ -334,6 +337,59 @@ bool AMDGPUPostLegalizerCombinerImpl::matchRcpSqrtToRsq(
return false;
}
+bool AMDGPUPostLegalizerCombinerImpl::matchFDivSqrt(
+ MachineInstr &MI,
+ std::function<void(MachineIRBuilder &)> &MatchInfo) const {
+
+ // TODO: Can I match fdiv 1.0 / sqrt(x) from here?
+ // My apologies, this code is still a mess. Trying to figure out
+ // what value MI should hold when getting to this point
+
+ auto getSqrtSrc = [=](const MachineInstr &MI) -> MachineInstr * {
+ if (!MI.getFlag(MachineInstr::FmContract))
+ return nullptr;
+ MachineInstr *SqrtSrcMI = nullptr;
+ auto Match =
+ mi_match(MI.getOperand(0).getReg(), MRI, m_GFSqrt(m_MInstr(SqrtSrcMI)));
+ (void)Match;
+ return SqrtSrcMI;
+ };
+
+ // Do I need to match write a matcher for %one:_(s16) = G_FCONSTANT half 1.0
+ // ??
+
+ auto getFdivSrc = [=](const MachineInstr &MI) -> MachineInstr * {
+ if (!MI.getFlag(MachineInstr::FmContract))
+ return nullptr;
+
+ MachineInstr *FDivSrcMI = nullptr;
+ Register One;
+ auto Match = mi_match(MI.getOperand(0).getReg(), MRI,
+ m_GFDiv(m_Reg(One), m_MInstr(FDivSrcMI)));
+ // Not sure how to check for FDiv operancd has a 1.0 value ?
----------------
Pierre-vh wrote:
https://llvm.org/doxygen/classllvm_1_1ConstantFP.html#a69943c1bc81f3680f6f696b6565853e5
https://github.com/llvm/llvm-project/pull/78673
More information about the llvm-commits
mailing list