[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / PowerPC / expand-isel.ll
blob1d1c00e5f5a5a31fcaf771cf0aca48341611a67d
1 target 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"
2 target triple = "powerpc64-unknown-linux-gnu"
3 ; RUN: llc -ppc-gpr-icmps=all -verify-machineinstrs -O2 -ppc-asm-full-reg-names -mcpu=pwr7 -ppc-gen-isel=false < %s | FileCheck %s --implicit-check-not isel
5 define signext i32 @testExpandISELToIfElse(i32 signext %i, i32 signext %j) {
6 entry:
7   %cmp = icmp sgt i32 %i, 0
8   %add = add nsw i32 %i, 1
9   %cond = select i1 %cmp, i32 %add, i32 %j
10   ret i32 %cond
12 ; CHECK-LABEL: @testExpandISELToIfElse
13 ; CHECK: addi r5, r3, 1
14 ; CHECK-NEXT: cmpwi cr0, r3, 0
15 ; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
16 ; CHECK: ori r3, r4, 0
17 ; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
18 ; CHECK-NEXT:  [[TRUE]]
19 ; CHECK-NEXT: addi r3, r5, 0
20 ; CHECK-NEXT: [[SUCCESSOR]]
21 ; CHECK-NEXT: extsw r3, r3
22 ; CHECK-NEXT: blr
26 define signext i32 @testExpandISELToIf(i32 signext %i, i32 signext %j) {
27 entry:
28   %cmp = icmp sgt i32 %i, 0
29   %cond = select i1 %cmp, i32 %j, i32 %i
30   ret i32 %cond
32 ; CHECK-LABEL: @testExpandISELToIf
33 ; CHECK: cmpwi   r3, 0
34 ; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
35 ; CHECK-NEXT: blr
36 ; CHECK-NEXT:  [[TRUE]]
37 ; CHECK-NEXT: addi r3, r4, 0
38 ; CHECK-NEXT: blr
41 define signext i32 @testExpandISELToElse(i32 signext %i, i32 signext %j) {
42 entry:
43   %cmp = icmp sgt i32 %i, 0
44   %cond = select i1 %cmp, i32 %i, i32 %j
45   ret i32 %cond
47 ; CHECK-LABEL: @testExpandISELToElse
48 ; CHECK: cmpwi   r3, 0
49 ; CHECK-NEXT: bclr 12, gt, 0
50 ; CHECK: ori r3, r4, 0
51 ; CHECK-NEXT: blr
55 define signext i32 @testExpandISELToNull(i32 signext %i, i32 signext %j) {
56 entry:
57   %cmp = icmp sgt i32 %i, 0
58   %cond = select i1 %cmp, i32 %i, i32 %i
59   ret i32 %cond
61 ; CHECK-LABEL: @testExpandISELToNull
62 ; CHECK-NOT: b {{.LBB[0-9]+}}
63 ; CHECK-NOT: bc
64 ; CHECK: blr
67 define signext i32 @testExpandISELsTo2ORIs2ADDIs
68   (i32 signext %a, i32 signext %b, i32 signext %d,
69    i32 signext %f, i32 signext %g) {
70 entry:
72   %cmp = icmp sgt i32 %g, 0
73   %a.b = select i1 %cmp, i32 %g, i32 %b
74   %d.f = select i1 %cmp, i32 %d, i32 %f
75   %add = add nsw i32 %a.b, %d.f
76   ret i32 %add
78 ; CHECK-LABEL: @testExpandISELsTo2ORIs2ADDIs
79 ; CHECK: cmpwi r7, 0
80 ; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
81 ; CHECK: ori r3, r4, 0
82 ; CHECK-NEXT: ori r4, r6, 0
83 ; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
84 ; CHECK-NEXT:  [[TRUE]]
85 ; CHECK-NEXT: addi r3, r7, 0
86 ; CHECK-NEXT: addi r4, r5, 0
87 ; CHECK-NEXT: [[SUCCESSOR]]
88 ; CHECK-NEXT: add r3, r3, r4
89 ; CHECK-NEXT: extsw r3, r3
90 ; CHECK-NEXT: blr
93 define signext i32 @testExpandISELsTo2ORIs1ADDI
94   (i32 signext %a, i32 signext %b, i32 signext %d,
95    i32 signext %f, i32 signext %g) {
96 entry:
97   %cmp = icmp sgt i32 %g, 0
98   %a.b = select i1 %cmp, i32 %a, i32 %b
99   %d.f = select i1 %cmp, i32 %d, i32 %f
100   %add = add nsw i32 %a.b, %d.f
101   ret i32 %add
103 ; CHECK-LABEL: @testExpandISELsTo2ORIs1ADDI
104 ; CHECK: cmpwi cr0, r7, 0
105 ; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
106 ; CHECK: ori r3, r4, 0
107 ; CHECK-NEXT: ori r4, r6, 0
108 ; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
109 ; CHECK-NEXT: [[TRUE]]
110 ; CHECK-NEXT: addi r4, r5, 0
111 ; CHECK-NEXT:  [[SUCCESSOR]]
112 ; CHECK-NEXT: add r3, r3, r4
113 ; CHECK-NEXT: extsw r3, r3
114 ; CHECK-NEXT: blr
117 define signext i32 @testExpandISELsTo1ORI1ADDI
118   (i32 signext %a, i32 signext %b, i32 signext %d,
119    i32 signext %f, i32 signext %g) {
120 entry:
122   %cmp = icmp sgt i32 %g, 0
123   %a.b = select i1 %cmp, i32 %a, i32 %b
124   %d.f = select i1 %cmp, i32 %d, i32 %f
125   %add1 = add nsw i32 %a.b, %d.f
126   %add2 = add nsw i32 %a, %add1
127   ret i32 %add2
129 ; CHECK-LABEL: @testExpandISELsTo1ORI1ADDI
130 ; CHECK: cmpwi cr0, r7, 0
131 ; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
132 ; CHECK: ori r5, r6, 0
133 ; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
134 ; CHECK-NEXT: [[TRUE]]
135 ; CHECK-NEXT: addi r4, r3, 0
136 ; CHECK-NEXT:  [[SUCCESSOR]]
137 ; CHECK-NEXT: add r4, r4, r5
138 ; CHECK-NEXT: add r3, r3, r4
139 ; CHECK-NEXT: extsw r3, r3
140 ; CHECK-NEXT: blr
143 define signext i32 @testExpandISELsTo0ORI2ADDIs
144   (i32 signext %a, i32 signext %b, i32 signext %d,
145    i32 signext %f, i32 signext %g) {
146 entry:
148   %cmp = icmp sgt i32 %g, 0
149   %a.b = select i1 %cmp, i32 %a, i32 %b
150   %d.f = select i1 %cmp, i32 %d, i32 %f
151   %add1 = add nsw i32 %a.b, %d.f
152   %add2 = add nsw i32 %a, %add1
153   %sub1 = sub nsw i32 %add2, %d
154   ret i32 %sub1
156 ; CHECK-LABEL: @testExpandISELsTo0ORI2ADDIs
157 ; CHECK: cmpwi cr0, r7, 0
158 ; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]]
159 ; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
160 ; CHECK-NEXT:  [[TRUE]]
161 ; CHECK-NEXT: addi r4, r3, 0
162 ; CHECK-NEXT: addi r6, r5, 0
163 ; CHECK-NEXT:  [[SUCCESSOR]]
164 ; CHECK-NEXT: add r4, r4, r6
165 ; CHECK-NEXT: add r3, r3, r4
166 ; CHECK-NEXT: subf r3, r5, r3
167 ; CHECK-NEXT: extsw r3, r3
168 ; CHECK-NEXT: blr
172 @b = local_unnamed_addr global i32 0, align 4
173 @a = local_unnamed_addr global i32 0, align 4
174 ; Function Attrs: norecurse nounwind readonly
175 define signext i32 @testComplexISEL() #0 {
176 entry:
177   %0 = load i32, i32* @b, align 4, !tbaa !1
178   %tobool = icmp eq i32 %0, 0
179   br i1 %tobool, label %if.end, label %cleanup
181 if.end:
182   %1 = load i32, i32* @a, align 4, !tbaa !1
183   %conv = sext i32 %1 to i64
184   %2 = inttoptr i64 %conv to i32 (...)*
185   %cmp = icmp eq i32 (...)* %2, bitcast (i32 ()* @testComplexISEL to i32 (...)*)
186   %conv3 = zext i1 %cmp to i32
187   br label %cleanup
189 cleanup:
190   %retval.0 = phi i32 [ %conv3, %if.end ], [ 1, %entry ]
191   ret i32 %retval.0
193 ; CHECK-LABEL: @testComplexISEL
194 ; CHECK: cmplwi r3, 0
195 ; CHECK: li r3, 1
196 ; CHECK: beq cr0, [[TGT:.LBB[0-9_]+]]
197 ; CHECK: clrldi r3, r3, 32
198 ; CHECK: blr
199 ; CHECK: [[TGT]]
200 ; CHECK: xor [[XOR:r[0-9]+]]
201 ; CHECK: cntlzd [[CZ:r[0-9]+]], [[XOR]]
202 ; CHECK: rldicl [[SH:r[0-9]+]], [[CZ]], 58, 63
205 !1 = !{!2, !2, i64 0}
206 !2 = !{!"int", !3, i64 0}
207 !3 = !{!"omnipotent char", !4, i64 0}
208 !4 = !{!"Simple C/C++ TBAA"}