Skip to content

Commit d7642b2

Browse files
author
Thorsten Schütt
authored
[GlobalIsel] Combine select to integer minmax (second attempt). (#77520)
Instcombine canonicalizes selects to floating point and integer minmax. This and the dag combiner canonicalize to floating point minmax. None of them canonicalizes to integer minmax. On Neoverse V2 basic integer arithmetic and integer minmax have the same costs.
1 parent 158d72d commit d7642b2

File tree

5 files changed

+388
-20
lines changed

5 files changed

+388
-20
lines changed

llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,9 @@ class CombinerHelper {
910910

911911
bool tryFoldSelectOfConstants(GSelect *Select, BuildFnTy &MatchInfo);
912912

913+
/// Try to fold (icmp X, Y) ? X : Y -> integer minmax.
914+
bool tryFoldSelectToIntMinMax(GSelect *Select, BuildFnTy &MatchInfo);
915+
913916
bool isOneOrOneSplat(Register Src, bool AllowUndefs);
914917
bool isZeroOrZeroSplat(Register Src, bool AllowUndefs);
915918
bool isConstantSplatVector(Register Src, int64_t SplatValue,

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6548,6 +6548,87 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
65486548
return false;
65496549
}
65506550

6551+
bool CombinerHelper::tryFoldSelectToIntMinMax(GSelect *Select,
6552+
BuildFnTy &MatchInfo) {
6553+
Register DstReg = Select->getReg(0);
6554+
Register Cond = Select->getCondReg();
6555+
Register True = Select->getTrueReg();
6556+
Register False = Select->getFalseReg();
6557+
LLT DstTy = MRI.getType(DstReg);
6558+
6559+
// We need an G_ICMP on the condition register.
6560+
GICmp *Cmp = getOpcodeDef<GICmp>(Cond, MRI);
6561+
if (!Cmp)
6562+
return false;
6563+
6564+
// We want to fold the icmp and replace the select.
6565+
if (!MRI.hasOneNonDBGUse(Cmp->getReg(0)))
6566+
return false;
6567+
6568+
CmpInst::Predicate Pred = Cmp->getCond();
6569+
// We need a larger or smaller predicate for
6570+
// canonicalization.
6571+
if (CmpInst::isEquality(Pred))
6572+
return false;
6573+
6574+
Register CmpLHS = Cmp->getLHSReg();
6575+
Register CmpRHS = Cmp->getRHSReg();
6576+
6577+
// We can swap CmpLHS and CmpRHS for higher hitrate.
6578+
if (True == CmpRHS && False == CmpLHS) {
6579+
std::swap(CmpLHS, CmpRHS);
6580+
Pred = CmpInst::getSwappedPredicate(Pred);
6581+
}
6582+
6583+
// (icmp X, Y) ? X : Y -> integer minmax.
6584+
// see matchSelectPattern in ValueTracking.
6585+
// Legality between G_SELECT and integer minmax can differ.
6586+
if (True == CmpLHS && False == CmpRHS) {
6587+
switch (Pred) {
6588+
case ICmpInst::ICMP_UGT:
6589+
case ICmpInst::ICMP_UGE: {
6590+
if (!isLegalOrBeforeLegalizer({TargetOpcode::G_UMAX, DstTy}))
6591+
return false;
6592+
MatchInfo = [=](MachineIRBuilder &B) {
6593+
B.buildUMax(DstReg, True, False);
6594+
};
6595+
return true;
6596+
}
6597+
case ICmpInst::ICMP_SGT:
6598+
case ICmpInst::ICMP_SGE: {
6599+
if (!isLegalOrBeforeLegalizer({TargetOpcode::G_SMAX, DstTy}))
6600+
return false;
6601+
MatchInfo = [=](MachineIRBuilder &B) {
6602+
B.buildSMax(DstReg, True, False);
6603+
};
6604+
return true;
6605+
}
6606+
case ICmpInst::ICMP_ULT:
6607+
case ICmpInst::ICMP_ULE: {
6608+
if (!isLegalOrBeforeLegalizer({TargetOpcode::G_UMIN, DstTy}))
6609+
return false;
6610+
MatchInfo = [=](MachineIRBuilder &B) {
6611+
B.buildUMin(DstReg, True, False);
6612+
};
6613+
return true;
6614+
}
6615+
case ICmpInst::ICMP_SLT:
6616+
case ICmpInst::ICMP_SLE: {
6617+
if (!isLegalOrBeforeLegalizer({TargetOpcode::G_SMIN, DstTy}))
6618+
return false;
6619+
MatchInfo = [=](MachineIRBuilder &B) {
6620+
B.buildSMin(DstReg, True, False);
6621+
};
6622+
return true;
6623+
}
6624+
default:
6625+
return false;
6626+
}
6627+
}
6628+
6629+
return false;
6630+
}
6631+
65516632
bool CombinerHelper::matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo) {
65526633
GSelect *Select = cast<GSelect>(&MI);
65536634

@@ -6557,5 +6638,8 @@ bool CombinerHelper::matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo) {
65576638
if (tryFoldBoolSelectToLogic(Select, MatchInfo))
65586639
return true;
65596640

6641+
if (tryFoldSelectToIntMinMax(Select, MatchInfo))
6642+
return true;
6643+
65606644
return false;
65616645
}

llvm/test/CodeGen/AArch64/GlobalISel/arm64-atomic.ll

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2421,7 +2421,7 @@ define i8 @atomicrmw_min_i8(ptr %ptr, i8 %rhs) {
24212421
; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0]
24222422
; CHECK-NOLSE-O1-NEXT: sxtb w9, w8
24232423
; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxtb
2424-
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, le
2424+
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lt
24252425
; CHECK-NOLSE-O1-NEXT: stxrb w10, w9, [x0]
24262426
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB33_1
24272427
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -2435,7 +2435,7 @@ define i8 @atomicrmw_min_i8(ptr %ptr, i8 %rhs) {
24352435
; CHECK-OUTLINE-O1-NEXT: ldaxrb w8, [x0]
24362436
; CHECK-OUTLINE-O1-NEXT: sxtb w9, w8
24372437
; CHECK-OUTLINE-O1-NEXT: cmp w9, w1, sxtb
2438-
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, le
2438+
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lt
24392439
; CHECK-OUTLINE-O1-NEXT: stxrb w10, w9, [x0]
24402440
; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB33_1
24412441
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -2662,7 +2662,7 @@ define i8 @atomicrmw_umin_i8(ptr %ptr, i8 %rhs) {
26622662
; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0]
26632663
; CHECK-NOLSE-O1-NEXT: and w10, w8, #0xff
26642664
; CHECK-NOLSE-O1-NEXT: cmp w10, w9
2665-
; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, ls
2665+
; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, lo
26662666
; CHECK-NOLSE-O1-NEXT: stlxrb w11, w10, [x0]
26672667
; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB35_1
26682668
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -2677,7 +2677,7 @@ define i8 @atomicrmw_umin_i8(ptr %ptr, i8 %rhs) {
26772677
; CHECK-OUTLINE-O1-NEXT: ldaxrb w8, [x0]
26782678
; CHECK-OUTLINE-O1-NEXT: and w10, w8, #0xff
26792679
; CHECK-OUTLINE-O1-NEXT: cmp w10, w9
2680-
; CHECK-OUTLINE-O1-NEXT: csel w10, w10, w9, ls
2680+
; CHECK-OUTLINE-O1-NEXT: csel w10, w10, w9, lo
26812681
; CHECK-OUTLINE-O1-NEXT: stlxrb w11, w10, [x0]
26822682
; CHECK-OUTLINE-O1-NEXT: cbnz w11, LBB35_1
26832683
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -3477,7 +3477,7 @@ define i16 @atomicrmw_min_i16(ptr %ptr, i16 %rhs) {
34773477
; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0]
34783478
; CHECK-NOLSE-O1-NEXT: sxth w9, w8
34793479
; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxth
3480-
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, le
3480+
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lt
34813481
; CHECK-NOLSE-O1-NEXT: stxrh w10, w9, [x0]
34823482
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB43_1
34833483
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -3491,7 +3491,7 @@ define i16 @atomicrmw_min_i16(ptr %ptr, i16 %rhs) {
34913491
; CHECK-OUTLINE-O1-NEXT: ldaxrh w8, [x0]
34923492
; CHECK-OUTLINE-O1-NEXT: sxth w9, w8
34933493
; CHECK-OUTLINE-O1-NEXT: cmp w9, w1, sxth
3494-
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, le
3494+
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lt
34953495
; CHECK-OUTLINE-O1-NEXT: stxrh w10, w9, [x0]
34963496
; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB43_1
34973497
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -3718,7 +3718,7 @@ define i16 @atomicrmw_umin_i16(ptr %ptr, i16 %rhs) {
37183718
; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0]
37193719
; CHECK-NOLSE-O1-NEXT: and w10, w8, #0xffff
37203720
; CHECK-NOLSE-O1-NEXT: cmp w10, w9
3721-
; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, ls
3721+
; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, lo
37223722
; CHECK-NOLSE-O1-NEXT: stlxrh w11, w10, [x0]
37233723
; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB45_1
37243724
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -3733,7 +3733,7 @@ define i16 @atomicrmw_umin_i16(ptr %ptr, i16 %rhs) {
37333733
; CHECK-OUTLINE-O1-NEXT: ldaxrh w8, [x0]
37343734
; CHECK-OUTLINE-O1-NEXT: and w10, w8, #0xffff
37353735
; CHECK-OUTLINE-O1-NEXT: cmp w10, w9
3736-
; CHECK-OUTLINE-O1-NEXT: csel w10, w10, w9, ls
3736+
; CHECK-OUTLINE-O1-NEXT: csel w10, w10, w9, lo
37373737
; CHECK-OUTLINE-O1-NEXT: stlxrh w11, w10, [x0]
37383738
; CHECK-OUTLINE-O1-NEXT: cbnz w11, LBB45_1
37393739
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -4526,7 +4526,7 @@ define i32 @atomicrmw_min_i32(ptr %ptr, i32 %rhs) {
45264526
; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
45274527
; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]
45284528
; CHECK-NOLSE-O1-NEXT: cmp w8, w1
4529-
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, le
4529+
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lt
45304530
; CHECK-NOLSE-O1-NEXT: stxr w10, w9, [x0]
45314531
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB53_1
45324532
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -4539,7 +4539,7 @@ define i32 @atomicrmw_min_i32(ptr %ptr, i32 %rhs) {
45394539
; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
45404540
; CHECK-OUTLINE-O1-NEXT: ldaxr w8, [x0]
45414541
; CHECK-OUTLINE-O1-NEXT: cmp w8, w1
4542-
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, le
4542+
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lt
45434543
; CHECK-OUTLINE-O1-NEXT: stxr w10, w9, [x0]
45444544
; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB53_1
45454545
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -4754,7 +4754,7 @@ define i32 @atomicrmw_umin_i32(ptr %ptr, i32 %rhs) {
47544754
; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
47554755
; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]
47564756
; CHECK-NOLSE-O1-NEXT: cmp w8, w1
4757-
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, ls
4757+
; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lo
47584758
; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0]
47594759
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB55_1
47604760
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -4767,7 +4767,7 @@ define i32 @atomicrmw_umin_i32(ptr %ptr, i32 %rhs) {
47674767
; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
47684768
; CHECK-OUTLINE-O1-NEXT: ldaxr w8, [x0]
47694769
; CHECK-OUTLINE-O1-NEXT: cmp w8, w1
4770-
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, ls
4770+
; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lo
47714771
; CHECK-OUTLINE-O1-NEXT: stlxr w10, w9, [x0]
47724772
; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB55_1
47734773
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -5547,7 +5547,7 @@ define i64 @atomicrmw_min_i64(ptr %ptr, i64 %rhs) {
55475547
; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
55485548
; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]
55495549
; CHECK-NOLSE-O1-NEXT: cmp x8, x1
5550-
; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, le
5550+
; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, lt
55515551
; CHECK-NOLSE-O1-NEXT: stxr w10, x9, [x0]
55525552
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB63_1
55535553
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -5560,7 +5560,7 @@ define i64 @atomicrmw_min_i64(ptr %ptr, i64 %rhs) {
55605560
; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
55615561
; CHECK-OUTLINE-O1-NEXT: ldaxr x8, [x0]
55625562
; CHECK-OUTLINE-O1-NEXT: cmp x8, x1
5563-
; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, le
5563+
; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, lt
55645564
; CHECK-OUTLINE-O1-NEXT: stxr w10, x9, [x0]
55655565
; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB63_1
55665566
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -5775,7 +5775,7 @@ define i64 @atomicrmw_umin_i64(ptr %ptr, i64 %rhs) {
57755775
; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
57765776
; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]
57775777
; CHECK-NOLSE-O1-NEXT: cmp x8, x1
5778-
; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, ls
5778+
; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, lo
57795779
; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0]
57805780
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB65_1
57815781
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end
@@ -5788,7 +5788,7 @@ define i64 @atomicrmw_umin_i64(ptr %ptr, i64 %rhs) {
57885788
; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
57895789
; CHECK-OUTLINE-O1-NEXT: ldaxr x8, [x0]
57905790
; CHECK-OUTLINE-O1-NEXT: cmp x8, x1
5791-
; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, ls
5791+
; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, lo
57925792
; CHECK-OUTLINE-O1-NEXT: stlxr w10, x9, [x0]
57935793
; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB65_1
57945794
; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end

llvm/test/CodeGen/AArch64/GlobalISel/arm64-pcsections.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,7 @@ define i8 @atomicrmw_min_i8(ptr %ptr, i8 %rhs) {
888888
; CHECK-NEXT: renamable $w8 = LDAXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)
889889
; CHECK-NEXT: renamable $w9 = SBFMWri renamable $w8, 0, 7, pcsections !0
890890
; CHECK-NEXT: dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 32, implicit-def $nzcv, pcsections !0
891-
; CHECK-NEXT: renamable $w9 = CSELWr renamable $w8, renamable $w1, 13, implicit killed $nzcv, implicit-def $x9, pcsections !0
891+
; CHECK-NEXT: renamable $w9 = CSELWr renamable $w8, renamable $w1, 11, implicit killed $nzcv, implicit-def $x9, pcsections !0
892892
; CHECK-NEXT: early-clobber renamable $w10 = STXRB renamable $w9, renamable $x0, implicit killed $x9, pcsections !0 :: (volatile store (s8) into %ir.ptr)
893893
; CHECK-NEXT: CBNZW killed renamable $w10, %bb.1, pcsections !0
894894
; CHECK-NEXT: {{ $}}
@@ -943,7 +943,7 @@ define i8 @atomicrmw_umin_i8(ptr %ptr, i8 %rhs) {
943943
; CHECK-NEXT: renamable $w8 = LDAXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)
944944
; CHECK-NEXT: renamable $w10 = ANDWri renamable $w8, 7
945945
; CHECK-NEXT: $wzr = SUBSWrs renamable $w10, renamable $w9, 0, implicit-def $nzcv, pcsections !0
946-
; CHECK-NEXT: renamable $w10 = CSELWr killed renamable $w10, renamable $w9, 9, implicit killed $nzcv, implicit-def $x10, pcsections !0
946+
; CHECK-NEXT: renamable $w10 = CSELWr killed renamable $w10, renamable $w9, 3, implicit killed $nzcv, implicit-def $x10, pcsections !0
947947
; CHECK-NEXT: early-clobber renamable $w11 = STLXRB renamable $w10, renamable $x0, implicit killed $x10, pcsections !0 :: (volatile store (s8) into %ir.ptr)
948948
; CHECK-NEXT: CBNZW killed renamable $w11, %bb.1, pcsections !0
949949
; CHECK-NEXT: {{ $}}
@@ -1148,7 +1148,7 @@ define i16 @atomicrmw_min_i16(ptr %ptr, i16 %rhs) {
11481148
; CHECK-NEXT: renamable $w8 = LDAXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)
11491149
; CHECK-NEXT: renamable $w9 = SBFMWri renamable $w8, 0, 15, pcsections !0
11501150
; CHECK-NEXT: dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 40, implicit-def $nzcv, pcsections !0
1151-
; CHECK-NEXT: renamable $w9 = CSELWr renamable $w8, renamable $w1, 13, implicit killed $nzcv, implicit-def $x9, pcsections !0
1151+
; CHECK-NEXT: renamable $w9 = CSELWr renamable $w8, renamable $w1, 11, implicit killed $nzcv, implicit-def $x9, pcsections !0
11521152
; CHECK-NEXT: early-clobber renamable $w10 = STXRH renamable $w9, renamable $x0, implicit killed $x9, pcsections !0 :: (volatile store (s16) into %ir.ptr)
11531153
; CHECK-NEXT: CBNZW killed renamable $w10, %bb.1, pcsections !0
11541154
; CHECK-NEXT: {{ $}}
@@ -1203,7 +1203,7 @@ define i16 @atomicrmw_umin_i16(ptr %ptr, i16 %rhs) {
12031203
; CHECK-NEXT: renamable $w8 = LDAXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)
12041204
; CHECK-NEXT: renamable $w10 = ANDWri renamable $w8, 15
12051205
; CHECK-NEXT: $wzr = SUBSWrs renamable $w10, renamable $w9, 0, implicit-def $nzcv, pcsections !0
1206-
; CHECK-NEXT: renamable $w10 = CSELWr killed renamable $w10, renamable $w9, 9, implicit killed $nzcv, implicit-def $x10, pcsections !0
1206+
; CHECK-NEXT: renamable $w10 = CSELWr killed renamable $w10, renamable $w9, 3, implicit killed $nzcv, implicit-def $x10, pcsections !0
12071207
; CHECK-NEXT: early-clobber renamable $w11 = STLXRH renamable $w10, renamable $x0, implicit killed $x10, pcsections !0 :: (volatile store (s16) into %ir.ptr)
12081208
; CHECK-NEXT: CBNZW killed renamable $w11, %bb.1, pcsections !0
12091209
; CHECK-NEXT: {{ $}}

0 commit comments

Comments
 (0)