Skip to content

Commit dbd219a

Browse files
authored
[DAGCombiner][X86] Correctly clean up high bits in combinei64TruncSrlAdd (#128353)
A counterexample for original implementation: https://alive2.llvm.org/ce/z/7ieYLg This patch uses zext instead of anyext to fix the original issue. BTW, we should keep low `64 - shamt` bits instead of `shamt - 32`: https://alive2.llvm.org/ce/z/ruQP_Z Some codes are simplified to avoid confusion. Proof: https://alive2.llvm.org/ce/z/z_jdHD Closes #128309.
1 parent ccad5e7 commit dbd219a

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53749,23 +53749,20 @@ static SDValue combinei64TruncSrlAdd(SDValue N, EVT VT, SelectionDAG &DAG,
5374953749
m_ConstInt(SrlConst)))))
5375053750
return SDValue();
5375153751

53752-
if (SrlConst.ule(32) || AddConst.lshr(SrlConst).shl(SrlConst) != AddConst)
53752+
if (SrlConst.ule(32) || AddConst.countr_zero() < SrlConst.getZExtValue())
5375353753
return SDValue();
5375453754

5375553755
SDValue AddLHSSrl =
5375653756
DAG.getNode(ISD::SRL, DL, MVT::i64, AddLhs, N.getOperand(1));
5375753757
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, VT, AddLHSSrl);
5375853758

53759-
APInt NewAddConstVal =
53760-
(~((~AddConst).lshr(SrlConst))).trunc(VT.getSizeInBits());
53759+
APInt NewAddConstVal = AddConst.lshr(SrlConst).trunc(VT.getSizeInBits());
5376153760
SDValue NewAddConst = DAG.getConstant(NewAddConstVal, DL, VT);
5376253761
SDValue NewAddNode = DAG.getNode(ISD::ADD, DL, VT, Trunc, NewAddConst);
5376353762

53764-
APInt CleanupSizeConstVal = (SrlConst - 32).zextOrTrunc(VT.getSizeInBits());
5376553763
EVT CleanUpVT =
53766-
EVT::getIntegerVT(*DAG.getContext(), CleanupSizeConstVal.getZExtValue());
53767-
SDValue CleanUp = DAG.getAnyExtOrTrunc(NewAddNode, DL, CleanUpVT);
53768-
return DAG.getAnyExtOrTrunc(CleanUp, DL, VT);
53764+
EVT::getIntegerVT(*DAG.getContext(), 64 - SrlConst.getZExtValue());
53765+
return DAG.getZeroExtendInReg(NewAddNode, DL, CleanUpVT);
5376953766
}
5377053767

5377153768
/// Attempt to pre-truncate inputs to arithmetic ops if it will simplify

llvm/test/CodeGen/X86/combine-i64-trunc-srl-add.ll

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ define i1 @test_ult_trunc_add(i64 %x) {
77
; X64-LABEL: test_ult_trunc_add:
88
; X64: # %bb.0:
99
; X64-NEXT: shrq $48, %rdi
10-
; X64-NEXT: addl $-65522, %edi # imm = 0xFFFF000E
11-
; X64-NEXT: cmpl $3, %edi
10+
; X64-NEXT: addl $14, %edi
11+
; X64-NEXT: movzwl %di, %eax
12+
; X64-NEXT: cmpl $3, %eax
1213
; X64-NEXT: setb %al
1314
; X64-NEXT: retq
1415
%add = add i64 %x, 3940649673949184
@@ -22,8 +23,9 @@ define i1 @test_ult_add(i64 %x) {
2223
; X64-LABEL: test_ult_add:
2324
; X64: # %bb.0:
2425
; X64-NEXT: shrq $48, %rdi
25-
; X64-NEXT: addl $-65522, %edi # imm = 0xFFFF000E
26-
; X64-NEXT: cmpl $3, %edi
26+
; X64-NEXT: addl $14, %edi
27+
; X64-NEXT: movzwl %di, %eax
28+
; X64-NEXT: cmpl $3, %eax
2729
; X64-NEXT: setb %al
2830
; X64-NEXT: retq
2931
%add = add i64 3940649673949184, %x
@@ -35,8 +37,9 @@ define i1 @test_ugt_trunc_add(i64 %x) {
3537
; X64-LABEL: test_ugt_trunc_add:
3638
; X64: # %bb.0:
3739
; X64-NEXT: shrq $48, %rdi
38-
; X64-NEXT: addl $-65522, %edi # imm = 0xFFFF000E
39-
; X64-NEXT: cmpl $4, %edi
40+
; X64-NEXT: addl $14, %edi
41+
; X64-NEXT: movzwl %di, %eax
42+
; X64-NEXT: cmpl $4, %eax
4043
; X64-NEXT: setae %al
4144
; X64-NEXT: retq
4245
%add = add i64 %x, 3940649673949184
@@ -116,7 +119,8 @@ define i32 @test_trunc_add(i64 %x) {
116119
; X64-LABEL: test_trunc_add:
117120
; X64: # %bb.0:
118121
; X64-NEXT: shrq $48, %rdi
119-
; X64-NEXT: leal -65522(%rdi), %eax
122+
; X64-NEXT: addl $14, %edi
123+
; X64-NEXT: movzwl %di, %eax
120124
; X64-NEXT: retq
121125
%add = add i64 %x, 3940649673949184
122126
%shr = lshr i64 %add, 48
@@ -151,3 +155,20 @@ for.body:
151155
exit:
152156
ret i32 0
153157
}
158+
159+
define i64 @pr128309(i64 %x) {
160+
; X64-LABEL: pr128309:
161+
; X64: # %bb.0: # %entry
162+
; X64-NEXT: movl %edi, %eax
163+
; X64-NEXT: andl $18114, %eax # imm = 0x46C2
164+
; X64-NEXT: addl $6, %eax
165+
; X64-NEXT: andl %edi, %eax
166+
; X64-NEXT: retq
167+
entry:
168+
%shl = shl i64 %x, 48
169+
%and = and i64 %shl, 5098637728136822784
170+
%add = add i64 %and, 1688849860263936
171+
%lshr = lshr i64 %add, 48
172+
%res = and i64 %lshr, %x
173+
ret i64 %res
174+
}

0 commit comments

Comments
 (0)