Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / icall-branch-funnel.ll
blob6d7e0c3d2c491b85ff2f007f2601ee79dab1cd5d
1 ; FIXME: Fix machine verifier issues and remove -verify-machineinstrs=0. PR39436.
2 ; RUN: llc -mtriple=x86_64-unknown-linux -verify-machineinstrs=0 < %s | FileCheck %s
4 @g = external global i8
6 declare void @f0()
7 declare void @f1()
8 declare void @f2()
9 declare void @f3()
10 declare void @f4()
11 declare void @f5()
12 declare void @f6()
13 declare void @f7()
14 declare void @f8()
15 declare void @f9()
17 declare void @llvm.icall.branch.funnel(...)
19 define void @jt2(i8* nest, ...) {
20   ; CHECK: jt2:
21   ; CHECK:      leaq g+1(%rip), %r11
22   ; CHECK-NEXT: cmpq %r11, %r10
23   ; CHECK-NEXT: jae .LBB0_1
24   ; CHECK-NEXT: #
25   ; CHECK-NEXT: jmp f0
26   ; CHECK-NEXT: .LBB0_1:
27   ; CHECK-NEXT: jmp f1
28   musttail call void (...) @llvm.icall.branch.funnel(
29       i8* %0,
30       i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0,
31       i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1,
32       ...
33   )
34   ret void
37 define void @jt3(i8* nest, ...) {
38   ; CHECK: jt3:
39   ; CHECK:      leaq g+1(%rip), %r11
40   ; CHECK-NEXT: cmpq %r11, %r10
41   ; CHECK-NEXT: jae .LBB1_1
42   ; CHECK-NEXT: #
43   ; CHECK-NEXT: jmp f0
44   ; CHECK-NEXT: .LBB1_1:
45   ; CHECK-NEXT: jne .LBB1_2
46   ; CHECK-NEXT: #
47   ; CHECK-NEXT: jmp f1
48   ; CHECK-NEXT: .LBB1_2:
49   ; CHECK-NEXT: jmp f2
50   musttail call void (...) @llvm.icall.branch.funnel(
51       i8* %0,
52       i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0,
53       i8* getelementptr (i8, i8* @g, i64 2), void ()* @f2,
54       i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1,
55       ...
56   )
57   ret void
60 define void @jt7(i8* nest, ...) {
61   ; CHECK: jt7:
62   ; CHECK:      leaq g+3(%rip), %r11
63   ; CHECK-NEXT: cmpq %r11, %r10
64   ; CHECK-NEXT: jae .LBB2_1
65   ; CHECK-NEXT: #
66   ; CHECK-NEXT: leaq g+1(%rip), %r11
67   ; CHECK-NEXT: cmpq %r11, %r10
68   ; CHECK-NEXT: jae .LBB2_6
69   ; CHECK-NEXT: #
70   ; CHECK-NEXT: jmp f0
71   ; CHECK-NEXT: .LBB2_1:
72   ; CHECK-NEXT: jne .LBB2_2
73   ; CHECK-NEXT: #
74   ; CHECK-NEXT: jmp f3
75   ; CHECK-NEXT: .LBB2_6:
76   ; CHECK-NEXT: jne .LBB2_7
77   ; CHECK-NEXT: #
78   ; CHECK-NEXT: jmp f1
79   ; CHECK-NEXT: .LBB2_2:
80   ; CHECK-NEXT: leaq g+5(%rip), %r11
81   ; CHECK-NEXT: cmpq %r11, %r10
82   ; CHECK-NEXT: jae .LBB2_3
83   ; CHECK-NEXT: #
84   ; CHECK-NEXT: jmp f4
85   ; CHECK-NEXT: .LBB2_7:
86   ; CHECK-NEXT: jmp f2
87   ; CHECK-NEXT: .LBB2_3:
88   ; CHECK-NEXT: jne .LBB2_4
89   ; CHECK-NEXT: #
90   ; CHECK-NEXT: jmp f5
91   ; CHECK-NEXT: .LBB2_4:
92   ; CHECK-NEXT: jmp f6
93   musttail call void (...) @llvm.icall.branch.funnel(
94       i8* %0,
95       i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0,
96       i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1,
97       i8* getelementptr (i8, i8* @g, i64 2), void ()* @f2,
98       i8* getelementptr (i8, i8* @g, i64 3), void ()* @f3,
99       i8* getelementptr (i8, i8* @g, i64 4), void ()* @f4,
100       i8* getelementptr (i8, i8* @g, i64 5), void ()* @f5,
101       i8* getelementptr (i8, i8* @g, i64 6), void ()* @f6,
102       ...
103   )
104   ret void
107 define void @jt10(i8* nest, ...) {
108   ; CHECK: jt10:
109   ; CHECK:      leaq g+5(%rip), %r11
110   ; CHECK-NEXT: cmpq %r11, %r10
111   ; CHECK-NEXT: jae .LBB3_1
112   ; CHECK-NEXT: #
113   ; CHECK-NEXT: leaq g+1(%rip), %r11
114   ; CHECK-NEXT: cmpq %r11, %r10
115   ; CHECK-NEXT: jae .LBB3_7
116   ; CHECK-NEXT: #
117   ; CHECK-NEXT: jmp f0
118   ; CHECK-NEXT: .LBB3_1:
119   ; CHECK-NEXT: jne .LBB3_2
120   ; CHECK-NEXT: #
121   ; CHECK-NEXT: jmp f5
122   ; CHECK-NEXT: .LBB3_7:
123   ; CHECK-NEXT: jne .LBB3_8
124   ; CHECK-NEXT: #
125   ; CHECK-NEXT: jmp f1
126   ; CHECK-NEXT: .LBB3_2:
127   ; CHECK-NEXT: leaq g+7(%rip), %r11
128   ; CHECK-NEXT: cmpq %r11, %r10
129   ; CHECK-NEXT: jae .LBB3_3
130   ; CHECK-NEXT: #
131   ; CHECK-NEXT: jmp f6
132   ; CHECK-NEXT: .LBB3_8:
133   ; CHECK-NEXT: leaq g+3(%rip), %r11
134   ; CHECK-NEXT: cmpq %r11, %r10
135   ; CHECK-NEXT: jae .LBB3_9
136   ; CHECK-NEXT: #
137   ; CHECK-NEXT: jmp f2
138   ; CHECK-NEXT: .LBB3_3:
139   ; CHECK-NEXT: jne .LBB3_4
140   ; CHECK-NEXT: #
141   ; CHECK-NEXT: jmp f7
142   ; CHECK-NEXT: .LBB3_9:
143   ; CHECK-NEXT: jne .LBB3_10
144   ; CHECK-NEXT: #
145   ; CHECK-NEXT: jmp f3
146   ; CHECK-NEXT: .LBB3_4:
147   ; CHECK-NEXT: leaq g+9(%rip), %r11
148   ; CHECK-NEXT: cmpq %r11, %r10
149   ; CHECK-NEXT: jae .LBB3_5
150   ; CHECK-NEXT: #
151   ; CHECK-NEXT: jmp f8
152   ; CHECK-NEXT: .LBB3_10:
153   ; CHECK-NEXT: jmp f4
154   ; CHECK-NEXT: .LBB3_5:
155   ; CHECK-NEXT: jmp f9
156   musttail call void (...) @llvm.icall.branch.funnel(
157       i8* %0,
158       i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0,
159       i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1,
160       i8* getelementptr (i8, i8* @g, i64 2), void ()* @f2,
161       i8* getelementptr (i8, i8* @g, i64 3), void ()* @f3,
162       i8* getelementptr (i8, i8* @g, i64 4), void ()* @f4,
163       i8* getelementptr (i8, i8* @g, i64 5), void ()* @f5,
164       i8* getelementptr (i8, i8* @g, i64 6), void ()* @f6,
165       i8* getelementptr (i8, i8* @g, i64 7), void ()* @f7,
166       i8* getelementptr (i8, i8* @g, i64 8), void ()* @f8,
167       i8* getelementptr (i8, i8* @g, i64 9), void ()* @f9,
168       ...
169   )
170   ret void