Skip to content

Commit 0ae5680

Browse files
isanbardmemfrob
authored andcommitted
Specify branch probabilities for callbr dests
Summary: callbr's indirect branches aren't expected to be taken, so reduce their probabilities to 0 while increasing the default destination to 1. This allows some code improvements through block placement. Reviewers: nickdesaulniers Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D72656
1 parent 4314944 commit 0ae5680

File tree

5 files changed

+29
-31
lines changed

5 files changed

+29
-31
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,10 +2867,10 @@ void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
28672867
Return->setInlineAsmBrDefaultTarget();
28682868

28692869
// Update successor info.
2870-
addSuccessorWithProb(CallBrMBB, Return);
2870+
addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
28712871
for (unsigned i = 0, e = I.getNumIndirectDests(); i < e; ++i) {
28722872
MachineBasicBlock *Target = FuncInfo.MBBMap[I.getIndirectDest(i)];
2873-
addSuccessorWithProb(CallBrMBB, Target);
2873+
addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
28742874
CallBrMBB->addInlineAsmBrIndirectTarget(Target);
28752875
}
28762876
CallBrMBB->normalizeSuccProbs();

llvm/test/CodeGen/AArch64/callbr-asm-label.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ define i32 @test1() {
66
; CHECK-LABEL: test1:
77
; CHECK: .word b
88
; CHECK-NEXT: .word .Ltmp0
9+
; CHECK-LABEL: .LBB0_1: // %cleanup
910
; CHECK-LABEL: .Ltmp0:
10-
; CHECK-LABEL: .LBB0_1: // %l_yes
11-
; CHECK-LABEL: .LBB0_2: // %cleanup
11+
; CHECK-LABEL: .LBB0_2: // %indirect
1212
entry:
13-
callbr void asm sideeffect "1:\0A\09.word b, ${0:l}\0A\09", "X"(i8* blockaddress(@test1, %l_yes))
14-
to label %cleanup [label %l_yes]
13+
callbr void asm sideeffect "1:\0A\09.word b, ${0:l}\0A\09", "X"(i8* blockaddress(@test1, %indirect))
14+
to label %cleanup [label %indirect]
1515

16-
l_yes:
16+
indirect:
1717
br label %cleanup
1818

1919
cleanup:
20-
%retval.0 = phi i32 [ 1, %l_yes ], [ 0, %entry ]
20+
%retval.0 = phi i32 [ 1, %indirect ], [ 0, %entry ]
2121
ret i32 %retval.0
2222
}
2323

llvm/test/CodeGen/AArch64/callbr-asm-obj-file.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ declare dso_local i32 @g(...) local_unnamed_addr
4141
declare dso_local i32 @i(...) local_unnamed_addr
4242

