Index: llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h =================================================================== --- llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h +++ llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h @@ -351,8 +351,6 @@ void applyCombineUnmergeZExtToZExt(MachineInstr &MI); /// Transform fp_instr(cst) to constant result of the fp operation. - bool matchCombineConstantFoldFpUnary(MachineInstr &MI, - const ConstantFP *&Cst); void applyCombineConstantFoldFpUnary(MachineInstr &MI, const ConstantFP *Cst); /// Transform IntToPtr(PtrToInt(x)) to x if cast is in the same address space. Index: llvm/include/llvm/Target/GlobalISel/Combine.td =================================================================== --- llvm/include/llvm/Target/GlobalISel/Combine.td +++ llvm/include/llvm/Target/GlobalISel/Combine.td @@ -461,14 +461,26 @@ >; // Fold fp_op(cst) to the constant result of the floating point operation. -def constant_fp_op_matchinfo: GIDefMatchData<"const ConstantFP *">; -def constant_fp_op: GICombineRule < - (defs root:$root, constant_fp_op_matchinfo:$info), - (match (wip_match_opcode G_FNEG, G_FABS, G_FPTRUNC, G_FSQRT, G_FLOG2):$root, - [{ return Helper.matchCombineConstantFoldFpUnary(*${root}, ${info}); }]), - (apply [{ Helper.applyCombineConstantFoldFpUnary(*${root}, ${info}); }]) +class constant_fold_unary_fp_op_rule : GICombineRule < + (defs root:$dst), + (match (opcode $dst, $src0):$root, (G_FCONSTANT $src0, $cst)), + (apply [{ Helper.applyCombineConstantFoldFpUnary(*${root}, ${cst}.getFPImm()); }]) >; +def constant_fold_fneg : constant_fold_unary_fp_op_rule; +def constant_fold_fabs : constant_fold_unary_fp_op_rule; +def constant_fold_fsqrt : constant_fold_unary_fp_op_rule; +def constant_fold_flog2 : constant_fold_unary_fp_op_rule; +def constant_fold_fptrunc : constant_fold_unary_fp_op_rule; + +def constant_fold_fp_ops : GICombineGroup<[ + constant_fold_fneg, + constant_fold_fabs, + constant_fold_fsqrt, + constant_fold_flog2, + constant_fold_fptrunc +]>; + // Fold int2ptr(ptr2int(x)) -> x def p2i_to_i2p: GICombineRule< (defs root:$root, register_matchinfo:$info), @@ -1065,7 +1077,7 @@ trunc_lshr_buildvector_fold, bitcast_bitcast_fold, fptrunc_fpext_fold]>; -def const_combines : GICombineGroup<[constant_fp_op, const_ptradd_to_i2p, +def const_combines : GICombineGroup<[constant_fold_fp_ops, const_ptradd_to_i2p, overlapping_and, mulo_by_2, mulo_by_0, addo_by_0, adde_to_addo, combine_minmax_nan]>; Index: llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -1288,9 +1288,9 @@ LegalizerHelper::LegalizeResult::Legalized; } -static std::optional -constantFoldFpUnary(const MachineInstr &MI, const MachineRegisterInfo &MRI, - const APFloat &Val) { +static APFloat constantFoldFpUnary(const MachineInstr &MI, + const MachineRegisterInfo &MRI, + const APFloat &Val) { APFloat V(Val); switch (MI.getOpcode()) { default: @@ -1331,25 +1331,12 @@ return V; } -bool CombinerHelper::matchCombineConstantFoldFpUnary(MachineInstr &MI, - const ConstantFP *&Cst) { - Register SrcReg = MI.getOperand(1).getReg(); - const ConstantFP *MaybeCst = getConstantFPVRegVal(SrcReg, MRI); - if (!MaybeCst) - return false; - - if (auto Folded = constantFoldFpUnary(MI, MRI, MaybeCst->getValue())) { - Cst = ConstantFP::get(Builder.getContext(), *Folded); - return true; - } - - return false; -} - void CombinerHelper::applyCombineConstantFoldFpUnary(MachineInstr &MI, const ConstantFP *Cst) { Builder.setInstrAndDebugLoc(MI); - Builder.buildFConstant(MI.getOperand(0), *Cst); + APFloat Folded = constantFoldFpUnary(MI, MRI, Cst->getValue()); + const ConstantFP *NewCst = ConstantFP::get(Builder.getContext(), Folded); + Builder.buildFConstant(MI.getOperand(0), *NewCst); MI.eraseFromParent(); }