Skip to content

Commit 69b39e7

Browse files
authored
[SelectionDAG] Add support for extending masked loads in computeKnownBits (#115450)
We already support computing known bits for extending loads, but not for masked loads. For now I've only added support for zero-extends because that's the only thing currently tested. Even when the passthru value is poison we still know the top X bits are zero.
1 parent 911cee2 commit 69b39e7

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3920,6 +3920,19 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
39203920
Known.Zero.setBitsFrom(1);
39213921
break;
39223922
}
3923+
case ISD::MGATHER:
3924+
case ISD::MLOAD: {
3925+
ISD::LoadExtType ETy =
3926+
(Opcode == ISD::MGATHER)
3927+
? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3928+
: cast<MaskedLoadSDNode>(Op)->getExtensionType();
3929+
if (ETy == ISD::ZEXTLOAD) {
3930+
EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3931+
KnownBits Known0(MemVT.getScalarSizeInBits());
3932+
return Known0.zext(BitWidth);
3933+
}
3934+
break;
3935+
}
39233936
case ISD::LOAD: {
39243937
LoadSDNode *LD = cast<LoadSDNode>(Op);
39253938
const Constant *Cst = TLI->getTargetConstantFromLoad(LD);

llvm/test/CodeGen/AArch64/sve-hadd.ll

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,10 +1347,8 @@ define void @zext_mload_avgflooru(ptr %p1, ptr %p2, <vscale x 8 x i1> %mask) {
13471347
; SVE: // %bb.0:
13481348
; SVE-NEXT: ld1b { z0.h }, p0/z, [x0]
13491349
; SVE-NEXT: ld1b { z1.h }, p0/z, [x1]
1350-
; SVE-NEXT: eor z2.d, z0.d, z1.d
1351-
; SVE-NEXT: and z0.d, z0.d, z1.d
1352-
; SVE-NEXT: lsr z1.h, z2.h, #1
13531350
; SVE-NEXT: add z0.h, z0.h, z1.h
1351+
; SVE-NEXT: lsr z0.h, z0.h, #1
13541352
; SVE-NEXT: st1h { z0.h }, p0, [x0]
13551353
; SVE-NEXT: ret
13561354
;
@@ -1377,11 +1375,11 @@ define void @zext_mload_avgceilu(ptr %p1, ptr %p2, <vscale x 8 x i1> %mask) {
13771375
; SVE-LABEL: zext_mload_avgceilu:
13781376
; SVE: // %bb.0:
13791377
; SVE-NEXT: ld1b { z0.h }, p0/z, [x0]
1380-
; SVE-NEXT: ld1b { z1.h }, p0/z, [x1]
1381-
; SVE-NEXT: eor z2.d, z0.d, z1.d
1382-
; SVE-NEXT: orr z0.d, z0.d, z1.d
1383-
; SVE-NEXT: lsr z1.h, z2.h, #1
1384-
; SVE-NEXT: sub z0.h, z0.h, z1.h
1378+
; SVE-NEXT: mov z1.h, #-1 // =0xffffffffffffffff
1379+
; SVE-NEXT: ld1b { z2.h }, p0/z, [x1]
1380+
; SVE-NEXT: eor z0.d, z0.d, z1.d
1381+
; SVE-NEXT: sub z0.h, z2.h, z0.h
1382+
; SVE-NEXT: lsr z0.h, z0.h, #1
13851383
; SVE-NEXT: st1b { z0.h }, p0, [x0]
13861384
; SVE-NEXT: ret
13871385
;

0 commit comments

Comments
 (0)