xref: /llvm-project/llvm/test/CodeGen/X86/loop-rotate.ll (revision f9f81289e6864ca3f09df16bad0ffc3ca58c3162)
1; RUN: llc -mtriple=i686-linux < %s | FileCheck %s
2
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.
5define 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
13entry:
14  br label %header
15
16header:
17  %val1 = call i1 @foo()
18  br i1 %val1, label %middle, label %end
19
20middle:
21  %val2 = call i1 @foo()
22  br i1 %val2, label %latch1, label %end
23
24latch1:
25  %val3 = call i1 @foo()
26  br i1 %val3, label %latch2, label %header
27
28latch2:
29  %val4 = call i1 @foo()
30  br label %header
31
32end:
33  ret void
34}
35
36define 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
45entry:
46  %val0 = call i1 @foo()
47  br i1 %val0, label %then, label %else
48
49then:
50  call void @a()
51  br label %header
52
53else:
54  call void @b()
55  br label %header
56
57header:
58  %val1 = call i1 @foo()
59  br i1 %val1, label %latch1, label %end
60
61latch1:
62  %val3 = call i1 @foo()
63  br i1 %val3, label %latch2, label %header
64
65latch2:
66  %val4 = call i1 @foo()
67  br label %header
68
69end:
70  ret void
71}
72
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.
75define 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
84entry:
85  %val0 = call i1 @foo()
86  br i1 %val0, label %then, label %header, !prof !1
87
88then:
89  call void @a()
90  br label %end
91
92header:
93  %val1 = call i1 @foo()
94  br i1 %val1, label %middle, label %exit
95
96middle:
97  %val2 = call i1 @foo()
98  br i1 %val2, label %latch1, label %exit
99
100latch1:
101  %val3 = call i1 @foo()
102  br i1 %val3, label %latch2, label %header
103
104latch2:
105  %val4 = call i1 @foo()
106  br label %header
107
108exit:
109  call void @b()
110  br label %end
111
112end:
113  ret void
114}
115
116declare i1 @foo()
117declare void @a()
118declare void @b()
119
120!1 = !{!"branch_weights", i32 10, i32 1}
121