@@ -2529,6 +2529,23 @@ static SDValue foldAddSubBoolOfMaskedVal(SDNode *N, SelectionDAG &DAG) {
2529
2529
return DAG.getNode(IsAdd ? ISD::SUB : ISD::ADD, DL, VT, C1, LowBit);
2530
2530
}
2531
2531
2532
+ // Attempt to form avgceilu(A, B) from (A | B) - ((A ^ B) >> 1)
2533
+ static SDValue combineFixedwidthToAVGCEILU(SDNode *N, SelectionDAG &DAG) {
2534
+ const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2535
+ SDValue N0 = N->getOperand(0);
2536
+ EVT VT = N0.getValueType();
2537
+ SDLoc DL(N);
2538
+ if (TLI.isOperationLegal(ISD::AVGCEILU, VT)) {
2539
+ SDValue A, B;
2540
+ if (sd_match(N, m_Sub(m_Or(m_Value(A), m_Value(B)),
2541
+ m_Srl(m_Xor(m_Deferred(A), m_Deferred(B)),
2542
+ m_SpecificInt(1))))) {
2543
+ return DAG.getNode(ISD::AVGCEILU, DL, VT, A, B);
2544
+ }
2545
+ }
2546
+ return SDValue();
2547
+ }
2548
+
2532
2549
/// Try to fold a 'not' shifted sign-bit with add/sub with constant operand into
2533
2550
/// a shift and add with a different constant.
2534
2551
static SDValue foldAddSubOfSignBit(SDNode *N, SelectionDAG &DAG) {
@@ -3849,6 +3866,10 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
3849
3866
if (SDValue V = foldAddSubOfSignBit(N, DAG))
3850
3867
return V;
3851
3868
3869
+ // Try to match AVGCEILU fixedwidth pattern
3870
+ if (SDValue V = combineFixedwidthToAVGCEILU(N, DAG))
3871
+ return V;
3872
+
3852
3873
if (SDValue V = foldAddSubMasked1(false, N0, N1, DAG, SDLoc(N)))
3853
3874
return V;
3854
3875
0 commit comments