xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/Windows/dbzchk.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple thumbv7--windows-itanium -print-machineinstrs=expand-isel-pseudos -verify-machineinstrs -o /dev/null %s 2>&1 | FileCheck %s -check-prefix CHECK-DIV
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; int f(int n, int d) {
4*9880d681SAndroid Build Coastguard Worker;   if (n / d)
5*9880d681SAndroid Build Coastguard Worker;     return 1;
6*9880d681SAndroid Build Coastguard Worker;   return 0;
7*9880d681SAndroid Build Coastguard Worker; }
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc i32 @f(i32 %n, i32 %d) {
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  %retval = alloca i32, align 4
12*9880d681SAndroid Build Coastguard Worker  %n.addr = alloca i32, align 4
13*9880d681SAndroid Build Coastguard Worker  %d.addr = alloca i32, align 4
14*9880d681SAndroid Build Coastguard Worker  store i32 %n, i32* %n.addr, align 4
15*9880d681SAndroid Build Coastguard Worker  store i32 %d, i32* %d.addr, align 4
16*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %n.addr, align 4
17*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %d.addr, align 4
18*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %0, %1
19*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %div, 0
20*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.then, label %if.end
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerif.then:
23*9880d681SAndroid Build Coastguard Worker  store i32 1, i32* %retval, align 4
24*9880d681SAndroid Build Coastguard Worker  br label %return
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerif.end:
27*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %retval, align 4
28*9880d681SAndroid Build Coastguard Worker  br label %return
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerreturn:
31*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %retval, align 4
32*9880d681SAndroid Build Coastguard Worker  ret i32 %2
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: BB#0
36*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: Successors according to CFG: BB#5({{.*}}) BB#4
37*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: BB#1
38*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: Successors according to CFG: BB#3
39*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: BB#2
40*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: Successors according to CFG: BB#3
41*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: BB#3
42*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: BB#4
43*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: Successors according to CFG: BB#1({{.*}}) BB#2
44*9880d681SAndroid Build Coastguard Worker; CHECK-DIV-DAG: BB#5
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple thumbv7--windows-itanium -print-machineinstrs=expand-isel-pseudos -verify-machineinstrs -o /dev/null %s 2>&1 | FileCheck %s -check-prefix CHECK-MOD
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; int r;
49*9880d681SAndroid Build Coastguard Worker; int g(int l, int m) {
50*9880d681SAndroid Build Coastguard Worker;   if (m <= 0)
51*9880d681SAndroid Build Coastguard Worker;     return 0;
52*9880d681SAndroid Build Coastguard Worker;   return (r = l % m);
53*9880d681SAndroid Build Coastguard Worker; }
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker@r = common global i32 0, align 4
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc i32 @g(i32 %l, i32 %m) {
58*9880d681SAndroid Build Coastguard Workerentry:
59*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %m, 0
60*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %if.end
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerif.end:
63*9880d681SAndroid Build Coastguard Worker  %rem = urem i32 %l, %m
64*9880d681SAndroid Build Coastguard Worker  store i32 %rem, i32* @r, align 4
65*9880d681SAndroid Build Coastguard Worker  br label %return
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerreturn:
68*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %rem, %if.end ], [ 0, %entry ]
69*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: BB#0
73*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: Successors according to CFG: BB#2({{.*}}) BB#1
74*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: BB#1
75*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: Successors according to CFG: BB#4({{.*}}) BB#3
76*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: BB#2
77*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: BB#3
78*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: Successors according to CFG: BB#2
79*9880d681SAndroid Build Coastguard Worker; CHECK-MOD-DAG: BB#4
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple thumbv7--windows-itanium -print-machineinstrs=expand-isel-pseudos -verify-machineinstrs -filetype asm -o /dev/null %s 2>&1 | FileCheck %s -check-prefix CHECK-CFG
82*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple thumbv7--windows-itanium -print-machineinstrs=expand-isel-pseudos -verify-machineinstrs -filetype asm -o - %s | FileCheck %s -check-prefix CHECK-CFG-ASM
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; unsigned c;
85*9880d681SAndroid Build Coastguard Worker; extern unsigned long g(void);
86*9880d681SAndroid Build Coastguard Worker; int f(unsigned u, signed char b) {
87*9880d681SAndroid Build Coastguard Worker;   if (b)
88*9880d681SAndroid Build Coastguard Worker;     c = g() % u;
89*9880d681SAndroid Build Coastguard Worker;   return c;
90*9880d681SAndroid Build Coastguard Worker; }
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker@c = common global i32 0, align 4
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdeclare arm_aapcs_vfpcc i32 @i()
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc i32 @h(i32 %u, i8 signext %b) #0 {
97*9880d681SAndroid Build Coastguard Workerentry:
98*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %b, 0
99*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %entry.if.end_crit_edge, label %if.then
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerentry.if.end_crit_edge:
102*9880d681SAndroid Build Coastguard Worker  %.pre = load i32, i32* @c, align 4
103*9880d681SAndroid Build Coastguard Worker  br label %if.end
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerif.then:
106*9880d681SAndroid Build Coastguard Worker  %call = tail call arm_aapcs_vfpcc i32 @i()
107*9880d681SAndroid Build Coastguard Worker  %rem = urem i32 %call, %u
108*9880d681SAndroid Build Coastguard Worker  store i32 %rem, i32* @c, align 4
109*9880d681SAndroid Build Coastguard Worker  br label %if.end
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerif.end:
112*9880d681SAndroid Build Coastguard Worker  %0 = phi i32 [ %.pre, %entry.if.end_crit_edge ], [ %rem, %if.then ]
113*9880d681SAndroid Build Coastguard Worker  ret i32 %0
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerattributes #0 = { optsize }
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: BB#0
119*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: t2Bcc <BB#2>
120*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: t2B <BB#1>
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: BB#1
123*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: t2B <BB#3>
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: BB#2
126*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: tCBZ %vreg{{[0-9]}}, <BB#5>
127*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: t2B <BB#4>
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: BB#4
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: BB#3
132*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: tBX_RET
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: BB#5
135*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-DAG: t2UDF 249
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM-LABEL: h:
138*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM: cbz r{{[0-9]}}, .LBB2_2
139*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM: b .LBB2_4
140*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM-LABEL: .LBB2_2:
141*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM-NEXT: udf.w #249
142*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM-LABEL: .LBB2_4:
143*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM: bl __rt_udiv
144*9880d681SAndroid Build Coastguard Worker; CHECK-CFG-ASM: pop.w {{{.*}}, r11, pc}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mtriple thumbv7--windows-itanium -verify-machineinstrs -filetype asm -o - %s | FileCheck %s -check-prefix CHECK-WIN__DBZCHK
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker; long k(void);
149*9880d681SAndroid Build Coastguard Worker; int l(void);
150*9880d681SAndroid Build Coastguard Worker; int j(int i) {
151*9880d681SAndroid Build Coastguard Worker;   if (l() == -1)
152*9880d681SAndroid Build Coastguard Worker;     return 0;
153*9880d681SAndroid Build Coastguard Worker;   return k() % i;
154*9880d681SAndroid Build Coastguard Worker; }
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdeclare arm_aapcs_vfpcc i32 @k()
157*9880d681SAndroid Build Coastguard Workerdeclare arm_aapcs_vfpcc i32 @l()
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc i32 @j(i32 %i) {
160*9880d681SAndroid Build Coastguard Workerentry:
161*9880d681SAndroid Build Coastguard Worker  %retval = alloca i32, align 4
162*9880d681SAndroid Build Coastguard Worker  %i.addr = alloca i32, align 4
163*9880d681SAndroid Build Coastguard Worker  store i32 %i, i32* %i.addr, align 4
164*9880d681SAndroid Build Coastguard Worker  %call = call arm_aapcs_vfpcc i32 @l()
165*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %call, -1
166*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerif.then:
169*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %retval, align 4
170*9880d681SAndroid Build Coastguard Worker  br label %return
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerif.end:
173*9880d681SAndroid Build Coastguard Worker  %call1 = call arm_aapcs_vfpcc i32 @k()
174*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %i.addr, align 4
175*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %call1, %0
176*9880d681SAndroid Build Coastguard Worker  store i32 %rem, i32* %retval, align 4
177*9880d681SAndroid Build Coastguard Worker  br label %return
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerreturn:
180*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %retval, align 4
181*9880d681SAndroid Build Coastguard Worker  ret i32 %1
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK-LABEL: j:
185*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK: cbz r{{[0-7]}}, .LBB
186*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK-NOT: cbz r8, .LBB
187*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK-NOT: cbz r9, .LBB
188*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK-NOT: cbz r10, .LBB
189*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK-NOT: cbz r11, .LBB
190*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK-NOT: cbz ip, .LBB
191*9880d681SAndroid Build Coastguard Worker; CHECK-WIN__DBZCHK-NOT: cbz lr, .LBB
192*9880d681SAndroid Build Coastguard Worker
193