Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 8681051

Browse files
committed
[DAGCombine] Fix for PR37563
While searching for loads to be narrowed, equal sized loads were not added to the list, resulting in anyext loads not being converted to zext loads. https://bugs.llvm.org/show_bug.cgi?id=35763 Differential Revision: https://reviews.llvm.org/D41628 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321862 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent d84b15b commit 8681051

File tree

3 files changed

+21
-14
lines changed

3 files changed

+21
-14
lines changed

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3842,9 +3842,16 @@ bool DAGCombiner::SearchForAndLoads(SDNode *N,
38423842
EVT ExtVT;
38433843
if (isAndLoadExtLoad(Mask, Load, Load->getValueType(0), ExtVT) &&
38443844
isLegalNarrowLoad(Load, ISD::ZEXTLOAD, ExtVT)) {
3845-
// Only add this load if we can make it more narrow.
3846-
if (ExtVT.bitsLT(Load->getMemoryVT()))
3845+
3846+
// ZEXTLOAD is already small enough.
3847+
if (Load->getExtensionType() == ISD::ZEXTLOAD &&
3848+
ExtVT.bitsGE(Load->getMemoryVT()))
3849+
continue;
3850+
3851+
// Use LE to convert equal sized loads to zext.
3852+
if (ExtVT.bitsLE(Load->getMemoryVT()))
38473853
Loads.insert(Load);
3854+
38483855
continue;
38493856
}
38503857
return false;
@@ -3899,11 +3906,13 @@ bool DAGCombiner::BackwardsPropagateMask(SDNode *N, SelectionDAG &DAG) {
38993906
if (Loads.size() == 0)
39003907
return false;
39013908

3909+
DEBUG(dbgs() << "Backwards propagate AND: "; N->dump());
39023910
SDValue MaskOp = N->getOperand(1);
39033911

39043912
// If it exists, fixup the single node we allow in the tree that needs
39053913
// masking.
39063914
if (FixupNode) {
3915+
DEBUG(dbgs() << "First, need to fix up: "; FixupNode->dump());
39073916
SDValue And = DAG.getNode(ISD::AND, SDLoc(FixupNode),
39083917
FixupNode->getValueType(0),
39093918
SDValue(FixupNode, 0), MaskOp);
@@ -3922,6 +3931,7 @@ bool DAGCombiner::BackwardsPropagateMask(SDNode *N, SelectionDAG &DAG) {
39223931

39233932
// Create narrow loads.
39243933
for (auto *Load : Loads) {
3934+
DEBUG(dbgs() << "Propagate AND back to: "; Load->dump());
39253935
SDValue And = DAG.getNode(ISD::AND, SDLoc(Load), Load->getValueType(0),
39263936
SDValue(Load, 0), MaskOp);
39273937
DAG.ReplaceAllUsesOfValueWith(SDValue(Load, 0), And);

test/CodeGen/ARM/and-load-combine.ll

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -852,8 +852,7 @@ define arm_aapcscc i1 @test6(i8* %x, i8 %y, i8 %z) {
852852
; ARM: @ %bb.0: @ %entry
853853
; ARM-NEXT: ldrb r0, [r0]
854854
; ARM-NEXT: uxtb r2, r2
855-
; ARM-NEXT: and r0, r0, r1
856-
; ARM-NEXT: uxtb r1, r0
855+
; ARM-NEXT: and r1, r0, r1
857856
; ARM-NEXT: mov r0, #0
858857
; ARM-NEXT: cmp r1, r2
859858
; ARM-NEXT: movweq r0, #1
@@ -863,18 +862,16 @@ define arm_aapcscc i1 @test6(i8* %x, i8 %y, i8 %z) {
863862
; ARMEB: @ %bb.0: @ %entry
864863
; ARMEB-NEXT: ldrb r0, [r0]
865864
; ARMEB-NEXT: uxtb r2, r2
866-
; ARMEB-NEXT: and r0, r0, r1
867-
; ARMEB-NEXT: uxtb r1, r0
865+
; ARMEB-NEXT: and r1, r0, r1
868866
; ARMEB-NEXT: mov r0, #0
869867
; ARMEB-NEXT: cmp r1, r2
870868
; ARMEB-NEXT: movweq r0, #1
871869
; ARMEB-NEXT: bx lr
872870
;
873871
; THUMB1-LABEL: test6:
874872
; THUMB1: @ %bb.0: @ %entry
875-
; THUMB1-NEXT: ldrb r0, [r0]
876-
; THUMB1-NEXT: ands r0, r1
877-
; THUMB1-NEXT: uxtb r3, r0
873+
; THUMB1-NEXT: ldrb r3, [r0]
874+
; THUMB1-NEXT: ands r3, r1
878875
; THUMB1-NEXT: uxtb r2, r2
879876
; THUMB1-NEXT: movs r0, #1
880877
; THUMB1-NEXT: movs r1, #0
@@ -889,8 +886,7 @@ define arm_aapcscc i1 @test6(i8* %x, i8 %y, i8 %z) {
889886
; THUMB2: @ %bb.0: @ %entry
890887
; THUMB2-NEXT: ldrb r0, [r0]
891888
; THUMB2-NEXT: uxtb r2, r2
892-
; THUMB2-NEXT: ands r0, r1
893-
; THUMB2-NEXT: uxtb r1, r0
889+
; THUMB2-NEXT: ands r1, r0
894890
; THUMB2-NEXT: movs r0, #0
895891
; THUMB2-NEXT: cmp r1, r2
896892
; THUMB2-NEXT: it eq

test/CodeGen/X86/pr37563.ll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
define void @PR35763() {
1111
; CHECK-LABEL: PR35763:
1212
; CHECK: # %bb.0: # %entry
13-
; CHECK-NEXT: movzwl z+{{.*}}(%rip), %eax
14-
; CHECK-NEXT: orl {{.*}}(%rip), %eax
15-
; CHECK-NEXT: movq %rax, {{.*}}(%rip)
13+
; CHECK-NEXT: movzwl {{.*}}(%rip), %eax
14+
; CHECK-NEXT: movzwl z+{{.*}}(%rip), %ecx
15+
; CHECK-NEXT: orl %eax, %ecx
16+
; CHECK-NEXT: movq %rcx, {{.*}}(%rip)
1617
; CHECK-NEXT: movl z+{{.*}}(%rip), %eax
1718
; CHECK-NEXT: movzbl z+{{.*}}(%rip), %ecx
1819
; CHECK-NEXT: shlq $32, %rcx

0 commit comments

Comments
 (0)