Skip to content

Commit 36cb33b

Browse files
authored
support branch hint for AtomicExpandImpl::expandAtomicCmpXchg (#152366)
The patch add branch hint for AtomicExpandImpl::expandAtomicCmpXchg, For example: in PowerPC, it support branch hint as ``` loop: lwarx r6,0,r3 # load and reserve cmpw r4,r6 #1st 2 operands equal? bne- exit #skip if not bne- exit #skip if not stwcx. r5,0,r3 #store new value if still res’ved bne- loop #loop if lost reservation bne- loop #loop if lost reservation exit: mr r4,r6 #return value from storage ``` `-` hints not taken, `+` hints taken,
1 parent 3ee6170 commit 36cb33b

26 files changed

+1746
-1862
lines changed

llvm/lib/CodeGen/AtomicExpandPass.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,7 +1460,8 @@ bool AtomicExpandImpl::expandAtomicCmpXchg(AtomicCmpXchgInst *CI) {
14601460

14611461
// If the cmpxchg doesn't actually need any ordering when it fails, we can
14621462
// jump straight past that fence instruction (if it exists).
1463-
Builder.CreateCondBr(ShouldStore, ReleasingStoreBB, NoStoreBB);
1463+
Builder.CreateCondBr(ShouldStore, ReleasingStoreBB, NoStoreBB,
1464+
MDBuilder(F->getContext()).createLikelyBranchWeights());
14641465

14651466
Builder.SetInsertPoint(ReleasingStoreBB);
14661467
if (ShouldInsertFencesForAtomic && !UseUnconditionalReleaseBarrier)
@@ -1479,7 +1480,8 @@ bool AtomicExpandImpl::expandAtomicCmpXchg(AtomicCmpXchgInst *CI) {
14791480
StoreSuccess, ConstantInt::get(Type::getInt32Ty(Ctx), 0), "success");
14801481
BasicBlock *RetryBB = HasReleasedLoadBB ? ReleasedLoadBB : StartBB;
14811482
Builder.CreateCondBr(StoreSuccess, SuccessBB,
1482-
CI->isWeak() ? FailureBB : RetryBB);
1483+
CI->isWeak() ? FailureBB : RetryBB,
1484+
MDBuilder(F->getContext()).createLikelyBranchWeights());
14831485

14841486
Builder.SetInsertPoint(ReleasedLoadBB);
14851487
Value *SecondLoad;
@@ -1492,7 +1494,9 @@ bool AtomicExpandImpl::expandAtomicCmpXchg(AtomicCmpXchgInst *CI) {
14921494

14931495
// If the cmpxchg doesn't actually need any ordering when it fails, we can
14941496
// jump straight past that fence instruction (if it exists).
1495-
Builder.CreateCondBr(ShouldStore, TryStoreBB, NoStoreBB);
1497+
Builder.CreateCondBr(
1498+
ShouldStore, TryStoreBB, NoStoreBB,
1499+
MDBuilder(F->getContext()).createLikelyBranchWeights());
14961500
// Update PHI node in TryStoreBB.
14971501
LoadedTryStore->addIncoming(SecondLoad, ReleasedLoadBB);
14981502
} else

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

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6002,15 +6002,17 @@ define { i8, i1 } @cmpxchg_i8(ptr %ptr, i8 %desired, i8 %new) {
60026002
; CHECK-NOLSE-O1-NEXT: b.ne LBB67_4
60036003
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore
60046004
; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB67_1 Depth=1
6005-
; CHECK-NOLSE-O1-NEXT: stxrb w9, w2, [x8]
6006-
; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB67_1
6007-
; CHECK-NOLSE-O1-NEXT: ; %bb.3:
6008-
; CHECK-NOLSE-O1-NEXT: mov w1, #1 ; =0x1
6005+
; CHECK-NOLSE-O1-NEXT: stxrb w10, w2, [x8]
6006+
; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x1
6007+
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB67_1
6008+
; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end
6009+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
60096010
; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0
60106011
; CHECK-NOLSE-O1-NEXT: ret
60116012
; CHECK-NOLSE-O1-NEXT: LBB67_4: ; %cmpxchg.nostore
6012-
; CHECK-NOLSE-O1-NEXT: mov w1, wzr
6013+
; CHECK-NOLSE-O1-NEXT: mov w9, wzr
60136014
; CHECK-NOLSE-O1-NEXT: clrex
6015+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
60146016
; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0
60156017
; CHECK-NOLSE-O1-NEXT: ret
60166018
;
@@ -6108,15 +6110,17 @@ define { i16, i1 } @cmpxchg_i16(ptr %ptr, i16 %desired, i16 %new) {
61086110
; CHECK-NOLSE-O1-NEXT: b.ne LBB68_4
61096111
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore
61106112
; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB68_1 Depth=1
6111-
; CHECK-NOLSE-O1-NEXT: stxrh w9, w2, [x8]
6112-
; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB68_1
6113-
; CHECK-NOLSE-O1-NEXT: ; %bb.3:
6114-
; CHECK-NOLSE-O1-NEXT: mov w1, #1 ; =0x1
6113+
; CHECK-NOLSE-O1-NEXT: stxrh w10, w2, [x8]
6114+
; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x1
6115+
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB68_1
6116+
; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end
6117+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
61156118
; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0
61166119
; CHECK-NOLSE-O1-NEXT: ret
61176120
; CHECK-NOLSE-O1-NEXT: LBB68_4: ; %cmpxchg.nostore
6118-
; CHECK-NOLSE-O1-NEXT: mov w1, wzr
6121+
; CHECK-NOLSE-O1-NEXT: mov w9, wzr
61196122
; CHECK-NOLSE-O1-NEXT: clrex
6123+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
61206124
; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0
61216125
; CHECK-NOLSE-O1-NEXT: ret
61226126
;
@@ -6206,22 +6210,24 @@ define { i32, i1 } @cmpxchg_i32(ptr %ptr, i32 %desired, i32 %new) {
62066210
; CHECK-NOLSE-O1-LABEL: cmpxchg_i32:
62076211
; CHECK-NOLSE-O1: ; %bb.0:
62086212
; CHECK-NOLSE-O1-NEXT: mov x8, x0
6213+
; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x1
62096214
; CHECK-NOLSE-O1-NEXT: LBB69_1: ; %cmpxchg.start
62106215
; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
62116216
; CHECK-NOLSE-O1-NEXT: ldxr w0, [x8]
62126217
; CHECK-NOLSE-O1-NEXT: cmp w0, w1
62136218
; CHECK-NOLSE-O1-NEXT: b.ne LBB69_4
62146219
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore
62156220
; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB69_1 Depth=1
6216-
; CHECK-NOLSE-O1-NEXT: stxr w9, w2, [x8]
6217-
; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB69_1
6218-
; CHECK-NOLSE-O1-NEXT: ; %bb.3:
6219-
; CHECK-NOLSE-O1-NEXT: mov w1, #1 ; =0x1
6221+
; CHECK-NOLSE-O1-NEXT: stxr w10, w2, [x8]
6222+
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB69_1
6223+
; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end
6224+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
62206225
; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0
62216226
; CHECK-NOLSE-O1-NEXT: ret
62226227
; CHECK-NOLSE-O1-NEXT: LBB69_4: ; %cmpxchg.nostore
6223-
; CHECK-NOLSE-O1-NEXT: mov w1, wzr
6228+
; CHECK-NOLSE-O1-NEXT: mov w9, wzr
62246229
; CHECK-NOLSE-O1-NEXT: clrex
6230+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
62256231
; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0
62266232
; CHECK-NOLSE-O1-NEXT: ret
62276233
;
@@ -6306,21 +6312,23 @@ define { i64, i1 } @cmpxchg_i64(ptr %ptr, i64 %desired, i64 %new) {
63066312
; CHECK-NOLSE-O1-LABEL: cmpxchg_i64:
63076313
; CHECK-NOLSE-O1: ; %bb.0:
63086314
; CHECK-NOLSE-O1-NEXT: mov x8, x0
6315+
; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x1
63096316
; CHECK-NOLSE-O1-NEXT: LBB70_1: ; %cmpxchg.start
63106317
; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
63116318
; CHECK-NOLSE-O1-NEXT: ldxr x0, [x8]
63126319
; CHECK-NOLSE-O1-NEXT: cmp x0, x1
63136320
; CHECK-NOLSE-O1-NEXT: b.ne LBB70_4
63146321
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore
63156322
; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB70_1 Depth=1
6316-
; CHECK-NOLSE-O1-NEXT: stxr w9, x2, [x8]
6317-
; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB70_1
6318-
; CHECK-NOLSE-O1-NEXT: ; %bb.3:
6319-
; CHECK-NOLSE-O1-NEXT: mov w1, #1 ; =0x1
6323+
; CHECK-NOLSE-O1-NEXT: stxr w10, x2, [x8]
6324+
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB70_1
6325+
; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end
6326+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
63206327
; CHECK-NOLSE-O1-NEXT: ret
63216328
; CHECK-NOLSE-O1-NEXT: LBB70_4: ; %cmpxchg.nostore
6322-
; CHECK-NOLSE-O1-NEXT: mov w1, wzr
6329+
; CHECK-NOLSE-O1-NEXT: mov w9, wzr
63236330
; CHECK-NOLSE-O1-NEXT: clrex
6331+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
63246332
; CHECK-NOLSE-O1-NEXT: ret
63256333
;
63266334
; CHECK-OUTLINE-O1-LABEL: cmpxchg_i64:
@@ -6404,21 +6412,23 @@ define { ptr, i1 } @cmpxchg_ptr(ptr %ptr, ptr %desired, ptr %new) {
64046412
; CHECK-NOLSE-O1-LABEL: cmpxchg_ptr:
64056413
; CHECK-NOLSE-O1: ; %bb.0:
64066414
; CHECK-NOLSE-O1-NEXT: mov x8, x0
6415+
; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x1
64076416
; CHECK-NOLSE-O1-NEXT: LBB71_1: ; %cmpxchg.start
64086417
; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1
64096418
; CHECK-NOLSE-O1-NEXT: ldxr x0, [x8]
64106419
; CHECK-NOLSE-O1-NEXT: cmp x0, x1
64116420
; CHECK-NOLSE-O1-NEXT: b.ne LBB71_4
64126421
; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore
64136422
; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB71_1 Depth=1
6414-
; CHECK-NOLSE-O1-NEXT: stxr w9, x2, [x8]
6415-
; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB71_1
6416-
; CHECK-NOLSE-O1-NEXT: ; %bb.3:
6417-
; CHECK-NOLSE-O1-NEXT: mov w1, #1 ; =0x1
6423+
; CHECK-NOLSE-O1-NEXT: stxr w10, x2, [x8]
6424+
; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB71_1
6425+
; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end
6426+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
64186427
; CHECK-NOLSE-O1-NEXT: ret
64196428
; CHECK-NOLSE-O1-NEXT: LBB71_4: ; %cmpxchg.nostore
6420-
; CHECK-NOLSE-O1-NEXT: mov w1, wzr
6429+
; CHECK-NOLSE-O1-NEXT: mov w9, wzr
64216430
; CHECK-NOLSE-O1-NEXT: clrex
6431+
; CHECK-NOLSE-O1-NEXT: mov w1, w9
64226432
; CHECK-NOLSE-O1-NEXT: ret
64236433
;
64246434
; CHECK-OUTLINE-O1-LABEL: cmpxchg_ptr:

0 commit comments

Comments
 (0)