[PATCH] D99035: GlobalISel: Add utility function to constant fold FP ops
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 21 07:05:31 PDT 2021
arsenm created this revision.
arsenm added reviewers: paquette, aemerson, bogner, dsanders.
Herald added subscribers: hiraditya, rovka.
arsenm requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.
https://reviews.llvm.org/D99035
Files:
llvm/include/llvm/CodeGen/GlobalISel/Utils.h
llvm/lib/CodeGen/GlobalISel/Utils.cpp
Index: llvm/lib/CodeGen/GlobalISel/Utils.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/Utils.cpp
+++ llvm/lib/CodeGen/GlobalISel/Utils.cpp
@@ -490,6 +490,60 @@
return None;
}
+Optional<APFloat> llvm::ConstantFoldFPBinOp(unsigned Opcode, const Register Op1,
+ const Register Op2,
+ const MachineRegisterInfo &MRI) {
+ const ConstantFP *Op2Cst = getConstantFPVRegVal(Op2, MRI);
+ if (!Op2Cst)
+ return None;
+
+ const ConstantFP *Op1Cst = getConstantFPVRegVal(Op1, MRI);
+ if (!Op1Cst)
+ return None;
+
+ APFloat C1 = Op1Cst->getValueAPF();
+ const APFloat &C2 = Op2Cst->getValueAPF();
+ switch (Opcode) {
+ case TargetOpcode::G_FADD:
+ C1.add(C2, APFloat::rmNearestTiesToEven);
+ return C1;
+ case TargetOpcode::G_FSUB:
+ C1.subtract(C2, APFloat::rmNearestTiesToEven);
+ return C1;
+ case TargetOpcode::G_FMUL:
+ C1.multiply(C2, APFloat::rmNearestTiesToEven);
+ return C1;
+ case TargetOpcode::G_FDIV:
+ C1.divide(C2, APFloat::rmNearestTiesToEven);
+ return C1;
+ case TargetOpcode::G_FREM:
+ C1.mod(C2);
+ return C1;
+ case TargetOpcode::G_FCOPYSIGN:
+ C1.copySign(C2);
+ return C1;
+ case TargetOpcode::G_FMINNUM:
+ return minnum(C1, C2);
+ case TargetOpcode::G_FMAXNUM:
+ return maxnum(C1, C2);
+ case TargetOpcode::G_FMINIMUM:
+ return minimum(C1, C2);
+ case TargetOpcode::G_FMAXIMUM:
+ return maximum(C1, C2);
+ case TargetOpcode::G_FMINNUM_IEEE:
+ case TargetOpcode::G_FMAXNUM_IEEE:
+ // FIXME: These operations were unfortunately named. fminnum/fmaxnum do not
+ // follow the IEEE behavior for signaling nans and follow libm's fmin/fmax,
+ // and currently there isn't a nice wrapper in APFloat for the version with
+ // correct snan handling.
+ break;
+ default:
+ break;
+ }
+
+ return None;
+}
+
bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI,
bool SNaN) {
const MachineInstr *DefMI = MRI.getVRegDef(Val);
Index: llvm/include/llvm/CodeGen/GlobalISel/Utils.h
===================================================================
--- llvm/include/llvm/CodeGen/GlobalISel/Utils.h
+++ llvm/include/llvm/CodeGen/GlobalISel/Utils.h
@@ -204,6 +204,9 @@
Optional<APInt> ConstantFoldBinOp(unsigned Opcode, const Register Op1,
const Register Op2,
const MachineRegisterInfo &MRI);
+Optional<APFloat> ConstantFoldFPBinOp(unsigned Opcode, const Register Op1,
+ const Register Op2,
+ const MachineRegisterInfo &MRI);
Optional<APInt> ConstantFoldExtOp(unsigned Opcode, const Register Op1,
uint64_t Imm, const MachineRegisterInfo &MRI);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99035.332155.patch
Type: text/x-patch
Size: 2913 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210321/7f8c6c03/attachment.bin>
More information about the llvm-commits
mailing list