Skip to content

Commit 69be811

Browse files
committed
Exclude more uses of SHL that might be combined
1 parent 5099321 commit 69be811

File tree

2 files changed

+22
-28
lines changed

2 files changed

+22
-28
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26386,9 +26386,11 @@ static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG) {
2638626386
if (!C1 || !C2)
2638726387
return SDValue();
2638826388

26389-
// Might be folded into shifted add/sub, do not lower.
26390-
if (N->hasOneUse() && (N->use_begin()->getOpcode() == ISD::ADD ||
26391-
N->use_begin()->getOpcode() == ISD::SUB))
26389+
// Might be folded into shifted op, do not lower.
26390+
unsigned UseOpc = N->use_begin()->getOpcode();
26391+
if (N->hasOneUse() &&
26392+
(UseOpc == ISD::ADD || UseOpc == ISD::SUB || UseOpc == ISD::SETCC ||
26393+
UseOpc == AArch64ISD::ADDS || UseOpc == AArch64ISD::SUBS))
2639226394
return SDValue();
2639326395

2639426396
SDLoc DL(N);

llvm/test/CodeGen/AArch64/swap-compare-operands.ll

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,8 @@ entry:
133133

134134
define i1 @testSwapCmpWithShiftedZeroExtend16_64(i16 %a, i64 %b) {
135135
; CHECK-LABEL: testSwapCmpWithShiftedZeroExtend16_64
136-
; CHECK: ubfiz x8, x0, #2, #16
137-
; CHECK: cmp x8, x1
138-
; CHECK-NEXT: cset w0, hi
136+
; CHECK: cmp x1, w0, uxth #2
137+
; CHECK-NEXT: cset w0, lo
139138
entry:
140139
%a64 = zext i16 %a to i64
141140
%shl.0 = shl i64 %a64, 2
@@ -145,9 +144,8 @@ entry:
145144

146145
define i1 @testSwapCmpWithShiftedZeroExtend8_64(i8 %a, i64 %b) {
147146
; CHECK-LABEL: testSwapCmpWithShiftedZeroExtend8_64
148-
; CHECK: ubfiz x8, x0, #4, #8
149-
; CHECK: cmp x8, x1
150-
; CHECK-NEXT: cset w0, hi
147+
; CHECK: cmp x1, w0, uxtb #4
148+
; CHECK-NEXT: cset w0, lo
151149
entry:
152150
%a64 = zext i8 %a to i64
153151
%shl.2 = shl i64 %a64, 4
@@ -157,9 +155,8 @@ entry:
157155

158156
define i1 @testSwapCmpWithShiftedZeroExtend16_32(i16 %a, i32 %b) {
159157
; CHECK-LABEL: testSwapCmpWithShiftedZeroExtend16_32
160-
; CHECK: ubfiz w8, w0, #3, #16
161-
; CHECK: cmp w8, w1
162-
; CHECK-NEXT: cset w0, hi
158+
; CHECK: cmp w1, w0, uxth #3
159+
; CHECK-NEXT: cset w0, lo
163160
entry:
164161
%a32 = zext i16 %a to i32
165162
%shl = shl i32 %a32, 3
@@ -169,9 +166,8 @@ entry:
169166

170167
define i1 @testSwapCmpWithShiftedZeroExtend8_32(i8 %a, i32 %b) {
171168
; CHECK-LABEL: testSwapCmpWithShiftedZeroExtend8_32
172-
; CHECK: ubfiz w8, w0, #4, #8
173-
; CHECK: cmp w8, w1
174-
; CHECK-NEXT: cset w0, hi
169+
; CHECK: cmp w1, w0, uxtb #4
170+
; CHECK-NEXT: cset w0, lo
175171
entry:
176172
%a32 = zext i8 %a to i32
177173
%shl = shl i32 %a32, 4
@@ -181,9 +177,9 @@ entry:
181177

182178
define i1 @testSwapCmpWithTooLargeShiftedZeroExtend8_32(i8 %a, i32 %b) {
183179
; CHECK-LABEL: testSwapCmpWithTooLargeShiftedZeroExtend8_32
184-
; CHECK: ubfiz w8, w0, #5, #8
185-
; CHECK: cmp w8, w1
186-
; CHECK-NEXT: cset w0, hi
180+
; CHECK: and [[REG:w[0-9]+]], w0, #0xff
181+
; CHECK: cmp w1, [[REG]], lsl #5
182+
; CHECK-NEXT: cset w0, lo
187183
entry:
188184
%a32 = zext i8 %a to i32
189185
%shl = shl i32 %a32, 5
@@ -521,44 +517,40 @@ t1:
521517
%shl1 = shl i64 %conv1, 4
522518
%na1 = sub i64 0, %shl1
523519
%cmp1 = icmp ne i64 %na1, %b64
524-
; CHECK: ubfiz x8, x1, #4, #16
525-
; CHECK: cmn x3, x8
520+
; CHECK: cmn x3, w1, uxth #4
526521
br i1 %cmp1, label %t2, label %end
527522

528523
t2:
529524
%conv2 = zext i8 %a8 to i64
530525
%shl2 = shl i64 %conv2, 3
531526
%na2 = sub i64 0, %shl2
532527
%cmp2 = icmp ne i64 %na2, %b64
533-
; CHECK: ubfiz x8, x2, #3, #8
534-
; CHECK: cmn x3, x8
528+
; CHECK: cmn x3, w2, uxtb #3
535529
br i1 %cmp2, label %t3, label %end
536530

537531
t3:
538532
%conv3 = zext i16 %a16 to i32
539533
%shl3 = shl i32 %conv3, 2
540534
%na3 = sub i32 0, %shl3
541535
%cmp3 = icmp ne i32 %na3, %b32
542-
; CHECK: ubfiz w8, w1, #2, #16
543-
; CHECK: cmn w4, w8
536+
; CHECK: cmn w4, w1, uxth #2
544537
br i1 %cmp3, label %t4, label %end
545538

546539
t4:
547540
%conv4 = zext i8 %a8 to i32
548541
%shl4 = shl i32 %conv4, 1
549542
%na4 = sub i32 0, %shl4
550543
%cmp4 = icmp ne i32 %na4, %b32
551-
; CHECK: ubfiz w8, w2, #1, #8
552-
; CHECK: cmn w4, w8
544+
; CHECK: cmn w4, w2, uxtb #1
553545
br i1 %cmp4, label %t5, label %end
554546

555547
t5:
556548
%conv5 = zext i8 %a8 to i32
557549
%shl5 = shl i32 %conv5, 5
558550
%na5 = sub i32 0, %shl5
559551
%cmp5 = icmp ne i32 %na5, %b32
560-
; CHECK: ubfiz w8, w2, #5, #8
561-
; CHECK: cmn w4, w8
552+
; CHECK: and [[REG:w[0-9]+]], w2, #0xff
553+
; CHECK: cmn w4, [[REG]], lsl #5
562554
br i1 %cmp5, label %t6, label %end
563555

564556
t6:

0 commit comments

Comments
 (0)