xref: /llvm-project/llvm/test/CodeGen/X86/loop-rotate.ll (revision f9f81289e6864ca3f09df16bad0ffc3ca58c3162)
1*f9f81289SJordan Rupprecht; RUN: llc -mtriple=i686-linux < %s | FileCheck %s
2*f9f81289SJordan Rupprecht
3*f9f81289SJordan Rupprecht; Don't rotate the loop if the number of fall through to exit is not larger
4*f9f81289SJordan Rupprecht; than the number of fall through to header.
5*f9f81289SJordan Rupprechtdefine void @no_rotate() {
6*f9f81289SJordan Rupprecht; CHECK-LABEL: no_rotate
7*f9f81289SJordan Rupprecht; CHECK: %entry
8*f9f81289SJordan Rupprecht; CHECK: %header
9*f9f81289SJordan Rupprecht; CHECK: %middle
10*f9f81289SJordan Rupprecht; CHECK: %latch1
11*f9f81289SJordan Rupprecht; CHECK: %latch2
12*f9f81289SJordan Rupprecht; CHECK: %end
13*f9f81289SJordan Rupprechtentry:
14*f9f81289SJordan Rupprecht  br label %header
15*f9f81289SJordan Rupprecht
16*f9f81289SJordan Rupprechtheader:
17*f9f81289SJordan Rupprecht  %val1 = call i1 @foo()
18*f9f81289SJordan Rupprecht  br i1 %val1, label %middle, label %end
19*f9f81289SJordan Rupprecht
20*f9f81289SJordan Rupprechtmiddle:
21*f9f81289SJordan Rupprecht  %val2 = call i1 @foo()
22*f9f81289SJordan Rupprecht  br i1 %val2, label %latch1, label %end
23*f9f81289SJordan Rupprecht
24*f9f81289SJordan Rupprechtlatch1:
25*f9f81289SJordan Rupprecht  %val3 = call i1 @foo()
26*f9f81289SJordan Rupprecht  br i1 %val3, label %latch2, label %header
27*f9f81289SJordan Rupprecht
28*f9f81289SJordan Rupprechtlatch2:
29*f9f81289SJordan Rupprecht  %val4 = call i1 @foo()
30*f9f81289SJordan Rupprecht  br label %header
31*f9f81289SJordan Rupprecht
32*f9f81289SJordan Rupprechtend:
33*f9f81289SJordan Rupprecht  ret void
34*f9f81289SJordan Rupprecht}
35*f9f81289SJordan Rupprecht
36*f9f81289SJordan Rupprechtdefine void @do_rotate() {
37*f9f81289SJordan Rupprecht; CHECK-LABEL: do_rotate
38*f9f81289SJordan Rupprecht; CHECK: %entry
39*f9f81289SJordan Rupprecht; CHECK: %then
40*f9f81289SJordan Rupprecht; CHECK: %else
41*f9f81289SJordan Rupprecht; CHECK: %latch1
42*f9f81289SJordan Rupprecht; CHECK: %latch2
43*f9f81289SJordan Rupprecht; CHECK: %header
44*f9f81289SJordan Rupprecht; CHECK: %end
45*f9f81289SJordan Rupprechtentry:
46*f9f81289SJordan Rupprecht  %val0 = call i1 @foo()
47*f9f81289SJordan Rupprecht  br i1 %val0, label %then, label %else
48*f9f81289SJordan Rupprecht
49*f9f81289SJordan Rupprechtthen:
50*f9f81289SJordan Rupprecht  call void @a()
51*f9f81289SJordan Rupprecht  br label %header
52*f9f81289SJordan Rupprecht
53*f9f81289SJordan Rupprechtelse:
54*f9f81289SJordan Rupprecht  call void @b()
55*f9f81289SJordan Rupprecht  br label %header
56*f9f81289SJordan Rupprecht
57*f9f81289SJordan Rupprechtheader:
58*f9f81289SJordan Rupprecht  %val1 = call i1 @foo()
59*f9f81289SJordan Rupprecht  br i1 %val1, label %latch1, label %end
60*f9f81289SJordan Rupprecht
61*f9f81289SJordan Rupprechtlatch1:
62*f9f81289SJordan Rupprecht  %val3 = call i1 @foo()
63*f9f81289SJordan Rupprecht  br i1 %val3, label %latch2, label %header
64*f9f81289SJordan Rupprecht
65*f9f81289SJordan Rupprechtlatch2:
66*f9f81289SJordan Rupprecht  %val4 = call i1 @foo()
67*f9f81289SJordan Rupprecht  br label %header
68*f9f81289SJordan Rupprecht
69*f9f81289SJordan Rupprechtend:
70*f9f81289SJordan Rupprecht  ret void
71*f9f81289SJordan Rupprecht}
72*f9f81289SJordan Rupprecht
73*f9f81289SJordan Rupprecht; The loop structure is same as in @no_rotate, but the loop header's predecessor
74*f9f81289SJordan Rupprecht; doesn't fall through to it, so it should be rotated to get exit fall through.
75*f9f81289SJordan Rupprechtdefine void @do_rotate2() {
76*f9f81289SJordan Rupprecht; CHECK-LABEL: do_rotate2
77*f9f81289SJordan Rupprecht; CHECK: %entry
78*f9f81289SJordan Rupprecht; CHECK: %then
79*f9f81289SJordan Rupprecht; CHECK: %middle
80*f9f81289SJordan Rupprecht; CHECK: %latch1
81*f9f81289SJordan Rupprecht; CHECK: %latch2
82*f9f81289SJordan Rupprecht; CHECK: %header
83*f9f81289SJordan Rupprecht; CHECK: %exit
84*f9f81289SJordan Rupprechtentry:
85*f9f81289SJordan Rupprecht  %val0 = call i1 @foo()
86*f9f81289SJordan Rupprecht  br i1 %val0, label %then, label %header, !prof !1
87*f9f81289SJordan Rupprecht
88*f9f81289SJordan Rupprechtthen:
89*f9f81289SJordan Rupprecht  call void @a()
90*f9f81289SJordan Rupprecht  br label %end
91*f9f81289SJordan Rupprecht
92*f9f81289SJordan Rupprechtheader:
93*f9f81289SJordan Rupprecht  %val1 = call i1 @foo()
94*f9f81289SJordan Rupprecht  br i1 %val1, label %middle, label %exit
95*f9f81289SJordan Rupprecht
96*f9f81289SJordan Rupprechtmiddle:
97*f9f81289SJordan Rupprecht  %val2 = call i1 @foo()
98*f9f81289SJordan Rupprecht  br i1 %val2, label %latch1, label %exit
99*f9f81289SJordan Rupprecht
100*f9f81289SJordan Rupprechtlatch1:
101*f9f81289SJordan Rupprecht  %val3 = call i1 @foo()
102*f9f81289SJordan Rupprecht  br i1 %val3, label %latch2, label %header
103*f9f81289SJordan Rupprecht
104*f9f81289SJordan Rupprechtlatch2:
105*f9f81289SJordan Rupprecht  %val4 = call i1 @foo()
106*f9f81289SJordan Rupprecht  br label %header
107*f9f81289SJordan Rupprecht
108*f9f81289SJordan Rupprechtexit:
109*f9f81289SJordan Rupprecht  call void @b()
110*f9f81289SJordan Rupprecht  br label %end
111*f9f81289SJordan Rupprecht
112*f9f81289SJordan Rupprechtend:
113*f9f81289SJordan Rupprecht  ret void
114*f9f81289SJordan Rupprecht}
115*f9f81289SJordan Rupprecht
116*f9f81289SJordan Rupprechtdeclare i1 @foo()
117*f9f81289SJordan Rupprechtdeclare void @a()
118*f9f81289SJordan Rupprechtdeclare void @b()
119*f9f81289SJordan Rupprecht
120*f9f81289SJordan Rupprecht!1 = !{!"branch_weights", i32 10, i32 1}
121