[llvm] [GlobalISel][AArch64][AMDGPU] Lower FPOWI into series of multiplication (PR #95217)
Thorsten Schütt via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 12 04:59:05 PDT 2024
================
@@ -7142,14 +7142,50 @@ LegalizerHelper::lowerFPTRUNC(MachineInstr &MI) {
return UnableToLegalize;
}
-// TODO: If RHS is a constant SelectionDAGBuilder expands this into a
-// multiplication tree.
LegalizerHelper::LegalizeResult LegalizerHelper::lowerFPOWI(MachineInstr &MI) {
- auto [Dst, Src0, Src1] = MI.getFirst3Regs();
+ auto [Dst, Base, Exp] = MI.getFirst3Regs();
LLT Ty = MRI.getType(Dst);
- auto CvtSrc1 = MIRBuilder.buildSITOFP(Ty, Src1);
- MIRBuilder.buildFPow(Dst, Src0, CvtSrc1, MI.getFlags());
+ MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
+ std::optional<int64_t> ConstantExpValue = getIConstantVRegSExtVal(Exp, MRI);
+
+ if (!ConstantExpValue)
+ return UnableToLegalize;
+
+ int64_t OriginalExprVal = *ConstantExpValue;
+ int64_t ExpVal = OriginalExprVal;
+
+ if (ExpVal == 0) {
+ MIRBuilder.buildFConstant(Dst, 1.0);
+ MI.removeFromParent();
+ return Legalized;
+ }
+
+ if (ExpVal < 0)
+ ExpVal = -ExpVal;
+
+ Register Res = MRI.createGenericVirtualRegister(Ty);
+ MIRBuilder.buildCopy(Res, Base);
----------------
tschuett wrote:
It looks cuter, when the first parameter is a type. Then you don't need to create virtual registers manually.
https://github.com/llvm/llvm-project/pull/95217
More information about the llvm-commits
mailing list