[PATCH] D140181: DAG: Pull fneg out of select feeding fadd into fsub

Matt Arsenault via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 15 17:20:23 PST 2022


arsenm created this revision.
arsenm added reviewers: bogner, spatel, RKSimon, foad.
Herald added subscribers: kosarev, hiraditya, tpr.
Herald added a project: All.
arsenm requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.

Enables folding fadd x, (select c, (fneg a), (fneg b))

  -> fsub (select a, b), c


Avoids some regressions in a future AMDGPU change.


https://reviews.llvm.org/D140181

Files:
  llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
  llvm/test/CodeGen/ARM/fadd-select-fneg-combine.ll


Index: llvm/test/CodeGen/ARM/fadd-select-fneg-combine.ll
===================================================================
--- llvm/test/CodeGen/ARM/fadd-select-fneg-combine.ll
+++ llvm/test/CodeGen/ARM/fadd-select-fneg-combine.ll
@@ -4,14 +4,12 @@
 define float @fadd_select_fneg_fneg_f32(i32 %arg0, float %x, float %y, float %z) {
 ; CHECK-LABEL: fadd_select_fneg_fneg_f32:
 ; CHECK:       @ %bb.0:
-; CHECK-NEXT:    eor r2, r2, #-2147483648
-; CHECK-NEXT:    eor r1, r1, #-2147483648
 ; CHECK-NEXT:    vmov s0, r3
 ; CHECK-NEXT:    cmp r0, #0
 ; CHECK-NEXT:    vmov s2, r2
 ; CHECK-NEXT:    vmov s4, r1
 ; CHECK-NEXT:    vseleq.f32 s2, s4, s2
-; CHECK-NEXT:    vadd.f32 s0, s2, s0
+; CHECK-NEXT:    vsub.f32 s0, s0, s2
 ; CHECK-NEXT:    vmov r0, s0
 ; CHECK-NEXT:    mov pc, lr
   %cmp = icmp eq i32 %arg0, 0
@@ -28,11 +26,9 @@
 ; CHECK-NEXT:    vmov.f16 s0, r2
 ; CHECK-NEXT:    cmp r0, #0
 ; CHECK-NEXT:    vmov.f16 s2, r1
-; CHECK-NEXT:    vneg.f16 s0, s0
-; CHECK-NEXT:    vneg.f16 s2, s2
 ; CHECK-NEXT:    vseleq.f16 s0, s2, s0
 ; CHECK-NEXT:    vmov.f16 s2, r3
-; CHECK-NEXT:    vadd.f16 s0, s0, s2
+; CHECK-NEXT:    vsub.f16 s0, s2, s0
 ; CHECK-NEXT:    vmov r0, s0
 ; CHECK-NEXT:    mov pc, lr
   %cmp = icmp eq i32 %arg0, 0
Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -7006,6 +7006,17 @@
                                             OptForSize, Cost, Depth))
       return DAG.getNode(ISD::FP_ROUND, DL, VT, NegV, Op.getOperand(1));
     break;
+  case ISD::SELECT: {
+    Cost = NegatibleCost::Cheaper;
+    SDValue LHS = Op.getOperand(1);
+    SDValue RHS = Op.getOperand(2);
+    if (LHS.getOpcode() == ISD::FNEG && RHS.getOpcode() == ISD::FNEG) {
+      return DAG.getNode(ISD::SELECT, DL, VT, Op.getOperand(0),
+                         LHS.getOperand(0), RHS.getOperand(0));
+    }
+
+    break;
+  }
   }
 
   return SDValue();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140181.483398.patch
Type: text/x-patch
Size: 2038 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221216/105db12f/attachment.bin>


More information about the llvm-commits mailing list