[llvm-branch-commits] [llvm] [DAGCombiner][GlobalISel] Extend allMulUsesCanBeContracted with FPEXT pattern (PR #188116)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Apr 10 03:49:35 PDT 2026
================
@@ -6329,13 +6334,66 @@ bool CombinerHelper::allMulUsesCanBeContracted(const MachineInstr &MI) const {
if (Opcode == TargetOpcode::G_FADD || Opcode == TargetOpcode::G_FSUB)
continue;
- // G_FNEG use - contractable if all users of the fneg are G_FSUB.
+ // FNEG --> FSUB pattern
+ // Also handles FNEG --> FPEXT --> FSUB
if (Opcode == TargetOpcode::G_FNEG) {
Register FNegReg = UseMI.getOperand(0).getReg();
- for (const MachineInstr &FNegUser : MRI.use_nodbg_instructions(FNegReg)) {
- unsigned FNegUserOp = FNegUser.getOpcode();
- if (FNegUserOp != TargetOpcode::G_FSUB)
+ // ALL users of the FNEG must be contractable FSUBs or FPEXTs leading to
+ // FSUBs
+ for (const MachineInstr &FNegUseMI :
+ MRI.use_nodbg_instructions(FNegReg)) {
+ unsigned FNegUseOpcode = FNegUseMI.getOpcode();
+
+ if (FNegUseOpcode == TargetOpcode::G_FSUB)
+ continue;
+ if (FNegUseOpcode == TargetOpcode::G_FPEXT) {
+ // FNEG --> FPEXT --> FSUB
+ Register FNegFPExtReg = FNegUseMI.getOperand(0).getReg();
+ for (const MachineInstr &FNegFPExtUseMI :
+ MRI.use_nodbg_instructions(FNegFPExtReg)) {
+ if (FNegFPExtUseMI.getOpcode() != TargetOpcode::G_FSUB)
+ return false;
+ // FPEXT use is FSUB, check if can be folded in
+ if (!TLI.isFPExtFoldable(
+ FNegFPExtUseMI, PreferredFusedOpcode,
+ MRI.getType(FNegFPExtUseMI.getOperand(0).getReg()),
+ MRI.getType(FNegReg)))
----------------
arsenm wrote:
Won't this getType be the same as the original type?
https://github.com/llvm/llvm-project/pull/188116
More information about the llvm-branch-commits
mailing list