-
Notifications
You must be signed in to change notification settings - Fork 14.7k
[PowecPC] Hint branch for atomic operation #152529
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
…atic prediction is honored
@llvm/pr-subscribers-backend-powerpc Author: zhijian lin (diggerlin) ChangesThe branches emitted for atomic operations are currently not hinted, even though they should be. According to the Power10 Processor Chip User’s Manual:
This patch addresses the issue by adding explicit branch hints for atomic operations. Patch is 256.08 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/152529.diff 8 Files Affected:
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index 459525ed4ee9a..bbba6e23140b2 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -12954,7 +12954,7 @@ PPCTargetLowering::EmitAtomicBinary(MachineInstr &MI, MachineBasicBlock *BB,
BuildMI(BB, dl, TII->get(StoreMnemonic))
.addReg(TmpReg).addReg(ptrA).addReg(ptrB);
BuildMI(BB, dl, TII->get(PPC::BCC))
- .addImm(PPC::PRED_NE).addReg(PPC::CR0).addMBB(loopMBB);
+ .addImm(PPC::PRED_NE_MINUS).addReg(PPC::CR0).addMBB(loopMBB);
BB->addSuccessor(loopMBB);
BB->addSuccessor(exitMBB);
@@ -13212,7 +13212,7 @@ MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary(
.addReg(ZeroReg)
.addReg(PtrReg);
BuildMI(BB, dl, TII->get(PPC::BCC))
- .addImm(PPC::PRED_NE)
+ .addImm(PPC::PRED_NE_MINUS)
.addReg(PPC::CR0)
.addMBB(loopMBB);
BB->addSuccessor(loopMBB);
@@ -14043,7 +14043,7 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
.addReg(dest)
.addReg(oldval);
BuildMI(BB, dl, TII->get(PPC::BCC))
- .addImm(PPC::PRED_NE)
+ .addImm(PPC::PRED_NE_MINUS)
.addReg(CrReg)
.addMBB(exitMBB);
BB->addSuccessor(loop2MBB);
@@ -14055,7 +14055,7 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
.addReg(ptrA)
.addReg(ptrB);
BuildMI(BB, dl, TII->get(PPC::BCC))
- .addImm(PPC::PRED_NE)
+ .addImm(PPC::PRED_NE_MINUS)
.addReg(PPC::CR0)
.addMBB(loop1MBB);
BuildMI(BB, dl, TII->get(PPC::B)).addMBB(exitMBB);
diff --git a/llvm/test/CodeGen/PowerPC/all-atomics.ll b/llvm/test/CodeGen/PowerPC/all-atomics.ll
index 07afea75aec67..8b9755fed43d9 100644
--- a/llvm/test/CodeGen/PowerPC/all-atomics.ll
+++ b/llvm/test/CodeGen/PowerPC/all-atomics.ll
@@ -33,7 +33,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 5, 0, 4
; CHECK-NEXT: addi 5, 5, 1
; CHECK-NEXT: stbcx. 5, 0, 4
-; CHECK-NEXT: bne 0, .LBB0_1
+; CHECK-NEXT: bne- 0, .LBB0_1
; CHECK-NEXT: # %bb.2: # %entry
; CHECK-NEXT: addis 5, 2, uc@toc@ha
; CHECK-NEXT: lwsync
@@ -44,7 +44,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 6, 0, 5
; CHECK-NEXT: addi 6, 6, 1
; CHECK-NEXT: stbcx. 6, 0, 5
-; CHECK-NEXT: bne 0, .LBB0_3
+; CHECK-NEXT: bne- 0, .LBB0_3
; CHECK-NEXT: # %bb.4: # %entry
; CHECK-NEXT: addis 6, 2, ss@toc@ha
; CHECK-NEXT: lwsync
@@ -55,7 +55,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 7, 0, 6
; CHECK-NEXT: addi 7, 7, 1
; CHECK-NEXT: sthcx. 7, 0, 6
-; CHECK-NEXT: bne 0, .LBB0_5
+; CHECK-NEXT: bne- 0, .LBB0_5
; CHECK-NEXT: # %bb.6: # %entry
; CHECK-NEXT: addis 7, 2, us@toc@ha
; CHECK-NEXT: lwsync
@@ -66,7 +66,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 7, 0, 8
; CHECK-NEXT: addi 7, 7, 1
; CHECK-NEXT: sthcx. 7, 0, 8
-; CHECK-NEXT: bne 0, .LBB0_7
+; CHECK-NEXT: bne- 0, .LBB0_7
; CHECK-NEXT: # %bb.8: # %entry
; CHECK-NEXT: addis 7, 2, si@toc@ha
; CHECK-NEXT: lwsync
@@ -77,7 +77,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 7, 0, 9
; CHECK-NEXT: addi 7, 7, 1
; CHECK-NEXT: stwcx. 7, 0, 9
-; CHECK-NEXT: bne 0, .LBB0_9
+; CHECK-NEXT: bne- 0, .LBB0_9
; CHECK-NEXT: # %bb.10: # %entry
; CHECK-NEXT: addis 7, 2, ui@toc@ha
; CHECK-NEXT: lwsync
@@ -88,7 +88,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 7, 0, 10
; CHECK-NEXT: addi 7, 7, 1
; CHECK-NEXT: stwcx. 7, 0, 10
-; CHECK-NEXT: bne 0, .LBB0_11
+; CHECK-NEXT: bne- 0, .LBB0_11
; CHECK-NEXT: # %bb.12: # %entry
; CHECK-NEXT: addis 7, 2, sll@toc@ha
; CHECK-NEXT: lwsync
@@ -100,7 +100,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 12, 0, 11
; CHECK-NEXT: addi 12, 12, 1
; CHECK-NEXT: stdcx. 12, 0, 11
-; CHECK-NEXT: bne 0, .LBB0_13
+; CHECK-NEXT: bne- 0, .LBB0_13
; CHECK-NEXT: # %bb.14: # %entry
; CHECK-NEXT: addis 12, 2, ull@toc@ha
; CHECK-NEXT: lwsync
@@ -111,7 +111,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 30, 0, 12
; CHECK-NEXT: addi 0, 30, 1
; CHECK-NEXT: stdcx. 0, 0, 12
-; CHECK-NEXT: bne 0, .LBB0_15
+; CHECK-NEXT: bne- 0, .LBB0_15
; CHECK-NEXT: # %bb.16: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -120,7 +120,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 4
; CHECK-NEXT: sub 0, 0, 3
; CHECK-NEXT: stbcx. 0, 0, 4
-; CHECK-NEXT: bne 0, .LBB0_17
+; CHECK-NEXT: bne- 0, .LBB0_17
; CHECK-NEXT: # %bb.18: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -129,7 +129,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 5
; CHECK-NEXT: sub 0, 0, 3
; CHECK-NEXT: stbcx. 0, 0, 5
-; CHECK-NEXT: bne 0, .LBB0_19
+; CHECK-NEXT: bne- 0, .LBB0_19
; CHECK-NEXT: # %bb.20: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -138,7 +138,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 6
; CHECK-NEXT: sub 0, 0, 3
; CHECK-NEXT: sthcx. 0, 0, 6
-; CHECK-NEXT: bne 0, .LBB0_21
+; CHECK-NEXT: bne- 0, .LBB0_21
; CHECK-NEXT: # %bb.22: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -147,7 +147,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 8
; CHECK-NEXT: sub 0, 0, 3
; CHECK-NEXT: sthcx. 0, 0, 8
-; CHECK-NEXT: bne 0, .LBB0_23
+; CHECK-NEXT: bne- 0, .LBB0_23
; CHECK-NEXT: # %bb.24: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -156,7 +156,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 9
; CHECK-NEXT: sub 0, 0, 3
; CHECK-NEXT: stwcx. 0, 0, 9
-; CHECK-NEXT: bne 0, .LBB0_25
+; CHECK-NEXT: bne- 0, .LBB0_25
; CHECK-NEXT: # %bb.26: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -165,7 +165,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 10
; CHECK-NEXT: sub 0, 0, 3
; CHECK-NEXT: stwcx. 0, 0, 10
-; CHECK-NEXT: bne 0, .LBB0_27
+; CHECK-NEXT: bne- 0, .LBB0_27
; CHECK-NEXT: # %bb.28: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -174,7 +174,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 11
; CHECK-NEXT: sub 0, 0, 7
; CHECK-NEXT: stdcx. 0, 0, 11
-; CHECK-NEXT: bne 0, .LBB0_29
+; CHECK-NEXT: bne- 0, .LBB0_29
; CHECK-NEXT: # %bb.30: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -183,7 +183,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 12
; CHECK-NEXT: sub 0, 0, 7
; CHECK-NEXT: stdcx. 0, 0, 12
-; CHECK-NEXT: bne 0, .LBB0_31
+; CHECK-NEXT: bne- 0, .LBB0_31
; CHECK-NEXT: # %bb.32: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -192,7 +192,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 4
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: stbcx. 0, 0, 4
-; CHECK-NEXT: bne 0, .LBB0_33
+; CHECK-NEXT: bne- 0, .LBB0_33
; CHECK-NEXT: # %bb.34: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -201,7 +201,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 5
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: stbcx. 0, 0, 5
-; CHECK-NEXT: bne 0, .LBB0_35
+; CHECK-NEXT: bne- 0, .LBB0_35
; CHECK-NEXT: # %bb.36: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -210,7 +210,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 6
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: sthcx. 0, 0, 6
-; CHECK-NEXT: bne 0, .LBB0_37
+; CHECK-NEXT: bne- 0, .LBB0_37
; CHECK-NEXT: # %bb.38: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -219,7 +219,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 8
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: sthcx. 0, 0, 8
-; CHECK-NEXT: bne 0, .LBB0_39
+; CHECK-NEXT: bne- 0, .LBB0_39
; CHECK-NEXT: # %bb.40: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -228,7 +228,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 9
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: stwcx. 0, 0, 9
-; CHECK-NEXT: bne 0, .LBB0_41
+; CHECK-NEXT: bne- 0, .LBB0_41
; CHECK-NEXT: # %bb.42: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -237,7 +237,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 10
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: stwcx. 0, 0, 10
-; CHECK-NEXT: bne 0, .LBB0_43
+; CHECK-NEXT: bne- 0, .LBB0_43
; CHECK-NEXT: # %bb.44: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -246,7 +246,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 11
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: stdcx. 0, 0, 11
-; CHECK-NEXT: bne 0, .LBB0_45
+; CHECK-NEXT: bne- 0, .LBB0_45
; CHECK-NEXT: # %bb.46: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -255,7 +255,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 12
; CHECK-NEXT: ori 0, 0, 1
; CHECK-NEXT: stdcx. 0, 0, 12
-; CHECK-NEXT: bne 0, .LBB0_47
+; CHECK-NEXT: bne- 0, .LBB0_47
; CHECK-NEXT: # %bb.48: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -264,7 +264,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 4
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: stbcx. 0, 0, 4
-; CHECK-NEXT: bne 0, .LBB0_49
+; CHECK-NEXT: bne- 0, .LBB0_49
; CHECK-NEXT: # %bb.50: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -273,7 +273,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 5
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: stbcx. 0, 0, 5
-; CHECK-NEXT: bne 0, .LBB0_51
+; CHECK-NEXT: bne- 0, .LBB0_51
; CHECK-NEXT: # %bb.52: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -282,7 +282,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 6
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: sthcx. 0, 0, 6
-; CHECK-NEXT: bne 0, .LBB0_53
+; CHECK-NEXT: bne- 0, .LBB0_53
; CHECK-NEXT: # %bb.54: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -291,7 +291,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 8
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: sthcx. 0, 0, 8
-; CHECK-NEXT: bne 0, .LBB0_55
+; CHECK-NEXT: bne- 0, .LBB0_55
; CHECK-NEXT: # %bb.56: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -300,7 +300,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 9
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: stwcx. 0, 0, 9
-; CHECK-NEXT: bne 0, .LBB0_57
+; CHECK-NEXT: bne- 0, .LBB0_57
; CHECK-NEXT: # %bb.58: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -309,7 +309,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 10
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: stwcx. 0, 0, 10
-; CHECK-NEXT: bne 0, .LBB0_59
+; CHECK-NEXT: bne- 0, .LBB0_59
; CHECK-NEXT: # %bb.60: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -318,7 +318,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 11
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: stdcx. 0, 0, 11
-; CHECK-NEXT: bne 0, .LBB0_61
+; CHECK-NEXT: bne- 0, .LBB0_61
; CHECK-NEXT: # %bb.62: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -327,7 +327,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 12
; CHECK-NEXT: xori 0, 0, 1
; CHECK-NEXT: stdcx. 0, 0, 12
-; CHECK-NEXT: bne 0, .LBB0_63
+; CHECK-NEXT: bne- 0, .LBB0_63
; CHECK-NEXT: # %bb.64: # %entry
; CHECK-NEXT: addis 30, 2, u128@toc@ha
; CHECK-NEXT: lwsync
@@ -361,7 +361,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 4
; CHECK-NEXT: nand 0, 3, 0
; CHECK-NEXT: stbcx. 0, 0, 4
-; CHECK-NEXT: bne 0, .LBB0_69
+; CHECK-NEXT: bne- 0, .LBB0_69
; CHECK-NEXT: # %bb.70: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -370,7 +370,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 5
; CHECK-NEXT: nand 0, 3, 0
; CHECK-NEXT: stbcx. 0, 0, 5
-; CHECK-NEXT: bne 0, .LBB0_71
+; CHECK-NEXT: bne- 0, .LBB0_71
; CHECK-NEXT: # %bb.72: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -379,7 +379,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 6
; CHECK-NEXT: nand 0, 3, 0
; CHECK-NEXT: sthcx. 0, 0, 6
-; CHECK-NEXT: bne 0, .LBB0_73
+; CHECK-NEXT: bne- 0, .LBB0_73
; CHECK-NEXT: # %bb.74: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -388,7 +388,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 0, 0, 8
; CHECK-NEXT: nand 0, 3, 0
; CHECK-NEXT: sthcx. 0, 0, 8
-; CHECK-NEXT: bne 0, .LBB0_75
+; CHECK-NEXT: bne- 0, .LBB0_75
; CHECK-NEXT: # %bb.76: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -397,7 +397,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 9
; CHECK-NEXT: nand 0, 3, 0
; CHECK-NEXT: stwcx. 0, 0, 9
-; CHECK-NEXT: bne 0, .LBB0_77
+; CHECK-NEXT: bne- 0, .LBB0_77
; CHECK-NEXT: # %bb.78: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -406,7 +406,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 0, 0, 10
; CHECK-NEXT: nand 0, 3, 0
; CHECK-NEXT: stwcx. 0, 0, 10
-; CHECK-NEXT: bne 0, .LBB0_79
+; CHECK-NEXT: bne- 0, .LBB0_79
; CHECK-NEXT: # %bb.80: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -415,7 +415,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 11
; CHECK-NEXT: nand 0, 7, 0
; CHECK-NEXT: stdcx. 0, 0, 11
-; CHECK-NEXT: bne 0, .LBB0_81
+; CHECK-NEXT: bne- 0, .LBB0_81
; CHECK-NEXT: # %bb.82: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -424,7 +424,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 0, 0, 12
; CHECK-NEXT: nand 0, 7, 0
; CHECK-NEXT: stdcx. 0, 0, 12
-; CHECK-NEXT: bne 0, .LBB0_83
+; CHECK-NEXT: bne- 0, .LBB0_83
; CHECK-NEXT: # %bb.84: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -433,7 +433,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 0, 0, 4
; CHECK-NEXT: and 0, 3, 0
; CHECK-NEXT: stbcx. 0, 0, 4
-; CHECK-NEXT: bne 0, .LBB0_85
+; CHECK-NEXT: bne- 0, .LBB0_85
; CHECK-NEXT: # %bb.86: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -442,7 +442,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lbarx 4, 0, 5
; CHECK-NEXT: and 4, 3, 4
; CHECK-NEXT: stbcx. 4, 0, 5
-; CHECK-NEXT: bne 0, .LBB0_87
+; CHECK-NEXT: bne- 0, .LBB0_87
; CHECK-NEXT: # %bb.88: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -451,7 +451,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 4, 0, 6
; CHECK-NEXT: and 4, 3, 4
; CHECK-NEXT: sthcx. 4, 0, 6
-; CHECK-NEXT: bne 0, .LBB0_89
+; CHECK-NEXT: bne- 0, .LBB0_89
; CHECK-NEXT: # %bb.90: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -460,7 +460,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lharx 4, 0, 8
; CHECK-NEXT: and 4, 3, 4
; CHECK-NEXT: sthcx. 4, 0, 8
-; CHECK-NEXT: bne 0, .LBB0_91
+; CHECK-NEXT: bne- 0, .LBB0_91
; CHECK-NEXT: # %bb.92: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -469,7 +469,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 4, 0, 9
; CHECK-NEXT: and 4, 3, 4
; CHECK-NEXT: stwcx. 4, 0, 9
-; CHECK-NEXT: bne 0, .LBB0_93
+; CHECK-NEXT: bne- 0, .LBB0_93
; CHECK-NEXT: # %bb.94: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -478,7 +478,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: lwarx 4, 0, 10
; CHECK-NEXT: and 4, 3, 4
; CHECK-NEXT: stwcx. 4, 0, 10
-; CHECK-NEXT: bne 0, .LBB0_95
+; CHECK-NEXT: bne- 0, .LBB0_95
; CHECK-NEXT: # %bb.96: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -487,7 +487,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 3, 0, 11
; CHECK-NEXT: and 3, 7, 3
; CHECK-NEXT: stdcx. 3, 0, 11
-; CHECK-NEXT: bne 0, .LBB0_97
+; CHECK-NEXT: bne- 0, .LBB0_97
; CHECK-NEXT: # %bb.98: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: sync
@@ -496,7 +496,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; CHECK-NEXT: ldarx 3, 0, 12
; CHECK-NEXT: and 3, 7, 3
; CHECK-NEXT: stdcx. 3, 0, 12
-; CHECK-NEXT: bne 0, .LBB0_99
+; CHECK-NEXT: bne- 0, .LBB0_99
; CHECK-NEXT: # %bb.100: # %entry
; CHECK-NEXT: lwsync
; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload
@@ -545,7 +545,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; AIX32-NEXT: and 5, 5, 3
; AIX32-NEXT: or 4, 5, 4
; AIX32-NEXT: stwcx. 4, 0, 28
-; AIX32-NEXT: bne 0, L..BB0_1
+; AIX32-NEXT: bne- 0, L..BB0_1
; AIX32-NEXT: # %bb.2: # %entry
; AIX32-NEXT: lwz 3, L..C1(2) # @uc
; AIX32-NEXT: lwsync
@@ -564,7 +564,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; AIX32-NEXT: and 5, 5, 3
; AIX32-NEXT: or 4, 5, 4
; AIX32-NEXT: stwcx. 4, 0, 27
-; AIX32-NEXT: bne 0, L..BB0_3
+; AIX32-NEXT: bne- 0, L..BB0_3
; AIX32-NEXT: # %bb.4: # %entry
; AIX32-NEXT: lwz 3, L..C2(2) # @ss
; AIX32-NEXT: lwsync
@@ -584,7 +584,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; AIX32-NEXT: and 5, 5, 3
; AIX32-NEXT: or 4, 5, 4
; AIX32-NEXT: stwcx. 4, 0, 25
-; AIX32-NEXT: bne 0, L..BB0_5
+; AIX32-NEXT: bne- 0, L..BB0_5
; AIX32-NEXT: # %bb.6: # %entry
; AIX32-NEXT: lwz 3, L..C3(2) # @us
; AIX32-NEXT: lwsync
@@ -604,7 +604,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; AIX32-NEXT: and 5, 5, 3
; AIX32-NEXT: or 4, 5, 4
; AIX32-NEXT: stwcx. 4, 0, 23
-; AIX32-NEXT: bne 0, L..BB0_7
+; AIX32-NEXT: bne- 0, L..BB0_7
; AIX32-NEXT: # %bb.8: # %entry
; AIX32-NEXT: lwsync
; AIX32-NEXT: lwz 20, L..C4(2) # @si
@@ -614,7 +614,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; AIX32-NEXT: lwarx 3, 0, 20
; AIX32-NEXT: addi 3, 3, 1
; AIX32-NEXT: stwcx. 3, 0, 20
-; AIX32-NEXT: bne 0, L..BB0_9
+; AIX32-NEXT: bne- 0, L..BB0_9
; AIX32-NEXT: # %bb.10: # %entry
; AIX32-NEXT: lwsync
; AIX32-NEXT: lwz 19, L..C5(2) # @ui
@@ -624,7 +624,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; AIX32-NEXT: lwarx 3, 0, 19
; AIX32-NEXT: addi 3, 3, 1
; AIX32-NEXT: stwcx. 3, 0, 19
-; AIX32-NEXT: bne 0, L..BB0_11
+; AIX32-NEXT: bne- 0, L..BB0_11
; AIX32-NEXT: # %bb.12: # %entry
; AIX32-NEXT: lwz 31, L..C6(2) # @sll
; AIX32-NEXT: lwsync
@@ -652,7 +652,7 @@ define dso_local void @test_op_ignore() local_unnamed_addr #0 {
; AIX32-NEXT: and 5, 5, 3
; AIX32-NEXT: or 4, 5, 4
; AIX32-NEXT: stwcx. 4, 0, 28
-; AIX32-NEXT: bne 0, L..BB0_13
+; AIX32-NEXT: bne- 0, L..BB0_13
; AIX32-NEXT: # %bb.14: # %entry
; AIX32-NEXT: li 3, 255
; AIX32-NEXT: lwsync
@@ -666,7 +666,7 @@ define dso_local void @test...
[truncated]
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
The branches emitted for atomic operations are currently not hinted, even though they should be.
According to the Power10 Processor Chip User’s Manual:
“Without static prediction, if the lock is not acquired in the first iteration, the branch history mechanism works to update the prediction to predict taken; that is, predict lock acquisition failure and cause more lwarx traffic for the next iteration.”
This patch addresses the issue by adding explicit branch hints for atomic operations.