Skip to content

Commit f6add38

Browse files
committed
[DAG] computeKnownBits - abds(x, y) will be zero in the upper bits if x and y are sign-extended
As reported on #94442 - if x and y have more than one signbit, then the upper bits of its absolute value are guaranteed to be zero Alive2: https://alive2.llvm.org/ce/z/7_z2Vc
1 parent e69db9d commit f6add38

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3477,6 +3477,13 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
34773477
Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
34783478
Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
34793479
Known = KnownBits::abds(Known, Known2);
3480+
unsigned SignBits1 =
3481+
ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3482+
if (SignBits1 == 1)
3483+
break;
3484+
unsigned SignBits0 =
3485+
ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3486+
Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
34803487
break;
34813488
}
34823489
case ISD::UMUL_LOHI: {

llvm/test/CodeGen/AArch64/neon-abd.ll

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -554,19 +554,11 @@ define <16 x i8> @umaxmin_v16i8_com1(<16 x i8> %0, <16 x i8> %1) {
554554
ret <16 x i8> %sub
555555
}
556556

557-
; TODO: (abds x, y) upper bits are known zero if x and y have extra sign bits
557+
; (abds x, y) upper bits are known zero if x and y have extra sign bits
558558
define <4 x i16> @combine_sabd_4h_zerosign(<4 x i16> %a, <4 x i16> %b) #0 {
559559
; CHECK-LABEL: combine_sabd_4h_zerosign:
560560
; CHECK: // %bb.0:
561-
; CHECK-NEXT: adrp x8, .LCPI41_0
562-
; CHECK-NEXT: adrp x9, .LCPI41_1
563-
; CHECK-NEXT: ldr d2, [x8, :lo12:.LCPI41_0]
564-
; CHECK-NEXT: ldr d3, [x9, :lo12:.LCPI41_1]
565-
; CHECK-NEXT: sshl v0.4h, v0.4h, v2.4h
566-
; CHECK-NEXT: sshl v1.4h, v1.4h, v3.4h
567-
; CHECK-NEXT: movi v2.4h, #128, lsl #8
568-
; CHECK-NEXT: sabd v0.4h, v0.4h, v1.4h
569-
; CHECK-NEXT: and v0.8b, v0.8b, v2.8b
561+
; CHECK-NEXT: movi v0.2d, #0000000000000000
570562
; CHECK-NEXT: ret
571563
%a.ext = ashr <4 x i16> %a, <i16 7, i16 8, i16 9, i16 10>
572564
%b.ext = ashr <4 x i16> %b, <i16 11, i16 12, i16 13, i16 14>

0 commit comments

Comments
 (0)