Skip to content

Commit f02f7b5

Browse files
committed
Missing AArch64ISD::BICi handling
1 parent 5e77dfe commit f02f7b5

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -24555,6 +24555,19 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
2455524555
if (auto R = foldOverflowCheck(N, DAG, /* IsAdd */ false))
2455624556
return R;
2455724557
return performFlagSettingCombine(N, DCI, AArch64ISD::SBC);
24558+
case AArch64ISD::BICi: {
24559+
KnownBits Known;
24560+
APInt DemandedBits =
24561+
APInt::getAllOnes(N->getValueType(0).getScalarSizeInBits());
24562+
APInt DemandedElts =
24563+
APInt::getAllOnes(N->getValueType(0).getVectorNumElements());
24564+
24565+
if (DAG.getTargetLoweringInfo().SimplifyDemandedBits(
24566+
SDValue(N, 0), DemandedBits, DemandedElts, DCI))
24567+
return SDValue();
24568+
24569+
break;
24570+
}
2455824571
case ISD::XOR:
2455924572
return performXorCombine(N, DAG, DCI, Subtarget);
2456024573
case ISD::MUL:
@@ -27595,6 +27608,24 @@ bool AArch64TargetLowering::SimplifyDemandedBitsForTargetNode(
2759527608
// used - simplify to just Val.
2759627609
return TLO.CombineTo(Op, ShiftR->getOperand(0));
2759727610
}
27611+
case AArch64ISD::BICi: {
27612+
// Fold BICi if all destination bits already known to be zeroed
27613+
SDValue Op0 = Op.getOperand(0);
27614+
KnownBits KnownOp0 =
27615+
TLO.DAG.computeKnownBits(Op0, OriginalDemandedElts, Depth + 1);
27616+
// Op0 &= ~(ConstantOperandVal(1) << ConstantOperandVal(2))
27617+
uint64_t BitsToClear = Op->getConstantOperandVal(1)
27618+
<< Op->getConstantOperandVal(2);
27619+
APInt AlreadyZeroedBitsToClear = BitsToClear & KnownOp0.Zero;
27620+
if (APInt(Known.getBitWidth(), BitsToClear)
27621+
.isSubsetOf(AlreadyZeroedBitsToClear))
27622+
return TLO.CombineTo(Op, Op0);
27623+
27624+
Known = KnownOp0 &
27625+
KnownBits::makeConstant(APInt(Known.getBitWidth(), ~BitsToClear));
27626+
27627+
return false;
27628+
}
2759827629
case ISD::INTRINSIC_WO_CHAIN: {
2759927630
if (auto ElementSize = IsSVECntIntrinsic(Op)) {
2760027631
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)