Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / X86 / loop-rotate.ll
blob3f0a390e7c1bb439e4ef81f77dbc95bbe11eac40
1 ; RUN: llc -mtriple=i686-linux < %s | FileCheck %s
3 ; Don't rotate the loop if the number of fall through to exit is not larger
4 ; than the number of fall through to header.
5 define void @no_rotate() {
6 ; CHECK-LABEL: no_rotate
7 ; CHECK: %entry
8 ; CHECK: %header
9 ; CHECK: %middle
10 ; CHECK: %latch1
11 ; CHECK: %latch2
12 ; CHECK: %end
13 entry:
14   br label %header
16 header:
17   %val1 = call i1 @foo()
18   br i1 %val1, label %middle, label %end
20 middle:
21   %val2 = call i1 @foo()
22   br i1 %val2, label %latch1, label %end
24 latch1:
25   %val3 = call i1 @foo()
26   br i1 %val3, label %latch2, label %header
28 latch2:
29   %val4 = call i1 @foo()
30   br label %header
32 end:
33   ret void
36 define void @do_rotate() {
37 ; CHECK-LABEL: do_rotate
38 ; CHECK: %entry
39 ; CHECK: %then
40 ; CHECK: %else
41 ; CHECK: %latch1
42 ; CHECK: %latch2
43 ; CHECK: %header
44 ; CHECK: %end
45 entry:
46   %val0 = call i1 @foo()
47   br i1 %val0, label %then, label %else
49 then:
50   call void @a()
51   br label %header
53 else:
54   call void @b()
55   br label %header
57 header:
58   %val1 = call i1 @foo()
59   br i1 %val1, label %latch1, label %end
61 latch1:
62   %val3 = call i1 @foo()
63   br i1 %val3, label %latch2, label %header
65 latch2:
66   %val4 = call i1 @foo()
67   br label %header
69 end:
70   ret void
73 ; The loop structure is same as in @no_rotate, but the loop header's predecessor
74 ; doesn't fall through to it, so it should be rotated to get exit fall through.
75 define void @do_rotate2() {
76 ; CHECK-LABEL: do_rotate2
77 ; CHECK: %entry
78 ; CHECK: %then
79 ; CHECK: %middle
80 ; CHECK: %latch1
81 ; CHECK: %latch2
82 ; CHECK: %header
83 ; CHECK: %exit
84 entry:
85   %val0 = call i1 @foo()
86   br i1 %val0, label %then, label %header, !prof !1
88 then:
89   call void @a()
90   br label %end
92 header:
93   %val1 = call i1 @foo()
94   br i1 %val1, label %middle, label %exit
96 middle:
97   %val2 = call i1 @foo()
98   br i1 %val2, label %latch1, label %exit
100 latch1:
101   %val3 = call i1 @foo()
102   br i1 %val3, label %latch2, label %header
104 latch2:
105   %val4 = call i1 @foo()
106   br label %header
108 exit:
109   call void @b()
110   br label %end
112 end:
113   ret void
116 declare i1 @foo()
117 declare void @a()
118 declare void @b()
120 !1 = !{!"branch_weights", i32 10, i32 1}