Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit c155e8f

Browse files
committedMar 27, 2024·
Missing AArch64ISD::BICi handling
1 parent d312788 commit c155e8f

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
@@ -24580,6 +24580,19 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
2458024580
if (auto R = foldOverflowCheck(N, DAG, /* IsAdd */ false))
2458124581
return R;
2458224582
return performFlagSettingCombine(N, DCI, AArch64ISD::SBC);
24583+
case AArch64ISD::BICi: {
24584+
KnownBits Known;
24585+
APInt DemandedBits =
24586+
APInt::getAllOnes(N->getValueType(0).getScalarSizeInBits());
24587+
APInt DemandedElts =
24588+
APInt::getAllOnes(N->getValueType(0).getVectorNumElements());
24589+
TargetLowering::TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
24590+
!DCI.isBeforeLegalizeOps());
24591+
if (DAG.getTargetLoweringInfo().SimplifyDemandedBits(
24592+
SDValue(N, 0), DemandedBits, DemandedElts, Known, TLO))
24593+
return TLO.New;
24594+
break;
24595+
}
2458324596
case ISD::XOR:
2458424597
return performXorCombine(N, DAG, DCI, Subtarget);
2458524598
case ISD::MUL:
@@ -27620,6 +27633,24 @@ bool AArch64TargetLowering::SimplifyDemandedBitsForTargetNode(
2762027633
// used - simplify to just Val.
2762127634
return TLO.CombineTo(Op, ShiftR->getOperand(0));
2762227635
}
27636+
case AArch64ISD::BICi: {
27637+
// Fold BICi if all destination bits already known to be zeroed
27638+
SDValue Op0 = Op.getOperand(0);
27639+
KnownBits KnownOp0 =
27640+
TLO.DAG.computeKnownBits(Op0, OriginalDemandedElts, Depth + 1);
27641+
// Op0 &= ~(ConstantOperandVal(1) << ConstantOperandVal(2))
27642+
uint64_t BitsToClear = Op->getConstantOperandVal(1)
27643+
<< Op->getConstantOperandVal(2);
27644+
APInt AlreadyZeroedBitsToClear = BitsToClear & KnownOp0.Zero;
27645+
if (APInt(Known.getBitWidth(), BitsToClear)
27646+
.isSubsetOf(AlreadyZeroedBitsToClear))
27647+
return TLO.CombineTo(Op, Op0);
27648+
27649+
Known = KnownOp0 &
27650+
KnownBits::makeConstant(APInt(Known.getBitWidth(), ~BitsToClear));
27651+
27652+
return false;
27653+
}
2762327654
case ISD::INTRINSIC_WO_CHAIN: {
2762427655
if (auto ElementSize = IsSVECntIntrinsic(Op)) {
2762527656
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)
Please sign in to comment.