4343
; CHECK-LABEL: <test2>:
44-
; CHECK: bl #0 <test2+0x10>
44+
; CHECK: bl #0 <test2+0x18>
4545
; CHECK-LABEL: <$d.5>:
4646
; CHECK-LABEL: <$x.6>:
47-
; CHECK-NEXT: b #16 <$x.8+0x4>
47+
; CHECK-NEXT: b #-20 <test2+0x18>
4848
define hidden i32 @test2() local_unnamed_addr {
4949
%1 = load i32, i32* @l, align 4
5050
%2 = icmp eq i32 %1, 0

llvm/test/CodeGen/X86/callbr-asm-branch-folding.ll

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,8 @@ define void @n(i32* %o, i32 %p, i32 %u) nounwind {
2424
; CHECK-NEXT: movq %r15, %rdi
2525
; CHECK-NEXT: callq l
2626
; CHECK-NEXT: testl %eax, %eax
27-
; CHECK-NEXT: je .LBB0_1
28-
; CHECK-NEXT: .LBB0_10: # %cleanup
29-
; CHECK-NEXT: addq $8, %rsp
30-
; CHECK-NEXT: popq %rbx
31-
; CHECK-NEXT: popq %r12
32-
; CHECK-NEXT: popq %r13
33-
; CHECK-NEXT: popq %r14
34-
; CHECK-NEXT: popq %r15
35-
; CHECK-NEXT: popq %rbp
36-
; CHECK-NEXT: retq
37-
; CHECK-NEXT: .LBB0_1: # %if.end
27+
; CHECK-NEXT: jne .LBB0_10
28+
; CHECK-NEXT: # %bb.1: # %if.end
3829
; CHECK-NEXT: movl %ebx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
3930
; CHECK-NEXT: cmpl $0, {{.*}}(%rip)
4031
; CHECK-NEXT: # implicit-def: $ebx
@@ -82,7 +73,15 @@ define void @n(i32* %o, i32 %p, i32 %u) nounwind {
8273
; CHECK-NEXT: jmp k # TAILCALL
8374
; CHECK-NEXT: .LBB0_9: # %if.else
8475
; CHECK-NEXT: incq 0
85-
; CHECK-NEXT: jmp .LBB0_10
76+
; CHECK-NEXT: .LBB0_10: # %cleanup
77+
; CHECK-NEXT: addq $8, %rsp
78+
; CHECK-NEXT: popq %rbx
79+
; CHECK-NEXT: popq %r12
80+
; CHECK-NEXT: popq %r13
81+
; CHECK-NEXT: popq %r14
82+
; CHECK-NEXT: popq %r15
83+
; CHECK-NEXT: popq %rbp
84+
; CHECK-NEXT: retq
8685
entry:
8786
%call = tail call i32 @c()
8887
%call1 = tail call i32 @l(i32* %o)

llvm/test/CodeGen/X86/callbr-asm.ll

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ fail:
5656
; Test 3 - asm-goto implements a loop. The loop gets recognized, but many loop
5757
; transforms fail due to canonicalization having callbr exceptions. Trivial
5858
; blocks at labels 1 and 3 also don't get simplified due to callbr.
59-
define dso_local i32 @test3(i32 %a) {
59+
define i32 @test3(i32 %a) {
6060
; CHECK-LABEL: test3:
6161
; CHECK: # %bb.0: # %entry
6262
; CHECK-NEXT: .Ltmp1: # Block address taken
@@ -78,7 +78,6 @@ define dso_local i32 @test3(i32 %a) {
7878
; CHECK-NEXT: # Parent Loop BB2_2 Depth=2
7979
; CHECK-NEXT: # => This Loop Header: Depth=3
8080
; CHECK-NEXT: # Child Loop BB2_4 Depth 4
81-
; CHECK-NEXT: .p2align 4, 0x90
8281
; CHECK-NEXT: .Ltmp4: # Block address taken
8382
; CHECK-NEXT: .LBB2_4: # %label04
8483
; CHECK-NEXT: # Parent Loop BB2_1 Depth=1
@@ -134,17 +133,17 @@ normal1: ; preds = %normal0
134133
; Test 4 - asm-goto referenced with the 'l' (ell) modifier and not.
135134
define void @test4() {
136135
; CHECK-LABEL: test4:
137-
; CHECK: # %bb.0:
136+
; CHECK: # %bb.0: # %entry
138137
; CHECK-NEXT: #APP
139-
; CHECK-NOT: ja .Ltmp50
140-
; CHECK-NEXT: ja .Ltmp5
138+
; CHECK-NEXT: ja .Ltmp5{{$}}
141139
; CHECK-NEXT: #NO_APP
142-
; CHECK-NEXT: .LBB3_1:
140+
; CHECK-NEXT: .LBB3_1: # %asm.fallthrough
143141
; CHECK-NEXT: #APP
144-
; CHECK-NOT: ja .Ltmp50
145-
; CHECK-NEXT: ja .Ltmp5
142+
; CHECK-NEXT: ja .Ltmp5{{$}}
146143
; CHECK-NEXT: #NO_APP
147-
; CHECK-NEXT: jmp .LBB3_3
144+
; CHECK-NEXT: .Ltmp5: # Block address taken
145+
; CHECK-NEXT: .LBB3_3: # %quux
146+
; CHECK-NEXT: retl
148147
entry:
149148
callbr void asm sideeffect "ja $0", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@test4, %quux))
150149
to label %asm.fallthrough [label %quux]

0 commit comments

Comments
 (0)