xref: /llvm-project/llvm/test/CodeGen/X86/innermost-loop-alignment.ll (revision e6bf48d11047e970cb24554a01b65b566d6b5d22)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-pc-linux-gnu | FileCheck %s -check-prefix=DEFAULT
3; RUN: llc < %s -mtriple=i686-pc-linux-gnu -x86-experimental-pref-innermost-loop-alignment=5 | FileCheck %s -check-prefix=ALIGN32
4; RUN: llc < %s -mtriple=i686-pc-linux-gnu -align-loops=32 -x86-experimental-pref-innermost-loop-alignment=6 | FileCheck %s -check-prefix=ALIGN64
5
6declare void @foo()
7
8define void @test(i32 %n, i32 %m) {
9; DEFAULT-LABEL: test:
10; DEFAULT:       # %bb.0: # %entry
11; DEFAULT-NEXT:    pushl %ebp
12; DEFAULT-NEXT:    .cfi_def_cfa_offset 8
13; DEFAULT-NEXT:    pushl %ebx
14; DEFAULT-NEXT:    .cfi_def_cfa_offset 12
15; DEFAULT-NEXT:    pushl %edi
16; DEFAULT-NEXT:    .cfi_def_cfa_offset 16
17; DEFAULT-NEXT:    pushl %esi
18; DEFAULT-NEXT:    .cfi_def_cfa_offset 20
19; DEFAULT-NEXT:    subl $12, %esp
20; DEFAULT-NEXT:    .cfi_def_cfa_offset 32
21; DEFAULT-NEXT:    .cfi_offset %esi, -20
22; DEFAULT-NEXT:    .cfi_offset %edi, -16
23; DEFAULT-NEXT:    .cfi_offset %ebx, -12
24; DEFAULT-NEXT:    .cfi_offset %ebp, -8
25; DEFAULT-NEXT:    xorl %esi, %esi
26; DEFAULT-NEXT:    movl {{[0-9]+}}(%esp), %edi
27; DEFAULT-NEXT:    movl {{[0-9]+}}(%esp), %ebx
28; DEFAULT-NEXT:    .p2align 4
29; DEFAULT-NEXT:  .LBB0_1: # %outer
30; DEFAULT-NEXT:    # =>This Loop Header: Depth=1
31; DEFAULT-NEXT:    # Child Loop BB0_2 Depth 2
32; DEFAULT-NEXT:    movl %edi, %ebp
33; DEFAULT-NEXT:    .p2align 4
34; DEFAULT-NEXT:  .LBB0_2: # %inner
35; DEFAULT-NEXT:    # Parent Loop BB0_1 Depth=1
36; DEFAULT-NEXT:    # => This Inner Loop Header: Depth=2
37; DEFAULT-NEXT:    calll foo@PLT
38; DEFAULT-NEXT:    decl %ebp
39; DEFAULT-NEXT:    jne .LBB0_2
40; DEFAULT-NEXT:  # %bb.3: # %outer_bb
41; DEFAULT-NEXT:    # in Loop: Header=BB0_1 Depth=1
42; DEFAULT-NEXT:    incl %esi
43; DEFAULT-NEXT:    cmpl %ebx, %esi
44; DEFAULT-NEXT:    jne .LBB0_1
45; DEFAULT-NEXT:  # %bb.4: # %exit
46; DEFAULT-NEXT:    addl $12, %esp
47; DEFAULT-NEXT:    .cfi_def_cfa_offset 20
48; DEFAULT-NEXT:    popl %esi
49; DEFAULT-NEXT:    .cfi_def_cfa_offset 16
50; DEFAULT-NEXT:    popl %edi
51; DEFAULT-NEXT:    .cfi_def_cfa_offset 12
52; DEFAULT-NEXT:    popl %ebx
53; DEFAULT-NEXT:    .cfi_def_cfa_offset 8
54; DEFAULT-NEXT:    popl %ebp
55; DEFAULT-NEXT:    .cfi_def_cfa_offset 4
56; DEFAULT-NEXT:    retl
57;
58; ALIGN32-LABEL: test:
59; ALIGN32:       # %bb.0: # %entry
60; ALIGN32-NEXT:    pushl %ebp
61; ALIGN32-NEXT:    .cfi_def_cfa_offset 8
62; ALIGN32-NEXT:    pushl %ebx
63; ALIGN32-NEXT:    .cfi_def_cfa_offset 12
64; ALIGN32-NEXT:    pushl %edi
65; ALIGN32-NEXT:    .cfi_def_cfa_offset 16
66; ALIGN32-NEXT:    pushl %esi
67; ALIGN32-NEXT:    .cfi_def_cfa_offset 20
68; ALIGN32-NEXT:    subl $12, %esp
69; ALIGN32-NEXT:    .cfi_def_cfa_offset 32
70; ALIGN32-NEXT:    .cfi_offset %esi, -20
71; ALIGN32-NEXT:    .cfi_offset %edi, -16
72; ALIGN32-NEXT:    .cfi_offset %ebx, -12
73; ALIGN32-NEXT:    .cfi_offset %ebp, -8
74; ALIGN32-NEXT:    xorl %esi, %esi
75; ALIGN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
76; ALIGN32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
77; ALIGN32-NEXT:    .p2align 4
78; ALIGN32-NEXT:  .LBB0_1: # %outer
79; ALIGN32-NEXT:    # =>This Loop Header: Depth=1
80; ALIGN32-NEXT:    # Child Loop BB0_2 Depth 2
81; ALIGN32-NEXT:    movl %edi, %ebp
82; ALIGN32-NEXT:    .p2align 5
83; ALIGN32-NEXT:  .LBB0_2: # %inner
84; ALIGN32-NEXT:    # Parent Loop BB0_1 Depth=1
85; ALIGN32-NEXT:    # => This Inner Loop Header: Depth=2
86; ALIGN32-NEXT:    calll foo@PLT
87; ALIGN32-NEXT:    decl %ebp
88; ALIGN32-NEXT:    jne .LBB0_2
89; ALIGN32-NEXT:  # %bb.3: # %outer_bb
90; ALIGN32-NEXT:    # in Loop: Header=BB0_1 Depth=1
91; ALIGN32-NEXT:    incl %esi
92; ALIGN32-NEXT:    cmpl %ebx, %esi
93; ALIGN32-NEXT:    jne .LBB0_1
94; ALIGN32-NEXT:  # %bb.4: # %exit
95; ALIGN32-NEXT:    addl $12, %esp
96; ALIGN32-NEXT:    .cfi_def_cfa_offset 20
97; ALIGN32-NEXT:    popl %esi
98; ALIGN32-NEXT:    .cfi_def_cfa_offset 16
99; ALIGN32-NEXT:    popl %edi
100; ALIGN32-NEXT:    .cfi_def_cfa_offset 12
101; ALIGN32-NEXT:    popl %ebx
102; ALIGN32-NEXT:    .cfi_def_cfa_offset 8
103; ALIGN32-NEXT:    popl %ebp
104; ALIGN32-NEXT:    .cfi_def_cfa_offset 4
105; ALIGN32-NEXT:    retl
106;
107; ALIGN64-LABEL: test:
108; ALIGN64:       # %bb.0: # %entry
109; ALIGN64-NEXT:    pushl %ebp
110; ALIGN64-NEXT:    .cfi_def_cfa_offset 8
111; ALIGN64-NEXT:    pushl %ebx
112; ALIGN64-NEXT:    .cfi_def_cfa_offset 12
113; ALIGN64-NEXT:    pushl %edi
114; ALIGN64-NEXT:    .cfi_def_cfa_offset 16
115; ALIGN64-NEXT:    pushl %esi
116; ALIGN64-NEXT:    .cfi_def_cfa_offset 20
117; ALIGN64-NEXT:    subl $12, %esp
118; ALIGN64-NEXT:    .cfi_def_cfa_offset 32
119; ALIGN64-NEXT:    .cfi_offset %esi, -20
120; ALIGN64-NEXT:    .cfi_offset %edi, -16
121; ALIGN64-NEXT:    .cfi_offset %ebx, -12
122; ALIGN64-NEXT:    .cfi_offset %ebp, -8
123; ALIGN64-NEXT:    xorl %esi, %esi
124; ALIGN64-NEXT:    movl {{[0-9]+}}(%esp), %edi
125; ALIGN64-NEXT:    movl {{[0-9]+}}(%esp), %ebx
126; ALIGN64-NEXT:    .p2align 5
127; ALIGN64-NEXT:  .LBB0_1: # %outer
128; ALIGN64-NEXT:    # =>This Loop Header: Depth=1
129; ALIGN64-NEXT:    # Child Loop BB0_2 Depth 2
130; ALIGN64-NEXT:    movl %edi, %ebp
131; ALIGN64-NEXT:    .p2align 6
132; ALIGN64-NEXT:  .LBB0_2: # %inner
133; ALIGN64-NEXT:    # Parent Loop BB0_1 Depth=1
134; ALIGN64-NEXT:    # => This Inner Loop Header: Depth=2
135; ALIGN64-NEXT:    calll foo@PLT
136; ALIGN64-NEXT:    decl %ebp
137; ALIGN64-NEXT:    jne .LBB0_2
138; ALIGN64-NEXT:  # %bb.3: # %outer_bb
139; ALIGN64-NEXT:    # in Loop: Header=BB0_1 Depth=1
140; ALIGN64-NEXT:    incl %esi
141; ALIGN64-NEXT:    cmpl %ebx, %esi
142; ALIGN64-NEXT:    jne .LBB0_1
143; ALIGN64-NEXT:  # %bb.4: # %exit
144; ALIGN64-NEXT:    addl $12, %esp
145; ALIGN64-NEXT:    .cfi_def_cfa_offset 20
146; ALIGN64-NEXT:    popl %esi
147; ALIGN64-NEXT:    .cfi_def_cfa_offset 16
148; ALIGN64-NEXT:    popl %edi
149; ALIGN64-NEXT:    .cfi_def_cfa_offset 12
150; ALIGN64-NEXT:    popl %ebx
151; ALIGN64-NEXT:    .cfi_def_cfa_offset 8
152; ALIGN64-NEXT:    popl %ebp
153; ALIGN64-NEXT:    .cfi_def_cfa_offset 4
154; ALIGN64-NEXT:    retl
155
156
157
158entry:
159  br label %outer
160
161outer:
162  %outer.iv = phi i32 [0, %entry], [%outer.iv.next, %outer_bb]
163  br label %inner
164
165inner:
166  %inner.iv = phi i32 [0, %outer], [%inner.iv.next, %inner]
167  call void @foo()
168  %inner.iv.next = add i32 %inner.iv, 1
169  %inner.cond = icmp ne i32 %inner.iv.next, %m
170  br i1 %inner.cond, label %inner, label %outer_bb
171
172outer_bb:
173  %outer.iv.next = add i32 %outer.iv, 1
174  %outer.cond = icmp ne i32 %outer.iv.next, %n
175  br i1 %outer.cond, label %outer, label %exit
176
177exit:
178  ret void
179}
180