xref: /llvm-project/llvm/test/Transforms/CallSiteSplitting/callsite-split-callbr.ll (revision 54c4609f18ab3f6999450aa098d5d5fb3e4438e5)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2; RUN: opt -passes=callsite-splitting -S -o - < %s | FileCheck %s
3
4; Check that we can split the critical edge between Top and CallSiteBB, and
5; rewrite the first callbr's indirect destination correctly.
6
7define void @caller() {
8; CHECK-LABEL: define {{[^@]+}}@caller() {
9; CHECK-NEXT:  Top:
10; CHECK-NEXT:    callbr void asm sideeffect "", "!i,~{dirflag},~{fpsr},~{flags}"()
11; CHECK-NEXT:    to label [[NEXTCOND:%.*]] [label %Top.split]
12; CHECK:       Top.split:
13; CHECK-NEXT:    call void @callee(i1 false)
14; CHECK-NEXT:    br label [[CALLSITEBB:%.*]]
15; CHECK:       NextCond:
16; CHECK-NEXT:    br label [[NEXTCOND_SPLIT:%.*]]
17; CHECK:       NextCond.split:
18; CHECK-NEXT:    call void @callee(i1 true)
19; CHECK-NEXT:    br label [[CALLSITEBB]]
20; CHECK:       CallSiteBB:
21; CHECK-NEXT:    [[PHI:%.*]] = phi i1 [ false, [[TOP_SPLIT:%.*]] ], [ true, [[NEXTCOND_SPLIT]] ]
22; CHECK-NEXT:    callbr void asm sideeffect "", "r,!i,~{dirflag},~{fpsr},~{flags}"(i1 [[PHI]])
23; CHECK-NEXT:    to label [[END:%.*]] [label %End2]
24; CHECK:       End:
25; CHECK-NEXT:    ret void
26; CHECK:       End2:
27; CHECK-NEXT:    ret void
28;
29Top:
30  callbr void asm sideeffect "", "!i,~{dirflag},~{fpsr},~{flags}"()
31  to label %NextCond [label %CallSiteBB]
32
33NextCond:
34  br label %CallSiteBB
35
36CallSiteBB:
37  %phi = phi i1 [0, %Top],[1, %NextCond]
38  call void @callee(i1 %phi)
39  callbr void asm sideeffect "", "r,!i,~{dirflag},~{fpsr},~{flags}"(i1 %phi)
40  to label %End [label %End2]
41
42End:
43  ret void
44End2:
45  ret void
46}
47
48define void @callee(i1 %b) {
49; CHECK-LABEL: define {{[^@]+}}@callee
50; CHECK-SAME: (i1 [[B:%.*]]) {
51; CHECK-NEXT:    ret void
52;
53  ret void
54}
55