blob: 13ee8c44611aa2adbcb1c694b139fc1fba586b59 [file] [log] [blame]
Jim Stichnotha59ae6f2015-05-17 10:11:41 -07001; This tests the optimization where producers and consumers of i1 (bool)
2; variables are combined to implicitly use flags instead of explicitly using
3; stack or register variables.
4
5; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 | FileCheck %s
6
7declare void @use_value(i32)
8
9; Basic cmp/branch folding.
10define i32 @fold_cmp_br(i32 %arg1, i32 %arg2) {
11entry:
12 %cmp1 = icmp slt i32 %arg1, %arg2
13 br i1 %cmp1, label %branch1, label %branch2
14branch1:
15 ret i32 1
16branch2:
17 ret i32 2
18}
19
20; CHECK-LABEL: fold_cmp_br
21; CHECK: cmp
22; CHECK: jge
23
24
25; Cmp/branch folding with intervening instructions.
26define i32 @fold_cmp_br_intervening_insts(i32 %arg1, i32 %arg2) {
27entry:
28 %cmp1 = icmp slt i32 %arg1, %arg2
29 call void @use_value(i32 %arg1)
30 br i1 %cmp1, label %branch1, label %branch2
31branch1:
32 ret i32 1
33branch2:
34 ret i32 2
35}
36
37; CHECK-LABEL: fold_cmp_br_intervening_insts
38; CHECK-NOT: cmp
39; CHECK: call
40; CHECK: cmp
41; CHECK: jge
42
43
44; Cmp/branch non-folding because of live-out.
45define i32 @no_fold_cmp_br_liveout(i32 %arg1, i32 %arg2) {
46entry:
47 %cmp1 = icmp slt i32 %arg1, %arg2
48 br label %next
49next:
50 br i1 %cmp1, label %branch1, label %branch2
51branch1:
52 ret i32 1
53branch2:
54 ret i32 2
55}
56
57; CHECK-LABEL: no_fold_cmp_br_liveout
58; CHECK: cmp
59; CHECK: set
60; CHECK: cmp
61; CHECK: je
62
63
64; Cmp/branch non-folding because of extra non-whitelisted uses.
65define i32 @no_fold_cmp_br_non_whitelist(i32 %arg1, i32 %arg2) {
66entry:
67 %cmp1 = icmp slt i32 %arg1, %arg2
68 %result = zext i1 %cmp1 to i32
69 br i1 %cmp1, label %branch1, label %branch2
70branch1:
71 ret i32 %result
72branch2:
73 ret i32 2
74}
75
76; CHECK-LABEL: no_fold_cmp_br_non_whitelist
77; CHECK: cmp
78; CHECK: set
79; CHECK: movzx
80; CHECK: cmp
81; CHECK: je
82
83
84; Basic cmp/select folding.
85define i32 @fold_cmp_select(i32 %arg1, i32 %arg2) {
86entry:
87 %cmp1 = icmp slt i32 %arg1, %arg2
88 %result = select i1 %cmp1, i32 %arg1, i32 %arg2
89 ret i32 %result
90}
91
92; CHECK-LABEL: fold_cmp_select
93; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -070094; CHECK: cmovl
Jim Stichnotha59ae6f2015-05-17 10:11:41 -070095
96
97; 64-bit cmp/select folding.
98define i64 @fold_cmp_select_64(i64 %arg1, i64 %arg2) {
99entry:
100 %arg1_trunc = trunc i64 %arg1 to i32
101 %arg2_trunc = trunc i64 %arg2 to i32
102 %cmp1 = icmp slt i32 %arg1_trunc, %arg2_trunc
103 %result = select i1 %cmp1, i64 %arg1, i64 %arg2
104 ret i64 %result
105}
106
107; CHECK-LABEL: fold_cmp_select_64
108; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700109; CHECK: cmovl
110; CHECK: cmovl
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700111
Jan Voungfbdd2442015-07-15 12:36:20 -0700112define i64 @fold_cmp_select_64_undef(i64 %arg1) {
113entry:
114 %arg1_trunc = trunc i64 %arg1 to i32
115 %cmp1 = icmp slt i32 undef, %arg1_trunc
116 %result = select i1 %cmp1, i64 %arg1, i64 undef
117 ret i64 %result
118}
119; CHECK-LABEL: fold_cmp_select_64_undef
120; CHECK: cmp
121; CHECK: cmovl
122; CHECK: cmovl
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700123
124; Cmp/select folding with intervening instructions.
125define i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) {
126entry:
127 %cmp1 = icmp slt i32 %arg1, %arg2
128 call void @use_value(i32 %arg1)
129 %result = select i1 %cmp1, i32 %arg1, i32 %arg2
130 ret i32 %result
131}
132
133; CHECK-LABEL: fold_cmp_select_intervening_insts
134; CHECK-NOT: cmp
135; CHECK: call
136; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700137; CHECK: cmovl
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700138
139
140; Cmp/multi-select folding.
141define i32 @fold_cmp_select_multi(i32 %arg1, i32 %arg2) {
142entry:
143 %cmp1 = icmp slt i32 %arg1, %arg2
144 %a = select i1 %cmp1, i32 %arg1, i32 %arg2
145 %b = select i1 %cmp1, i32 %arg2, i32 %arg1
146 %c = select i1 %cmp1, i32 123, i32 %arg1
147 %partial = add i32 %a, %b
148 %result = add i32 %partial, %c
149 ret i32 %result
150}
151
152; CHECK-LABEL: fold_cmp_select_multi
153; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700154; CHECK: cmovl
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700155; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700156; CHECK: cmovl
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700157; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700158; CHECK: cmovge
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700159; CHECK: add
160; CHECK: add
161
162
163; Cmp/multi-select non-folding because of live-out.
164define i32 @no_fold_cmp_select_multi_liveout(i32 %arg1, i32 %arg2) {
165entry:
166 %cmp1 = icmp slt i32 %arg1, %arg2
167 %a = select i1 %cmp1, i32 %arg1, i32 %arg2
168 %b = select i1 %cmp1, i32 %arg2, i32 %arg1
169 br label %next
170next:
171 %c = select i1 %cmp1, i32 123, i32 %arg1
172 %partial = add i32 %a, %b
173 %result = add i32 %partial, %c
174 ret i32 %result
175}
176
177; CHECK-LABEL: no_fold_cmp_select_multi_liveout
178; CHECK: set
179; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700180; CHECK: cmovne
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700181; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700182; CHECK: cmovne
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700183; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700184; CHECK: cmove
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700185; CHECK: add
186; CHECK: add
187
188
189; Cmp/multi-select non-folding because of extra non-whitelisted uses.
190define i32 @no_fold_cmp_select_multi_non_whitelist(i32 %arg1, i32 %arg2) {
191entry:
192 %cmp1 = icmp slt i32 %arg1, %arg2
193 %a = select i1 %cmp1, i32 %arg1, i32 %arg2
194 %b = select i1 %cmp1, i32 %arg2, i32 %arg1
195 %c = select i1 %cmp1, i32 123, i32 %arg1
196 %ext = zext i1 %cmp1 to i32
197 %partial1 = add i32 %a, %b
198 %partial2 = add i32 %partial1, %c
199 %result = add i32 %partial2, %ext
200 ret i32 %result
201}
202
203; CHECK-LABEL: no_fold_cmp_select_multi_non_whitelist
204; CHECK: set
205; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700206; CHECK: cmovne
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700207; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700208; CHECK: cmovne
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700209; CHECK: cmp
Jim Stichnoth537b5ba2015-05-19 09:48:44 -0700210; CHECK: cmove
Jim Stichnotha59ae6f2015-05-17 10:11:41 -0700211; CHECK: movzx
212; CHECK: add
213; CHECK: add
214; CHECK: add