1; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -filetype=obj -o - \
2; RUN:  | llvm-objdump --triple=aarch64-unknown-linux-gnu -d - \
3; RUN:  | FileCheck %s
4
5%struct.c = type { i1 (...)* }
6
7@l = common hidden local_unnamed_addr global i32 0, align 4
8
9; CHECK-LABEL: <test1>:
10; CHECK-LABEL: <$d.1>:
11; CHECK-LABEL: <$x.2>:
12; CHECK-NEXT:    b 0x2c <$x.4>
13; CHECK-LABEL: <$x.4>:
14; CHECK-NEXT:    mov w0, wzr
15; CHECK-NEXT:    ldr x30, [sp], #16
16; CHECK-NEXT:    ret
17define hidden i32 @test1() {
18  %1 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
19  %2 = icmp eq i32 %1, 0
20  br i1 %2, label %3, label %5
21
223:                                                ; preds = %0
23  callbr void asm sideeffect "1: nop\0A\09.quad a\0A\09b ${1:l}\0A\09.quad ${0:c}", "i,X"(i32* null, i8* blockaddress(@test1, %7))
24          to label %4 [label %7]
25
264:                                                ; preds = %3
27  br label %7
28
295:                                                ; preds = %0
30  %6 = tail call i32 bitcast (i32 (...)* @i to i32 ()*)()
31  br label %7
32
337:                                                ; preds = %3, %4, %5
34  %8 = phi i32 [ %6, %5 ], [ 0, %4 ], [ 0, %3 ]
35  ret i32 %8
36}
37
38declare dso_local i32 @g(...) local_unnamed_addr
39
40declare dso_local i32 @i(...) local_unnamed_addr
41
42; CHECK-LABEL: <test2>:
43; CHECK:         bl {{.*}} <test2+0x18>
44; CHECK-LABEL: <$d.5>:
45; CHECK-LABEL: <$x.6>:
46; CHECK-NEXT:    b {{.*}} <test2+0x18>
47define hidden i32 @test2() local_unnamed_addr {
48  %1 = load i32, i32* @l, align 4
49  %2 = icmp eq i32 %1, 0
50  br i1 %2, label %10, label %3
51
523:                                                ; preds = %0
53  %4 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
54  %5 = icmp eq i32 %4, 0
55  br i1 %5, label %6, label %7
56
576:                                                ; preds = %3
58  callbr void asm sideeffect "1: nop\0A\09.quad b\0A\09b ${1:l}\0A\09.quad ${0:c}", "i,X"(i32* null, i8* blockaddress(@test2, %7))
59          to label %10 [label %7]
60
617:                                                ; preds = %3
62  %8 = tail call i32 bitcast (i32 (...)* @i to i32 ()*)()
63  br label %10
64
659:                                                ; preds = %6
66  br label %10
67
6810:                                               ; preds = %7, %0, %6, %9
69  ret i32 undef
70}
71
72; CHECK-LABEL: <test3>:
73; CHECK-LABEL: <$d.9>:
74; CHECK-LABEL: <$x.10>:
75; CHECK-NEXT:    b {{.*}} <test3+0x18>
76; CHECK-LABEL: <$x.12>:
77; CHECK-NEXT:    mov w0, wzr
78; CHECK-NEXT:    ldr x30, [sp], #16
79; CHECK-NEXT:    ret
80define internal i1 @test3() {
81  %1 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
82  %2 = icmp eq i32 %1, 0
83  br i1 %2, label %3, label %5
84
853:                                                ; preds = %0
86  callbr void asm sideeffect "1: nop\0A\09.quad c\0A\09b ${1:l}\0A\09.quad ${0:c}", "i,X"(i32* null, i8* blockaddress(@test3, %8))
87          to label %4 [label %8]
88
894:                                                ; preds = %3
90  br label %8
91
925:                                                ; preds = %0
93  %6 = tail call i32 bitcast (i32 (...)* @i to i32 ()*)()
94  %7 = icmp ne i32 %6, 0
95  br label %8
96
978:                                                ; preds = %3, %4, %5
98  %9 = phi i1 [ %7, %5 ], [ false, %4 ], [ false, %3 ]
99  ret i1 %9
100}
101