Skip to content

Commit e99d8bb

Browse files
authored
[PowerPC] eliminate RLWINM instruction following LBARX as possible (#144089)
LBARX loads a byte from memory into a register, automatically setting the remaining bits of the register to zero. If a subsequent RLWINM instruction is used to clear those same bits (which LBARX has already set to zero), the RLWINM is redundant and can be eliminated. these redundant clear instructions are introduced by 85a9f2e.
1 parent 31bf934 commit e99d8bb

File tree

5 files changed

+23
-95
lines changed

5 files changed

+23
-95
lines changed

llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4961,6 +4961,21 @@ bool PPCDAGToDAGISel::tryAsSingleRLWINM(SDNode *N) {
49614961
// If this is just a masked value where the input is not handled, and
49624962
// is not a rotate-left (handled by a pattern in the .td file), emit rlwinm
49634963
if (isRunOfOnes(Imm, MB, ME) && Val.getOpcode() != ISD::ROTL) {
4964+
// The result of LBARX/LHARX do not need to be cleared as the instructions
4965+
// implicitly clear the upper bits.
4966+
unsigned AlreadyCleared = 0;
4967+
if (Val.getOpcode() == ISD::INTRINSIC_W_CHAIN) {
4968+
auto IntrinsicID = Val.getConstantOperandVal(1);
4969+
if (IntrinsicID == Intrinsic::ppc_lbarx)
4970+
AlreadyCleared = 24;
4971+
else if (IntrinsicID == Intrinsic::ppc_lharx)
4972+
AlreadyCleared = 16;
4973+
if (AlreadyCleared != 0 && AlreadyCleared == MB && ME == 31) {
4974+
ReplaceUses(SDValue(N, 0), N->getOperand(0));
4975+
return true;
4976+
}
4977+
}
4978+
49644979
SDValue Ops[] = {Val, getI32Imm(0, dl), getI32Imm(MB, dl),
49654980
getI32Imm(ME, dl)};
49664981
CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops);

llvm/test/CodeGen/PowerPC/PR35812-neg-cmpxchg.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ define signext i32 @main() nounwind {
1818
; CHECK-NEXT: sth 3, 46(1)
1919
; CHECK-NEXT: addi 3, 1, 46
2020
; CHECK-NEXT: lharx 4, 0, 3
21-
; CHECK-NEXT: clrlwi 4, 4, 16
2221
; CHECK-NEXT: cmplwi 4, 33059
2322
; CHECK-NEXT: bne 0, .LBB0_4
2423
; CHECK-NEXT: # %bb.1: # %cmpxchg.fencedstore
@@ -32,7 +31,6 @@ define signext i32 @main() nounwind {
3231
; CHECK-NEXT: # %bb.3: # %cmpxchg.releasedload
3332
; CHECK-NEXT: #
3433
; CHECK-NEXT: lharx 5, 0, 3
35-
; CHECK-NEXT: clrlwi 5, 5, 16
3634
; CHECK-NEXT: cmplwi 5, 33059
3735
; CHECK-NEXT: beq 0, .LBB0_2
3836
; CHECK-NEXT: .LBB0_4: # %cmpxchg.nostore

llvm/test/CodeGen/PowerPC/all-atomics.ll

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4346,8 +4346,7 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
43464346
; CHECK-NEXT: lbz 7, uc@toc@l(3)
43474347
; CHECK-NEXT: lbz 8, sc@toc@l(4)
43484348
; CHECK-NEXT: lbarx 5, 0, 6
4349-
; CHECK-NEXT: clrlwi 9, 5, 24
4350-
; CHECK-NEXT: cmplw 9, 7
4349+
; CHECK-NEXT: cmplw 5, 7
43514350
; CHECK-NEXT: bne 0, .LBB3_4
43524351
; CHECK-NEXT: # %bb.1: # %cmpxchg.fencedstore276
43534352
; CHECK-NEXT: sync
@@ -4359,17 +4358,15 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
43594358
; CHECK-NEXT: # %bb.3: # %cmpxchg.releasedload274
43604359
; CHECK-NEXT: #
43614360
; CHECK-NEXT: lbarx 5, 0, 6
4362-
; CHECK-NEXT: clrlwi 9, 5, 24
4363-
; CHECK-NEXT: cmplw 9, 7
4361+
; CHECK-NEXT: cmplw 5, 7
43644362
; CHECK-NEXT: beq 0, .LBB3_2
43654363
; CHECK-NEXT: .LBB3_4: # %cmpxchg.nostore272
43664364
; CHECK-NEXT: addi 7, 3, uc@toc@l
43674365
; CHECK-NEXT: lwsync
43684366
; CHECK-NEXT: stb 5, sc@toc@l(4)
43694367
; CHECK-NEXT: lbz 9, uc@toc@l(3)
43704368
; CHECK-NEXT: lbarx 8, 0, 7
4371-
; CHECK-NEXT: clrlwi 10, 8, 24
4372-
; CHECK-NEXT: cmplw 10, 9
4369+
; CHECK-NEXT: cmplw 8, 9
43734370
; CHECK-NEXT: bne 0, .LBB3_8
43744371
; CHECK-NEXT: # %bb.5: # %cmpxchg.fencedstore257
43754372
; CHECK-NEXT: sync
@@ -4382,8 +4379,7 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
43824379
; CHECK-NEXT: # %bb.7: # %cmpxchg.releasedload255
43834380
; CHECK-NEXT: #
43844381
; CHECK-NEXT: lbarx 8, 0, 7
4385-
; CHECK-NEXT: clrlwi 10, 8, 24
4386-
; CHECK-NEXT: cmplw 10, 9
4382+
; CHECK-NEXT: cmplw 8, 9
43874383
; CHECK-NEXT: beq 0, .LBB3_6
43884384
; CHECK-NEXT: .LBB3_8: # %cmpxchg.nostore253
43894385
; CHECK-NEXT: addis 5, 2, ss@toc@ha
@@ -4393,8 +4389,7 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
43934389
; CHECK-NEXT: lbz 11, sc@toc@l(4)
43944390
; CHECK-NEXT: addi 8, 5, ss@toc@l
43954391
; CHECK-NEXT: lharx 9, 0, 8
4396-
; CHECK-NEXT: clrlwi 12, 9, 16
4397-
; CHECK-NEXT: cmplw 12, 10
4392+
; CHECK-NEXT: cmplw 9, 10
43984393
; CHECK-NEXT: bne 0, .LBB3_12
43994394
; CHECK-NEXT: # %bb.9: # %cmpxchg.fencedstore238
44004395
; CHECK-NEXT: extsb 11, 11
@@ -4408,8 +4403,7 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
44084403
; CHECK-NEXT: # %bb.11: # %cmpxchg.releasedload236
44094404
; CHECK-NEXT: #
44104405
; CHECK-NEXT: lharx 9, 0, 8
4411-
; CHECK-NEXT: clrlwi 12, 9, 16
4412-
; CHECK-NEXT: cmplw 12, 10
4406+
; CHECK-NEXT: cmplw 9, 10
44134407
; CHECK-NEXT: beq 0, .LBB3_10
44144408
; CHECK-NEXT: .LBB3_12: # %cmpxchg.nostore234
44154409
; CHECK-NEXT: lwsync
@@ -4419,8 +4413,7 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
44194413
; CHECK-NEXT: lbz 12, sc@toc@l(4)
44204414
; CHECK-NEXT: addi 9, 5, us@toc@l
44214415
; CHECK-NEXT: lharx 10, 0, 9
4422-
; CHECK-NEXT: clrlwi 0, 10, 16
4423-
; CHECK-NEXT: cmplw 0, 11
4416+
; CHECK-NEXT: cmplw 10, 11
44244417
; CHECK-NEXT: bne 0, .LBB3_16
44254418
; CHECK-NEXT: # %bb.13: # %cmpxchg.fencedstore219
44264419
; CHECK-NEXT: extsb 12, 12
@@ -4434,8 +4427,7 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
44344427
; CHECK-NEXT: # %bb.15: # %cmpxchg.releasedload217
44354428
; CHECK-NEXT: #
44364429
; CHECK-NEXT: lharx 10, 0, 9
4437-
; CHECK-NEXT: clrlwi 0, 10, 16
4438-
; CHECK-NEXT: cmplw 0, 11
4430+
; CHECK-NEXT: cmplw 10, 11
44394431
; CHECK-NEXT: beq 0, .LBB3_14
44404432
; CHECK-NEXT: .LBB3_16: # %cmpxchg.nostore215
44414433
; CHECK-NEXT: lwsync
@@ -4535,7 +4527,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
45354527
; CHECK-NEXT: lbz 30, uc@toc@l(3)
45364528
; CHECK-NEXT: lbz 29, sc@toc@l(4)
45374529
; CHECK-NEXT: lbarx 28, 0, 6
4538-
; CHECK-NEXT: clrlwi 28, 28, 24
45394530
; CHECK-NEXT: cmplw 28, 30
45404531
; CHECK-NEXT: bne 0, .LBB3_36
45414532
; CHECK-NEXT: # %bb.33: # %cmpxchg.fencedstore124
@@ -4548,7 +4539,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
45484539
; CHECK-NEXT: # %bb.35: # %cmpxchg.releasedload122
45494540
; CHECK-NEXT: #
45504541
; CHECK-NEXT: lbarx 28, 0, 6
4551-
; CHECK-NEXT: clrlwi 28, 28, 24
45524542
; CHECK-NEXT: cmplw 28, 30
45534543
; CHECK-NEXT: beq 0, .LBB3_34
45544544
; CHECK-NEXT: .LBB3_36: # %cmpxchg.nostore120
@@ -4566,7 +4556,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
45664556
; CHECK-NEXT: stw 6, ui@toc@l(5)
45674557
; CHECK-NEXT: lbz 6, uc@toc@l(3)
45684558
; CHECK-NEXT: lbarx 29, 0, 7
4569-
; CHECK-NEXT: clrlwi 29, 29, 24
45704559
; CHECK-NEXT: cmplw 29, 6
45714560
; CHECK-NEXT: bne 0, .LBB3_42
45724561
; CHECK-NEXT: # %bb.39: # %cmpxchg.fencedstore105
@@ -4579,7 +4568,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
45794568
; CHECK-NEXT: # %bb.41: # %cmpxchg.releasedload103
45804569
; CHECK-NEXT: #
45814570
; CHECK-NEXT: lbarx 29, 0, 7
4582-
; CHECK-NEXT: clrlwi 29, 29, 24
45834571
; CHECK-NEXT: cmplw 29, 6
45844572
; CHECK-NEXT: beq 0, .LBB3_40
45854573
; CHECK-NEXT: .LBB3_42: # %cmpxchg.nostore101
@@ -4597,7 +4585,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
45974585
; CHECK-NEXT: stw 6, ui@toc@l(5)
45984586
; CHECK-NEXT: lbz 6, uc@toc@l(3)
45994587
; CHECK-NEXT: lharx 30, 0, 8
4600-
; CHECK-NEXT: clrlwi 30, 30, 16
46014588
; CHECK-NEXT: cmplw 30, 6
46024589
; CHECK-NEXT: bne 0, .LBB3_48
46034590
; CHECK-NEXT: # %bb.45: # %cmpxchg.fencedstore86
@@ -4612,7 +4599,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
46124599
; CHECK-NEXT: # %bb.47: # %cmpxchg.releasedload84
46134600
; CHECK-NEXT: #
46144601
; CHECK-NEXT: lharx 30, 0, 8
4615-
; CHECK-NEXT: clrlwi 30, 30, 16
46164602
; CHECK-NEXT: cmplw 30, 6
46174603
; CHECK-NEXT: beq 0, .LBB3_46
46184604
; CHECK-NEXT: .LBB3_48: # %cmpxchg.nostore82
@@ -4630,7 +4616,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
46304616
; CHECK-NEXT: stw 6, ui@toc@l(5)
46314617
; CHECK-NEXT: lbz 6, uc@toc@l(3)
46324618
; CHECK-NEXT: lharx 8, 0, 9
4633-
; CHECK-NEXT: clrlwi 8, 8, 16
46344619
; CHECK-NEXT: cmplw 8, 6
46354620
; CHECK-NEXT: bne 0, .LBB3_54
46364621
; CHECK-NEXT: # %bb.51: # %cmpxchg.fencedstore67
@@ -4645,7 +4630,6 @@ define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
46454630
; CHECK-NEXT: # %bb.53: # %cmpxchg.releasedload65
46464631
; CHECK-NEXT: #
46474632
; CHECK-NEXT: lharx 8, 0, 9
4648-
; CHECK-NEXT: clrlwi 8, 8, 16
46494633
; CHECK-NEXT: cmplw 8, 6
46504634
; CHECK-NEXT: beq 0, .LBB3_52
46514635
; CHECK-NEXT: .LBB3_54: # %cmpxchg.nostore63

0 commit comments

Comments
 (0)