Skip to content

Commit 6c4f7bf

Browse files
committed
[DAGCombiner][X86] Correctly clean up high bits in combinei64TruncSrlAdd
1 parent 270fc0e commit 6c4f7bf

File tree

2 files changed

+16
-15
lines changed

2 files changed

+16
-15
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

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

53715-
if (SrlConst.ule(32) || AddConst.lshr(SrlConst).shl(SrlConst) != AddConst)
53715+
if (SrlConst.ule(32) || AddConst.countr_zero() < SrlConst.getZExtValue())
5371653716
return SDValue();
5371753717

5371853718
SDValue AddLHSSrl =
5371953719
DAG.getNode(ISD::SRL, DL, MVT::i64, AddLhs, N.getOperand(1));
5372053720
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, VT, AddLHSSrl);
5372153721

53722-
APInt NewAddConstVal =
53723-
(~((~AddConst).lshr(SrlConst))).trunc(VT.getSizeInBits());
53722+
APInt NewAddConstVal = AddConst.lshr(SrlConst).trunc(VT.getSizeInBits());
5372453723
SDValue NewAddConst = DAG.getConstant(NewAddConstVal, DL, VT);
5372553724
SDValue NewAddNode = DAG.getNode(ISD::ADD, DL, VT, Trunc, NewAddConst);
5372653725

53727-
APInt CleanupSizeConstVal = (SrlConst - 32).zextOrTrunc(VT.getSizeInBits());
5372853726
EVT CleanUpVT =
53729-
EVT::getIntegerVT(*DAG.getContext(), CleanupSizeConstVal.getZExtValue());
53730-
SDValue CleanUp = DAG.getAnyExtOrTrunc(NewAddNode, DL, CleanUpVT);
53731-
return DAG.getAnyExtOrTrunc(CleanUp, DL, VT);
53727+
EVT::getIntegerVT(*DAG.getContext(), 64 - SrlConst.getZExtValue());
53728+
return DAG.getZeroExtendInReg(NewAddNode, DL, CleanUpVT);
5373253729
}
5373353730

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

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

Lines changed: 12 additions & 8 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
@@ -157,7 +161,7 @@ define i64 @pr128309(i64 %x) {
157161
; X64: # %bb.0: # %entry
158162
; X64-NEXT: movl %edi, %eax
159163
; X64-NEXT: andl $18114, %eax # imm = 0x46C2
160-
; X64-NEXT: addl $-65530, %eax # imm = 0xFFFF0006
164+
; X64-NEXT: addl $6, %eax
161165
; X64-NEXT: andl %edi, %eax
162166
; X64-NEXT: retq
163167
entry:

0 commit comments

Comments
 (0)