Skip to content

Commit 716a599

Browse files
committed
[AArch64] Check for immediates using isLegalICmpImmediate
We can catch negatives that can be encoded in cmn this way!
1 parent df00092 commit 716a599

14 files changed

+361
-198
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3647,6 +3647,16 @@ static bool isLegalArithImmed(uint64_t C) {
36473647
return IsLegal;
36483648
}
36493649

3650+
bool isLegalCmpImmed(int64_t Immed) {
3651+
if (Immed == std::numeric_limits<int64_t>::min()) {
3652+
LLVM_DEBUG(dbgs() << "Illegal add imm " << Immed
3653+
<< ": avoid UB for INT64_MIN\n");
3654+
return false;
3655+
}
3656+
// Same encoding for add/sub, just flip the sign.
3657+
return isLegalArithImmed((uint64_t)std::abs(Immed));
3658+
}
3659+
36503660
static bool cannotBeIntMin(SDValue CheckedVal, SelectionDAG &DAG) {
36513661
KnownBits KnownSrc = DAG.computeKnownBits(CheckedVal);
36523662
return !KnownSrc.getSignedMinValue().isMinSignedValue();
@@ -4077,52 +4087,53 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
40774087
const SDLoc &dl) {
40784088
if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS.getNode())) {
40794089
EVT VT = RHS.getValueType();
4080-
uint64_t C = RHSC->getZExtValue();
4081-
if (!isLegalArithImmed(C)) {
4090+
int64_t C = RHSC->getSExtValue();
4091+
if (!isLegalCmpImmed(C)) {
40824092
// Constant does not fit, try adjusting it by one?
40834093
switch (CC) {
40844094
default:
40854095
break;
40864096
case ISD::SETLT:
40874097
case ISD::SETGE:
4088-
if ((VT == MVT::i32 && C != 0x80000000 &&
4089-
isLegalArithImmed((uint32_t)(C - 1))) ||
4090-
(VT == MVT::i64 && C != 0x80000000ULL &&
4091-
isLegalArithImmed(C - 1ULL))) {
4098+
if ((VT == MVT::i32 && C != INT32_MIN && isLegalCmpImmed(C - 1)) ||
4099+
(VT == MVT::i64 && C != INT64_MIN && isLegalCmpImmed(C - 1))) {
40924100
CC = (CC == ISD::SETLT) ? ISD::SETLE : ISD::SETGT;
4093-
C = (VT == MVT::i32) ? (uint32_t)(C - 1) : C - 1;
4101+
C = C - 1;
4102+
if (VT == MVT::i32)
4103+
C &= 0xFFFFFFFF;
40944104
RHS = DAG.getConstant(C, dl, VT);
40954105
}
40964106
break;
40974107
case ISD::SETULT:
40984108
case ISD::SETUGE:
4099-
if ((VT == MVT::i32 && C != 0 &&
4100-
isLegalArithImmed((uint32_t)(C - 1))) ||
4101-
(VT == MVT::i64 && C != 0ULL && isLegalArithImmed(C - 1ULL))) {
4109+
if ((VT == MVT::i32 && C != 0 && isLegalCmpImmed(C - 1)) ||
4110+
(VT == MVT::i64 && C != 0 && isLegalCmpImmed(C - 1))) {
41024111
CC = (CC == ISD::SETULT) ? ISD::SETULE : ISD::SETUGT;
4103-
C = (VT == MVT::i32) ? (uint32_t)(C - 1) : C - 1;
4112+
C = C - 1;
4113+
if (VT == MVT::i32)
4114+
C &= 0xFFFFFFFF;
41044115
RHS = DAG.getConstant(C, dl, VT);
41054116
}
41064117
break;
41074118
case ISD::SETLE:
41084119
case ISD::SETGT:
4109-
if ((VT == MVT::i32 && C != INT32_MAX &&
4110-
isLegalArithImmed((uint32_t)(C + 1))) ||
4111-
(VT == MVT::i64 && C != INT64_MAX &&
4112-
isLegalArithImmed(C + 1ULL))) {
4120+
if ((VT == MVT::i32 && C != INT32_MAX && isLegalCmpImmed(C + 1)) ||
4121+
(VT == MVT::i64 && C != INT64_MAX && isLegalCmpImmed(C + 1))) {
41134122
CC = (CC == ISD::SETLE) ? ISD::SETLT : ISD::SETGE;
4114-
C = (VT == MVT::i32) ? (uint32_t)(C + 1) : C + 1;
4123+
C = C + 1;
4124+
if (VT == MVT::i32)
4125+
C &= 0xFFFFFFFF;
41154126
RHS = DAG.getConstant(C, dl, VT);
41164127
}
41174128
break;
41184129
case ISD::SETULE:
41194130
case ISD::SETUGT:
4120-
if ((VT == MVT::i32 && C != UINT32_MAX &&
4121-
isLegalArithImmed((uint32_t)(C + 1))) ||
4122-
(VT == MVT::i64 && C != UINT64_MAX &&
4123-
isLegalArithImmed(C + 1ULL))) {
4131+
if ((VT == MVT::i32 && C != -1 && isLegalCmpImmed(C + 1)) ||
4132+
(VT == MVT::i64 && C != -1 && isLegalCmpImmed(C + 1))) {
41244133
CC = (CC == ISD::SETULE) ? ISD::SETULT : ISD::SETUGE;
4125-
C = (VT == MVT::i32) ? (uint32_t)(C + 1) : C + 1;
4134+
C = C + 1;
4135+
if (VT == MVT::i32)
4136+
C &= 0xFFFFFFFF;
41264137
RHS = DAG.getConstant(C, dl, VT);
41274138
}
41284139
break;
@@ -4141,7 +4152,7 @@ static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
41414152
// can be turned into:
41424153
// cmp w12, w11, lsl #1
41434154
if (!isa<ConstantSDNode>(RHS) ||
4144-
!isLegalArithImmed(RHS->getAsAPIntVal().abs().getZExtValue())) {
4155+
!isLegalCmpImmed(RHS->getAsAPIntVal().getSExtValue())) {
41454156
bool LHSIsCMN = isCMN(LHS, CC, DAG);
41464157
bool RHSIsCMN = isCMN(RHS, CC, DAG);
41474158
SDValue TheLHS = LHSIsCMN ? LHS.getOperand(1) : LHS;
@@ -17673,12 +17684,7 @@ bool AArch64TargetLowering::isLegalAddImmediate(int64_t Immed) const {
1767317684
return false;
1767417685
}
1767517686
// Same encoding for add/sub, just flip the sign.
17676-
Immed = std::abs(Immed);
17677-
bool IsLegal = ((Immed >> 12) == 0 ||
17678-
((Immed & 0xfff) == 0 && Immed >> 24 == 0));
17679-
LLVM_DEBUG(dbgs() << "Is " << Immed
17680-
<< " legal add imm: " << (IsLegal ? "yes" : "no") << "\n");
17681-
return IsLegal;
17687+
return isLegalArithImmed((uint64_t)std::abs(Immed));
1768217688
}
1768317689

1768417690
bool AArch64TargetLowering::isLegalAddScalableImmediate(int64_t Imm) const {

llvm/test/CodeGen/AArch64/arm64-csel.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,8 @@ define i32 @foo7(i32 %a, i32 %b) nounwind {
100100
; CHECK-NEXT: subs w8, w0, w1
101101
; CHECK-NEXT: cneg w9, w8, mi
102102
; CHECK-NEXT: cmn w8, #1
103-
; CHECK-NEXT: csel w10, w9, w0, lt
104-
; CHECK-NEXT: cmp w8, #0
105-
; CHECK-NEXT: csel w0, w10, w9, ge
103+
; CHECK-NEXT: csel w8, w9, w0, lt
104+
; CHECK-NEXT: csel w0, w8, w9, gt
106105
; CHECK-NEXT: ret
107106
entry:
108107
%sub = sub nsw i32 %a, %b

llvm/test/CodeGen/AArch64/check-sign-bit-before-extension.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ define i32 @f_i8_sign_extend_inreg(i8 %in, i32 %a, i32 %b) nounwind {
1414
; CHECK-LABEL: f_i8_sign_extend_inreg:
1515
; CHECK: // %bb.0: // %entry
1616
; CHECK-NEXT: sxtb w8, w0
17-
; CHECK-NEXT: cmp w8, #0
18-
; CHECK-NEXT: csel w8, w1, w2, ge
17+
; CHECK-NEXT: cmn w8, #1
18+
; CHECK-NEXT: csel w8, w1, w2, gt
1919
; CHECK-NEXT: add w0, w8, w0, uxtb
2020
; CHECK-NEXT: ret
2121
entry:
@@ -36,8 +36,8 @@ define i32 @f_i16_sign_extend_inreg(i16 %in, i32 %a, i32 %b) nounwind {
3636
; CHECK-LABEL: f_i16_sign_extend_inreg:
3737
; CHECK: // %bb.0: // %entry
3838
; CHECK-NEXT: sxth w8, w0
39-
; CHECK-NEXT: cmp w8, #0
40-
; CHECK-NEXT: csel w8, w1, w2, ge
39+
; CHECK-NEXT: cmn w8, #1
40+
; CHECK-NEXT: csel w8, w1, w2, gt
4141
; CHECK-NEXT: add w0, w8, w0, uxth
4242
; CHECK-NEXT: ret
4343
entry:
@@ -57,8 +57,8 @@ B:
5757
define i64 @f_i32_sign_extend_inreg(i32 %in, i64 %a, i64 %b) nounwind {
5858
; CHECK-LABEL: f_i32_sign_extend_inreg:
5959
; CHECK: // %bb.0: // %entry
60-
; CHECK-NEXT: cmp w0, #0
61-
; CHECK-NEXT: csel x8, x1, x2, ge
60+
; CHECK-NEXT: cmn w0, #1
61+
; CHECK-NEXT: csel x8, x1, x2, gt
6262
; CHECK-NEXT: add x0, x8, w0, uxtw
6363
; CHECK-NEXT: ret
6464
entry:
@@ -145,8 +145,8 @@ define i64 @f_i32_sign_extend_i64(i32 %in, i64 %a, i64 %b) nounwind {
145145
; CHECK: // %bb.0: // %entry
146146
; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0
147147
; CHECK-NEXT: sxtw x8, w0
148-
; CHECK-NEXT: cmp x8, #0
149-
; CHECK-NEXT: csel x8, x1, x2, ge
148+
; CHECK-NEXT: cmn x8, #1
149+
; CHECK-NEXT: csel x8, x1, x2, gt
150150
; CHECK-NEXT: add x0, x8, w0, uxtw
151151
; CHECK-NEXT: ret
152152
entry:

llvm/test/CodeGen/AArch64/cmp-to-cmn.ll

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -446,10 +446,8 @@ define i1 @cmn_large_imm(i32 %a) {
446446
define i1 @almost_immediate_neg_slt(i32 %x) {
447447
; CHECK-LABEL: almost_immediate_neg_slt:
448448
; CHECK: // %bb.0:
449-
; CHECK-NEXT: mov w8, #4097 // =0x1001
450-
; CHECK-NEXT: movk w8, #65281, lsl #16
451-
; CHECK-NEXT: cmp w0, w8
452-
; CHECK-NEXT: cset w0, lt
449+
; CHECK-NEXT: cmn w0, #4079, lsl #12 // =16707584
450+
; CHECK-NEXT: cset w0, le
453451
; CHECK-NEXT: ret
454452
%cmp = icmp slt i32 %x, -16707583
455453
ret i1 %cmp
@@ -458,10 +456,8 @@ define i1 @almost_immediate_neg_slt(i32 %x) {
458456
define i1 @almost_immediate_neg_slt_64(i64 %x) {
459457
; CHECK-LABEL: almost_immediate_neg_slt_64:
460458
; CHECK: // %bb.0:
461-
; CHECK-NEXT: mov x8, #-61439 // =0xffffffffffff1001
462-
; CHECK-NEXT: movk x8, #65281, lsl #16
463-
; CHECK-NEXT: cmp x0, x8
464-
; CHECK-NEXT: cset w0, lt
459+
; CHECK-NEXT: cmn x0, #4079, lsl #12 // =16707584
460+
; CHECK-NEXT: cset w0, le
465461
; CHECK-NEXT: ret
466462
%cmp = icmp slt i64 %x, -16707583
467463
ret i1 %cmp
@@ -510,10 +506,8 @@ define i1 @almost_immediate_neg_uge_64(i64 %x) {
510506
define i1 @almost_immediate_neg_ult(i32 %x) {
511507
; CHECK-LABEL: almost_immediate_neg_ult:
512508
; CHECK: // %bb.0:
513-
; CHECK-NEXT: mov w8, #4097 // =0x1001
514-
; CHECK-NEXT: movk w8, #65281, lsl #16
515-
; CHECK-NEXT: cmp w0, w8
516-
; CHECK-NEXT: cset w0, lo
509+
; CHECK-NEXT: cmn w0, #4079, lsl #12 // =16707584
510+
; CHECK-NEXT: cset w0, ls
517511
; CHECK-NEXT: ret
518512
%cmp = icmp ult i32 %x, -16707583
519513
ret i1 %cmp
@@ -522,10 +516,8 @@ define i1 @almost_immediate_neg_ult(i32 %x) {
522516
define i1 @almost_immediate_neg_ult_64(i64 %x) {
523517
; CHECK-LABEL: almost_immediate_neg_ult_64:
524518
; CHECK: // %bb.0:
525-
; CHECK-NEXT: mov x8, #-61439 // =0xffffffffffff1001
526-
; CHECK-NEXT: movk x8, #65281, lsl #16
527-
; CHECK-NEXT: cmp x0, x8
528-
; CHECK-NEXT: cset w0, lo
519+
; CHECK-NEXT: cmn x0, #4079, lsl #12 // =16707584
520+
; CHECK-NEXT: cset w0, ls
529521
; CHECK-NEXT: ret
530522
%cmp = icmp ult i64 %x, -16707583
531523
ret i1 %cmp
@@ -554,9 +546,8 @@ define i1 @almost_immediate_neg_sle_64(i64 %x) {
554546
define i1 @almost_immediate_neg_sgt(i32 %x) {
555547
; CHECK-LABEL: almost_immediate_neg_sgt:
556548
; CHECK: // %bb.0:
557-
; CHECK-NEXT: mov w8, #-16773121 // =0xff000fff
558-
; CHECK-NEXT: cmp w0, w8
559-
; CHECK-NEXT: cset w0, gt
549+
; CHECK-NEXT: cmn w0, #4095, lsl #12 // =16773120
550+
; CHECK-NEXT: cset w0, ge
560551
; CHECK-NEXT: ret
561552
%cmp = icmp sgt i32 %x, -16773121
562553
ret i1 %cmp
@@ -565,9 +556,8 @@ define i1 @almost_immediate_neg_sgt(i32 %x) {
565556
define i1 @almost_immediate_neg_sgt_64(i64 %x) {
566557
; CHECK-LABEL: almost_immediate_neg_sgt_64:
567558
; CHECK: // %bb.0:
568-
; CHECK-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
569-
; CHECK-NEXT: cmp x0, x8
570-
; CHECK-NEXT: cset w0, gt
559+
; CHECK-NEXT: cmn x0, #4095, lsl #12 // =16773120
560+
; CHECK-NEXT: cset w0, ge
571561
; CHECK-NEXT: ret
572562
%cmp = icmp sgt i64 %x, -16773121
573563
ret i1 %cmp
@@ -596,9 +586,8 @@ define i1 @almost_immediate_neg_ule_64(i64 %x) {
596586
define i1 @almost_immediate_neg_ugt(i32 %x) {
597587
; CHECK-LABEL: almost_immediate_neg_ugt:
598588
; CHECK: // %bb.0:
599-
; CHECK-NEXT: mov w8, #-16773121 // =0xff000fff
600-
; CHECK-NEXT: cmp w0, w8
601-
; CHECK-NEXT: cset w0, hi
589+
; CHECK-NEXT: cmn w0, #4095, lsl #12 // =16773120
590+
; CHECK-NEXT: cset w0, hs
602591
; CHECK-NEXT: ret
603592
%cmp = icmp ugt i32 %x, -16773121
604593
ret i1 %cmp
@@ -607,9 +596,8 @@ define i1 @almost_immediate_neg_ugt(i32 %x) {
607596
define i1 @almost_immediate_neg_ugt_64(i64 %x) {
608597
; CHECK-LABEL: almost_immediate_neg_ugt_64:
609598
; CHECK: // %bb.0:
610-
; CHECK-NEXT: mov x8, #-16773121 // =0xffffffffff000fff
611-
; CHECK-NEXT: cmp x0, x8
612-
; CHECK-NEXT: cset w0, hi
599+
; CHECK-NEXT: cmn x0, #4095, lsl #12 // =16773120
600+
; CHECK-NEXT: cset w0, hs
613601
; CHECK-NEXT: ret
614602
%cmp = icmp ugt i64 %x, -16773121
615603
ret i1 %cmp

llvm/test/CodeGen/AArch64/csel-subs-swapped.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ define i32 @sge_i32(i32 %x) {
4444
; CHECK-LABEL: sge_i32:
4545
; CHECK: // %bb.0:
4646
; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
47-
; CHECK-NEXT: mov w9, #-2097153 // =0xffdfffff
48-
; CHECK-NEXT: sub w8, w8, w0
49-
; CHECK-NEXT: cmp w0, w9
50-
; CHECK-NEXT: csel w0, w0, w8, gt
47+
; CHECK-NEXT: subs w8, w8, w0
48+
; CHECK-NEXT: csel w0, w0, w8, le
5149
; CHECK-NEXT: ret
5250
%cmp = icmp sge i32 %x, -2097152
5351
%sub = sub i32 -2097152, %x
@@ -72,10 +70,8 @@ define i32 @sle_i32(i32 %x) {
7270
; CHECK-LABEL: sle_i32:
7371
; CHECK: // %bb.0:
7472
; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
75-
; CHECK-NEXT: mov w9, #-2097151 // =0xffe00001
76-
; CHECK-NEXT: sub w8, w8, w0
77-
; CHECK-NEXT: cmp w0, w9
78-
; CHECK-NEXT: csel w0, w0, w8, lt
73+
; CHECK-NEXT: subs w8, w8, w0
74+
; CHECK-NEXT: csel w0, w0, w8, ge
7975
; CHECK-NEXT: ret
8076
%cmp = icmp sle i32 %x, -2097152
8177
%sub = sub i32 -2097152, %x
@@ -128,10 +124,8 @@ define i32 @ule_i32(i32 %x) {
128124
; CHECK-LABEL: ule_i32:
129125
; CHECK: // %bb.0:
130126
; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
131-
; CHECK-NEXT: mov w9, #-2097151 // =0xffe00001
132-
; CHECK-NEXT: sub w8, w8, w0
133-
; CHECK-NEXT: cmp w0, w9
134-
; CHECK-NEXT: csel w0, w0, w8, lo
127+
; CHECK-NEXT: subs w8, w8, w0
128+
; CHECK-NEXT: csel w0, w0, w8, hs
135129
; CHECK-NEXT: ret
136130
%cmp = icmp ule i32 %x, -2097152
137131
%sub = sub i32 -2097152, %x

llvm/test/CodeGen/AArch64/fptosi-sat-scalar.ll

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ define i1 @test_signed_i1_f32(float %f) nounwind {
2323
; CHECK-SD-LABEL: test_signed_i1_f32:
2424
; CHECK-SD: // %bb.0:
2525
; CHECK-SD-NEXT: fcvtzs w8, s0
26-
; CHECK-SD-NEXT: ands w8, w8, w8, asr #31
27-
; CHECK-SD-NEXT: csinv w8, w8, wzr, ge
26+
; CHECK-SD-NEXT: and w8, w8, w8, asr #31
27+
; CHECK-SD-NEXT: cmn w8, #1
28+
; CHECK-SD-NEXT: csinv w8, w8, wzr, gt
2829
; CHECK-SD-NEXT: and w0, w8, #0x1
2930
; CHECK-SD-NEXT: ret
3031
;
@@ -268,8 +269,9 @@ define i1 @test_signed_i1_f64(double %f) nounwind {
268269
; CHECK-SD-LABEL: test_signed_i1_f64:
269270
; CHECK-SD: // %bb.0:
270271
; CHECK-SD-NEXT: fcvtzs w8, d0
271-
; CHECK-SD-NEXT: ands w8, w8, w8, asr #31
272-
; CHECK-SD-NEXT: csinv w8, w8, wzr, ge
272+
; CHECK-SD-NEXT: and w8, w8, w8, asr #31
273+
; CHECK-SD-NEXT: cmn w8, #1
274+
; CHECK-SD-NEXT: csinv w8, w8, wzr, gt
273275
; CHECK-SD-NEXT: and w0, w8, #0x1
274276
; CHECK-SD-NEXT: ret
275277
;
@@ -518,16 +520,18 @@ define i1 @test_signed_i1_f16(half %f) nounwind {
518520
; CHECK-SD-CVT: // %bb.0:
519521
; CHECK-SD-CVT-NEXT: fcvt s0, h0
520522
; CHECK-SD-CVT-NEXT: fcvtzs w8, s0
521-
; CHECK-SD-CVT-NEXT: ands w8, w8, w8, asr #31
522-
; CHECK-SD-CVT-NEXT: csinv w8, w8, wzr, ge
523+
; CHECK-SD-CVT-NEXT: and w8, w8, w8, asr #31
524+
; CHECK-SD-CVT-NEXT: cmn w8, #1
525+
; CHECK-SD-CVT-NEXT: csinv w8, w8, wzr, gt
523526
; CHECK-SD-CVT-NEXT: and w0, w8, #0x1
524527
; CHECK-SD-CVT-NEXT: ret
525528
;
526529
; CHECK-SD-FP16-LABEL: test_signed_i1_f16:
527530
; CHECK-SD-FP16: // %bb.0:
528531
; CHECK-SD-FP16-NEXT: fcvtzs w8, h0
529-
; CHECK-SD-FP16-NEXT: ands w8, w8, w8, asr #31
530-
; CHECK-SD-FP16-NEXT: csinv w8, w8, wzr, ge
532+
; CHECK-SD-FP16-NEXT: and w8, w8, w8, asr #31
533+
; CHECK-SD-FP16-NEXT: cmn w8, #1
534+
; CHECK-SD-FP16-NEXT: csinv w8, w8, wzr, gt
531535
; CHECK-SD-FP16-NEXT: and w0, w8, #0x1
532536
; CHECK-SD-FP16-NEXT: ret
533537
;

llvm/test/CodeGen/AArch64/fptosi-sat-vector.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2371,10 +2371,12 @@ define <2 x i1> @test_signed_v2f64_v2i1(<2 x double> %f) {
23712371
; CHECK-SD-NEXT: mov d1, v0.d[1]
23722372
; CHECK-SD-NEXT: fcvtzs w9, d0
23732373
; CHECK-SD-NEXT: fcvtzs w8, d1
2374-
; CHECK-SD-NEXT: ands w8, w8, w8, asr #31
2375-
; CHECK-SD-NEXT: csinv w8, w8, wzr, ge
2376-
; CHECK-SD-NEXT: ands w9, w9, w9, asr #31
2377-
; CHECK-SD-NEXT: csinv w9, w9, wzr, ge
2374+
; CHECK-SD-NEXT: and w9, w9, w9, asr #31
2375+
; CHECK-SD-NEXT: and w8, w8, w8, asr #31
2376+
; CHECK-SD-NEXT: cmn w8, #1
2377+
; CHECK-SD-NEXT: csinv w8, w8, wzr, gt
2378+
; CHECK-SD-NEXT: cmn w9, #1
2379+
; CHECK-SD-NEXT: csinv w9, w9, wzr, gt
23782380
; CHECK-SD-NEXT: fmov s0, w9
23792381
; CHECK-SD-NEXT: mov v0.s[1], w8
23802382
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0

llvm/test/CodeGen/AArch64/select-constant-xor.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,8 @@ define i32 @icmpasreq(i32 %input, i32 %a, i32 %b) {
168168
define i32 @icmpasrne(i32 %input, i32 %a, i32 %b) {
169169
; CHECK-SD-LABEL: icmpasrne:
170170
; CHECK-SD: // %bb.0:
171-
; CHECK-SD-NEXT: cmp w0, #0
172-
; CHECK-SD-NEXT: csel w0, w1, w2, ge
171+
; CHECK-SD-NEXT: cmn w0, #1
172+
; CHECK-SD-NEXT: csel w0, w1, w2, gt
173173
; CHECK-SD-NEXT: ret
174174
;
175175
; CHECK-GI-LABEL: icmpasrne:

0 commit comments

Comments
 (0)