1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -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: @caller(
9; CHECK-NEXT:  Top:
10; CHECK-NEXT:    callbr void asm sideeffect "", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@caller, [[TOP_SPLIT:%.*]]))
11; CHECK-NEXT:    to label [[NEXTCOND:%.*]] [label %Top.split]
12; CHECK-LABEL: Top.split:
13; CHECK-NEXT:    call void @callee(i1 false)
14; CHECK-NEXT:    br label [[CALLSITEBB:%.*]]
15; CHECK-LABEL: NextCond:
16; CHECK-NEXT:    br label [[NEXTCOND_SPLIT:%.*]]
17; CHECK-LABEL: NextCond.split:
18; CHECK-NEXT:    call void @callee(i1 true)
19; CHECK-NEXT:    br label [[CALLSITEBB]]
20; CHECK-LABEL: CallSiteBB:
21; CHECK-NEXT:    [[PHI:%.*]] = phi i1 [ false, [[TOP_SPLIT]] ], [ true, [[NEXTCOND_SPLIT]] ]
22; CHECK-NEXT:    callbr void asm sideeffect "", "r,X,~{dirflag},~{fpsr},~{flags}"(i1 [[PHI]], i8* blockaddress(@caller, [[END2:%.*]]))
23; CHECK-NEXT:    to label [[END:%.*]] [label %End2]
24; CHECK-LABEL: End:
25; CHECK-NEXT:    ret void
26; CHECK-LABEL: End2:
27; CHECK-NEXT:    ret void
28;
29Top:
30  callbr void asm sideeffect "", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@caller, %CallSiteBB))
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,X,~{dirflag},~{fpsr},~{flags}"(i1 %phi, i8* blockaddress(@caller, %End2))
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: @callee(
50; CHECK-NEXT:    ret void
51;
52  ret void
53}
54