Skip to content

Commit 204701b

Browse files
committed
[DAGCombiner] Remove a hasOneUse check in visitAND
For some reason there was a hasOneUse check on the splat for the second operand and it's not obvious to me why. The check blocks optimisations for lowering of nodes like AVGFLOORU and AVGCEILU. In a follow-on patch I also plan to improve the generated code for AVGCEILU further by teaching computeKnownBits about zero-extending masked loads.
1 parent 3f6753b commit 204701b

File tree

2 files changed

+8
-15
lines changed

2 files changed

+8
-15
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7095,8 +7095,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
70957095
// fold (and (masked_load) (splat_vec (x, ...))) to zext_masked_load
70967096
auto *MLoad = dyn_cast<MaskedLoadSDNode>(N0);
70977097
ConstantSDNode *Splat = isConstOrConstSplat(N1, true, true);
7098-
if (MLoad && MLoad->getExtensionType() == ISD::EXTLOAD && Splat &&
7099-
N1.hasOneUse()) {
7098+
if (MLoad && MLoad->getExtensionType() == ISD::EXTLOAD && Splat) {
71007099
EVT LoadVT = MLoad->getMemoryVT();
71017100
EVT ExtVT = VT;
71027101
if (TLI.isLoadExtLegal(ISD::ZEXTLOAD, ExtVT, LoadVT)) {

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

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,10 +1347,10 @@ 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: and z0.h, z0.h, #0xff
1351-
; SVE-NEXT: and z1.h, z1.h, #0xff
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
13521353
; SVE-NEXT: add z0.h, z0.h, z1.h
1353-
; SVE-NEXT: lsr z0.h, z0.h, #1
13541354
; SVE-NEXT: st1h { z0.h }, p0, [x0]
13551355
; SVE-NEXT: ret
13561356
;
@@ -1359,8 +1359,6 @@ define void @zext_mload_avgflooru(ptr %p1, ptr %p2, <vscale x 8 x i1> %mask) {
13591359
; SVE2-NEXT: ld1b { z0.h }, p0/z, [x0]
13601360
; SVE2-NEXT: ld1b { z1.h }, p0/z, [x1]
13611361
; SVE2-NEXT: ptrue p1.h
1362-
; SVE2-NEXT: and z0.h, z0.h, #0xff
1363-
; SVE2-NEXT: and z1.h, z1.h, #0xff
13641362
; SVE2-NEXT: uhadd z0.h, p1/m, z0.h, z1.h
13651363
; SVE2-NEXT: st1h { z0.h }, p0, [x0]
13661364
; SVE2-NEXT: ret
@@ -1380,12 +1378,10 @@ define void @zext_mload_avgceilu(ptr %p1, ptr %p2, <vscale x 8 x i1> %mask) {
13801378
; SVE: // %bb.0:
13811379
; SVE-NEXT: ld1b { z0.h }, p0/z, [x0]
13821380
; SVE-NEXT: ld1b { z1.h }, p0/z, [x1]
1383-
; SVE-NEXT: mov z2.h, #-1 // =0xffffffffffffffff
1384-
; SVE-NEXT: and z0.h, z0.h, #0xff
1385-
; SVE-NEXT: and z1.h, z1.h, #0xff
1386-
; SVE-NEXT: eor z0.d, z0.d, z2.d
1387-
; SVE-NEXT: sub z0.h, z1.h, z0.h
1388-
; SVE-NEXT: lsr z0.h, z0.h, #1
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
13891385
; SVE-NEXT: st1b { z0.h }, p0, [x0]
13901386
; SVE-NEXT: ret
13911387
;
@@ -1394,8 +1390,6 @@ define void @zext_mload_avgceilu(ptr %p1, ptr %p2, <vscale x 8 x i1> %mask) {
13941390
; SVE2-NEXT: ld1b { z0.h }, p0/z, [x0]
13951391
; SVE2-NEXT: ld1b { z1.h }, p0/z, [x1]
13961392
; SVE2-NEXT: ptrue p1.h
1397-
; SVE2-NEXT: and z0.h, z0.h, #0xff
1398-
; SVE2-NEXT: and z1.h, z1.h, #0xff
13991393
; SVE2-NEXT: urhadd z0.h, p1/m, z0.h, z1.h
14001394
; SVE2-NEXT: st1b { z0.h }, p0, [x0]
14011395
; SVE2-NEXT: ret

0 commit comments

Comments
 (0)