blob: 76479705f020a555365e43d82c79f50854a5d01c [file] [log] [blame]
Nemanja Ivanovice22ebea2017-09-26 20:42:47 +00001; XFAIL: *
Tony Jiang8e8c4442017-01-16 20:12:26 +00002target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
3target triple = "powerpc64-unknown-linux-gnu"
4; RUN: llc -verify-machineinstrs -O2 -ppc-asm-full-reg-names -mcpu=pwr7 -ppc-gen-isel=false < %s | FileCheck %s --implicit-check-not isel
5; Function Attrs: norecurse nounwind readnone
6define signext i32 @testExpandISELToIfElse(i32 signext %i, i32 signext %j) {
7entry:
8 %cmp = icmp sgt i32 %i, 0
9 %add = add nsw i32 %i, 1
10 %cond = select i1 %cmp, i32 %add, i32 %j
11 ret i32 %cond
12
13; CHECK-LABEL: @testExpandISELToIfElse
14; CHECK: addi r5, r3, 1
15; CHECK-NEXT: cmpwi cr0, r3, 0
Nemanja Ivanovic009016b2017-07-25 18:26:35 +000016; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
Tony Jiang8e8c4442017-01-16 20:12:26 +000017; CHECK: ori r3, r4, 0
18; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
19; CHECK-NEXT: [[TRUE]]
20; CHECK-NEXT: addi r3, r5, 0
21; CHECK-NEXT: [[SUCCESSOR]]
22; CHECK-NEXT: extsw r3, r3
23; CHECK-NEXT: blr
24}
25
26
27; Function Attrs: norecurse nounwind readnone
28define signext i32 @testExpandISELToIf(i32 signext %i, i32 signext %j) {
29entry:
30 %cmp = icmp sgt i32 %i, 0
31 %cond = select i1 %cmp, i32 %j, i32 %i
32 ret i32 %cond
33
34; CHECK-LABEL: @testExpandISELToIf
35; CHECK: cmpwi r3, 0
Nemanja Ivanovic009016b2017-07-25 18:26:35 +000036; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
Tony Jiang8e8c4442017-01-16 20:12:26 +000037; CHECK-NEXT: blr
38; CHECK-NEXT: [[TRUE]]
39; CHECK-NEXT: addi r3, r4, 0
40; CHECK-NEXT: blr
41}
42
43; Function Attrs: norecurse nounwind readnone
44define signext i32 @testExpandISELToElse(i32 signext %i, i32 signext %j) {
45entry:
46 %cmp = icmp sgt i32 %i, 0
47 %cond = select i1 %cmp, i32 %i, i32 %j
48 ret i32 %cond
49
50; CHECK-LABEL: @testExpandISELToElse
51; CHECK: cmpwi r3, 0
Nemanja Ivanovic009016b2017-07-25 18:26:35 +000052; CHECK-NEXT: bclr 12, gt, 0
Tony Jiang8e8c4442017-01-16 20:12:26 +000053; CHECK: ori r3, r4, 0
54; CHECK-NEXT: blr
55}
56
57; Function Attrs: norecurse nounwind readnone
58define signext i32 @testReplaceISELWithCopy(i32 signext %i, i32 signext %j) {
59entry:
60 %cmp = icmp sgt i32 %i, 0
61 %cond = select i1 %cmp, i32 %j, i32 %j
62 ret i32 %cond
63
64; CHECK-LABEL: @testReplaceISELWithCopy
65
66; Fix me should really check: addi r3, r4, 0
67; but for some reason it's optimized to mr r3, r4
68; CHECK: mr r3, r4
69; CHECK-NEXT: blr
70}
71
72; Function Attrs: norecurse nounwind readnone
73define signext i32 @testExpandISELToNull(i32 signext %i, i32 signext %j) {
74entry:
75 %cmp = icmp sgt i32 %i, 0
76 %cond = select i1 %cmp, i32 %i, i32 %i
77 ret i32 %cond
78
79; CHECK-LABEL: @testExpandISELToNull
80; CHECK-NOT: b {{.LBB[0-9]+}}
81; CHECK-NOT: bc
82; CHECK: blr
83}
84
85; Function Attrs: norecurse nounwind readnone
86define signext i32 @testExpandISELsTo2ORIs2ADDIs
87 (i32 signext %a, i32 signext %b, i32 signext %d,
88 i32 signext %f, i32 signext %g) {
89entry:
90
91 %cmp = icmp sgt i32 %g, 0
92 %a.b = select i1 %cmp, i32 %g, i32 %b
93 %d.f = select i1 %cmp, i32 %d, i32 %f
94 %add = add nsw i32 %a.b, %d.f
95 ret i32 %add
96
97; CHECK-LABEL: @testExpandISELsTo2ORIs2ADDIs
98; CHECK: cmpwi r7, 0
Nemanja Ivanovic009016b2017-07-25 18:26:35 +000099; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
Tony Jiang8e8c4442017-01-16 20:12:26 +0000100; CHECK: ori r3, r4, 0
101; CHECK-NEXT: ori r12, r6, 0
102; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
103; CHECK-NEXT: [[TRUE]]
104; CHECK-NEXT: addi r3, r7, 0
105; CHECK-NEXT: addi r12, r5, 0
106; CHECK-NEXT: [[SUCCESSOR]]
107; CHECK-NEXT: add r3, r3, r12
108; CHECK-NEXT: extsw r3, r3
109; CHECK-NEXT: blr
110}
111
112; Function Attrs: norecurse nounwind readnone
113define signext i32 @testExpandISELsTo2ORIs1ADDI
114 (i32 signext %a, i32 signext %b, i32 signext %d,
115 i32 signext %f, i32 signext %g) {
116entry:
117 %cmp = icmp sgt i32 %g, 0
118 %a.b = select i1 %cmp, i32 %a, i32 %b
119 %d.f = select i1 %cmp, i32 %d, i32 %f
120 %add = add nsw i32 %a.b, %d.f
121 ret i32 %add
122
123; CHECK-LABEL: @testExpandISELsTo2ORIs1ADDI
124; CHECK: cmpwi cr0, r7, 0
Nemanja Ivanovic009016b2017-07-25 18:26:35 +0000125; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
Tony Jiang8e8c4442017-01-16 20:12:26 +0000126; CHECK: ori r3, r4, 0
127; CHECK-NEXT: ori r12, r6, 0
128; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
129; CHECK-NEXT: [[TRUE]]
130; CHECK-NEXT: addi r12, r5, 0
131; CHECK-NEXT: [[SUCCESSOR]]
132; CHECK-NEXT: add r3, r3, r12
133; CHECK-NEXT: extsw r3, r3
134; CHECK-NEXT: blr
135}
136
137; Function Attrs: norecurse nounwind readnone
138define signext i32 @testExpandISELsTo1ORI1ADDI
139 (i32 signext %a, i32 signext %b, i32 signext %d,
140 i32 signext %f, i32 signext %g) {
141entry:
142
143 %cmp = icmp sgt i32 %g, 0
144 %a.b = select i1 %cmp, i32 %a, i32 %b
145 %d.f = select i1 %cmp, i32 %d, i32 %f
146 %add1 = add nsw i32 %a.b, %d.f
147 %add2 = add nsw i32 %a, %add1
148 ret i32 %add2
149
150; CHECK-LABEL: @testExpandISELsTo1ORI1ADDI
151; CHECK: cmpwi cr0, r7, 0
Nemanja Ivanovic009016b2017-07-25 18:26:35 +0000152; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
Tony Jiang8e8c4442017-01-16 20:12:26 +0000153; CHECK: ori r5, r6, 0
154; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
155; CHECK-NEXT: [[TRUE]]
156; CHECK-NEXT: addi r4, r3, 0
157; CHECK-NEXT: [[SUCCESSOR]]
158; CHECK-NEXT: add r4, r4, r5
159; CHECK-NEXT: add r3, r3, r4
160; CHECK-NEXT: extsw r3, r3
161; CHECK-NEXT: blr
162}
163
164; Function Attrs: norecurse nounwind readnone
165define signext i32 @testExpandISELsTo0ORI2ADDIs
166 (i32 signext %a, i32 signext %b, i32 signext %d,
167 i32 signext %f, i32 signext %g) {
168entry:
169
170 %cmp = icmp sgt i32 %g, 0
171 %a.b = select i1 %cmp, i32 %a, i32 %b
172 %d.f = select i1 %cmp, i32 %d, i32 %f
173 %add1 = add nsw i32 %a.b, %d.f
174 %add2 = add nsw i32 %a, %add1
175 %sub1 = sub nsw i32 %add2, %d
176 ret i32 %sub1
177
178; CHECK-LABEL: @testExpandISELsTo0ORI2ADDIs
179; CHECK: cmpwi cr0, r7, 0
Nemanja Ivanovic009016b2017-07-25 18:26:35 +0000180; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
Tony Jiang8e8c4442017-01-16 20:12:26 +0000181; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
182; CHECK-NEXT: [[TRUE]]
183; CHECK-NEXT: addi r4, r3, 0
184; CHECK-NEXT: addi r6, r5, 0
185; CHECK-NEXT: [[SUCCESSOR]]
186; CHECK-NEXT: add r4, r4, r6
187; CHECK-NEXT: add r3, r3, r4
188; CHECK-NEXT: subf r3, r5, r3
189; CHECK-NEXT: extsw r3, r3
190; CHECK-NEXT: blr
191}
192
193
194@b = common local_unnamed_addr global i32 0, align 4
195@a = common local_unnamed_addr global i32 0, align 4
196; Function Attrs: norecurse nounwind readonly
197define signext i32 @testComplexISEL() #0 {
198entry:
199 %0 = load i32, i32* @b, align 4, !tbaa !1
200 %tobool = icmp eq i32 %0, 0
201 br i1 %tobool, label %if.end, label %cleanup
202
203if.end:
204 %1 = load i32, i32* @a, align 4, !tbaa !1
205 %conv = sext i32 %1 to i64
206 %2 = inttoptr i64 %conv to i32 (...)*
207 %cmp = icmp eq i32 (...)* %2, bitcast (i32 ()* @testComplexISEL to i32 (...)*)
208 %conv3 = zext i1 %cmp to i32
209 br label %cleanup
210
211cleanup:
212 %retval.0 = phi i32 [ %conv3, %if.end ], [ 1, %entry ]
213 ret i32 %retval.0
214
215; CHECK-LABEL: @testComplexISEL
Nemanja Ivanovicaccab032017-05-31 08:04:07 +0000216; CHECK-DAG: [[LI:r[0-9]+]], 1
217; CHECK-DAG: cmplwi [[LD:r[0-9]+]], 0
Hiroshi Inouee3a3e3c2017-10-16 04:12:57 +0000218; CHECK: bnelr cr0
Nemanja Ivanovicaccab032017-05-31 08:04:07 +0000219; CHECK: xor [[XOR:r[0-9]+]]
220; CHECK: cntlzd [[CZ:r[0-9]+]], [[XOR]]
221; CHECK: rldicl [[SH:r[0-9]+]], [[CZ]], 58, 63
Tony Jiang8e8c4442017-01-16 20:12:26 +0000222}
223
224!1 = !{!2, !2, i64 0}
225!2 = !{!"int", !3, i64 0}
226!3 = !{!"omnipotent char", !4, i64 0}
227!4 = !{!"Simple C/C++ TBAA"}