[Alignment][NFC] Use Align with TargetLowering::setMinFunctionAlignment
[llvm-core.git] / test / CodeGen / X86 / code_placement_cold_loop_blocks.ll
blob01161ab95185cd35185c6ff8f73e1c0b59070c7c
1 ; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux < %s | FileCheck %s
3 define void @foo() !prof !1 {
4 ; Test if a cold block in a loop will be placed at the end of the function
5 ; chain.
7 ; CHECK-LABEL: foo:
8 ; CHECK: callq b
9 ; CHECK: callq c
10 ; CHECK: callq e
11 ; CHECK: callq f
12 ; CHECK: callq d
14 entry:
15   br label %header
17 header:
18   call void @b()
19   %call = call zeroext i1 @a()
20   br i1 %call, label %if.then, label %if.else, !prof !4
22 if.then:
23   call void @c()
24   br label %if.end
26 if.else:
27   call void @d()
28   br label %if.end
30 if.end:
31   call void @e()
32   %call2 = call zeroext i1 @a()
33   br i1 %call2, label %header, label %end, !prof !5
35 end:
36   call void @f()
37   ret void
40 define void @nested_loop_0(i1 %flag) !prof !1 {
41 ; Test if a block that is cold in the inner loop but not cold in the outer loop
42 ; will merged to the outer loop chain.
44 ; CHECK-LABEL: nested_loop_0:
45 ; CHECK: callq c
46 ; CHECK: callq d
47 ; CHECK: callq b
48 ; CHECK: callq e
49 ; CHECK: callq f
51 entry:
52   br label %header
54 header:
55   call void @b()
56   %call4 = call zeroext i1 @a()
57   br i1 %call4, label %header2, label %end
59 header2:
60   call void @c()
61   %call = call zeroext i1 @a()
62   br i1 %call, label %if.then, label %if.else, !prof !2
64 if.then:
65   call void @d()
66   %call3 = call zeroext i1 @a()
67   br i1 %call3, label %header2, label %header, !prof !3
69 if.else:
70   call void @e()
71   br i1 %flag, label %header2, label %header, !prof !3
73 end:
74   call void @f()
75   ret void
78 define void @nested_loop_1() !prof !1 {
79 ; Test if a cold block in an inner loop will be placed at the end of the
80 ; function chain.
82 ; CHECK-LABEL: nested_loop_1:
83 ; CHECK: callq b
84 ; CHECK: callq c
85 ; CHECK: callq e
86 ; CHECK: callq d
88 entry:
89   br label %header
91 header:
92   call void @b()
93   br label %header2
95 header2:
96   call void @c()
97   %call = call zeroext i1 @a()
98   br i1 %call, label %end, label %if.else, !prof !4
100 if.else:
101   call void @d()
102   %call2 = call zeroext i1 @a()
103   br i1 %call2, label %header2, label %header, !prof !5
105 end:
106   call void @e()
107   ret void
110 declare zeroext i1 @a()
111 declare void @b()
112 declare void @c()
113 declare void @d()
114 declare void @e()
115 declare void @f()
117 !1 = !{!"function_entry_count", i64 1}
118 !2 = !{!"branch_weights", i32 100, i32 1}
119 !3 = !{!"branch_weights", i32 1, i32 10}
120 !4 = !{!"branch_weights", i32 1000, i32 1}
121 !5 = !{!"branch_weights", i32 100, i32 1}