Skip to content

Commit afa5a78

Browse files
committed
Missing AArch64ISD::BICi handling
1 parent 6a0618a commit afa5a78

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -3416,13 +3416,18 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
34163416
Known = KnownBits::mulhs(Known, Known2);
34173417
break;
34183418
}
3419-
case ISD::AVGCEILU: {
3419+
case ISD::AVGFLOORU:
3420+
case ISD::AVGCEILU:
3421+
case ISD::AVGFLOORS:
3422+
case ISD::AVGCEILS: {
3423+
bool IsCeil = Opcode == ISD::AVGCEILU || Opcode == ISD::AVGCEILS;
3424+
bool IsSigned = Opcode == ISD::AVGFLOORS || Opcode == ISD::AVGCEILS;
34203425
Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
34213426
Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3422-
Known = Known.zext(BitWidth + 1);
3423-
Known2 = Known2.zext(BitWidth + 1);
3424-
KnownBits One = KnownBits::makeConstant(APInt(1, 1));
3425-
Known = KnownBits::computeForAddCarry(Known, Known2, One);
3427+
Known = IsSigned ? Known.sext(BitWidth + 1) : Known.zext(BitWidth + 1);
3428+
Known2 = IsSigned ? Known2.sext(BitWidth + 1) : Known2.zext(BitWidth + 1);
3429+
KnownBits Carry = KnownBits::makeConstant(APInt(1, IsCeil ? 1 : 0));
3430+
Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
34263431
Known = Known.extractBits(BitWidth, 1);
34273432
break;
34283433
}

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

+30
Original file line numberDiff line numberDiff line change
@@ -24387,6 +24387,19 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
2438724387
if (auto R = foldOverflowCheck(N, DAG, /* IsAdd */ false))
2438824388
return R;
2438924389
return performFlagSettingCombine(N, DCI, AArch64ISD::SBC);
24390+
case AArch64ISD::BICi: {
24391+
KnownBits Known;
24392+
APInt DemandedBits =
24393+
APInt::getAllOnes(N->getValueType(0).getScalarSizeInBits());
24394+
APInt DemandedElts =
24395+
APInt::getAllOnes(N->getValueType(0).getVectorNumElements());
24396+
TargetLowering::TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
24397+
!DCI.isBeforeLegalizeOps());
24398+
if (DAG.getTargetLoweringInfo().SimplifyDemandedBits(
24399+
SDValue(N, 0), DemandedBits, DemandedElts, Known, TLO))
24400+
return TLO.New;
24401+
break;
24402+
}
2439024403
case ISD::XOR:
2439124404
return performXorCombine(N, DAG, DCI, Subtarget);
2439224405
case ISD::MUL:
@@ -27427,6 +27440,23 @@ bool AArch64TargetLowering::SimplifyDemandedBitsForTargetNode(
2742727440
// used - simplify to just Val.
2742827441
return TLO.CombineTo(Op, ShiftR->getOperand(0));
2742927442
}
27443+
case AArch64ISD::BICi: {
27444+
// Fold BICi if all destination bits already known to be zeroed
27445+
SDValue Op0 = Op.getOperand(0);
27446+
KnownBits KnownOp0 =
27447+
TLO.DAG.computeKnownBits(Op0, OriginalDemandedElts, Depth + 1);
27448+
// Op0 &= ~(ConstantOperandVal(1) << ConstantOperandVal(2))
27449+
uint64_t BitsToClear = Op->getConstantOperandVal(1)
27450+
<< Op->getConstantOperandVal(2);
27451+
APInt AlreadyZeroedBitsToClear = BitsToClear & KnownOp0.Zero;
27452+
if (APInt(Known.getBitWidth(), BitsToClear)
27453+
.isSubsetOf(AlreadyZeroedBitsToClear))
27454+
return TLO.CombineTo(Op, Op0);
27455+
27456+
Known &= KnownBits::makeConstant(APInt(Known.getBitWidth(), ~BitsToClear));
27457+
27458+
return false;
27459+
}
2743027460
case ISD::INTRINSIC_WO_CHAIN: {
2743127461
if (auto ElementSize = IsSVECntIntrinsic(Op)) {
2743227462
unsigned MaxSVEVectorSizeInBits = Subtarget->getMaxSVEVectorSizeInBits();

llvm/test/CodeGen/AArch64/aarch64-known-bits-hadd.ll

-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ define <8 x i16> @haddu_zext(<8 x i8> %a0, <8 x i8> %a1) {
1212
; CHECK-NEXT: ushll v0.8h, v0.8b, #0
1313
; CHECK-NEXT: ushll v1.8h, v1.8b, #0
1414
; CHECK-NEXT: uhadd v0.8h, v0.8h, v1.8h
15-
; CHECK-NEXT: bic v0.8h, #254, lsl #8
1615
; CHECK-NEXT: ret
1716
%x0 = zext <8 x i8> %a0 to <8 x i16>
1817
%x1 = zext <8 x i8> %a1 to <8 x i16>
@@ -27,7 +26,6 @@ define <8 x i16> @rhaddu_zext(<8 x i8> %a0, <8 x i8> %a1) {
2726
; CHECK-NEXT: ushll v0.8h, v0.8b, #0
2827
; CHECK-NEXT: ushll v1.8h, v1.8b, #0
2928
; CHECK-NEXT: urhadd v0.8h, v0.8h, v1.8h
30-
; CHECK-NEXT: bic v0.8h, #254, lsl #8
3129
; CHECK-NEXT: ret
3230
%x0 = zext <8 x i8> %a0 to <8 x i16>
3331
%x1 = zext <8 x i8> %a1 to <8 x i16>
@@ -42,7 +40,6 @@ define <8 x i16> @hadds_zext(<8 x i8> %a0, <8 x i8> %a1) {
4240
; CHECK-NEXT: ushll v0.8h, v0.8b, #0
4341
; CHECK-NEXT: ushll v1.8h, v1.8b, #0
4442
; CHECK-NEXT: shadd v0.8h, v0.8h, v1.8h
45-
; CHECK-NEXT: bic v0.8h, #254, lsl #8
4643
; CHECK-NEXT: ret
4744
%x0 = zext <8 x i8> %a0 to <8 x i16>
4845
%x1 = zext <8 x i8> %a1 to <8 x i16>
@@ -57,7 +54,6 @@ define <8 x i16> @shaddu_zext(<8 x i8> %a0, <8 x i8> %a1) {
5754
; CHECK-NEXT: ushll v0.8h, v0.8b, #0
5855
; CHECK-NEXT: ushll v1.8h, v1.8b, #0
5956
; CHECK-NEXT: srhadd v0.8h, v0.8h, v1.8h
60-
; CHECK-NEXT: bic v0.8h, #254, lsl #8
6157
; CHECK-NEXT: ret
6258
%x0 = zext <8 x i8> %a0 to <8 x i16>
6359
%x1 = zext <8 x i8> %a1 to <8 x i16>

0 commit comments

Comments
 (0)