blob: 680f05b834078d716f26b040a837d71d923ffb56 [file] [log] [blame]
Duncan P. N. Exon Smithbffee5b2014-04-19 22:40:56 +00001;RUN: llc -debug-only=block-freq -march=sparc < %s -verify-machineinstrs | FileCheck %s
2;RUN: llc -debug-only=block-freq -march=sparc -O0 < %s -verify-machineinstrs | FileCheck %s -check-prefix=UNOPT
3;REQUIRES: asserts
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +00004
Duncan P. N. Exon Smithc812b5b2014-04-18 17:22:19 +00005target triple = "sparc-unknown-linux-gnu"
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +00006
7define i32 @test(i32 %a) nounwind {
8entry:
9; CHECK: test
10; CHECK: call bar
11; CHECK-NOT: nop
Venkatraman Govindarajuad40dfc2014-01-10 02:55:27 +000012; CHECK: ret
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +000013; CHECK-NEXT: restore
14 %0 = tail call i32 @bar(i32 %a) nounwind
15 ret i32 %0
16}
17
18define i32 @test_jmpl(i32 (i32, i32)* nocapture %f, i32 %a, i32 %b) nounwind {
19entry:
20; CHECK: test_jmpl
21; CHECK: call
22; CHECK-NOT: nop
Venkatraman Govindarajuad40dfc2014-01-10 02:55:27 +000023; CHECK: ret
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +000024; CHECK-NEXT: restore
25 %0 = tail call i32 %f(i32 %a, i32 %b) nounwind
26 ret i32 %0
27}
28
29define i32 @test_loop(i32 %a, i32 %b) nounwind readnone {
30; CHECK: test_loop
31entry:
32 %0 = icmp sgt i32 %b, 0
33 br i1 %0, label %bb, label %bb5
34
35bb: ; preds = %entry, %bb
36 %a_addr.18 = phi i32 [ %a_addr.0, %bb ], [ %a, %entry ]
37 %1 = phi i32 [ %3, %bb ], [ 0, %entry ]
38 %tmp9 = mul i32 %1, %b
39 %2 = and i32 %1, 1
40 %tmp = xor i32 %2, 1
41 %.pn = shl i32 %tmp9, %tmp
42 %a_addr.0 = add i32 %.pn, %a_addr.18
43 %3 = add nsw i32 %1, 1
44 %exitcond = icmp eq i32 %3, %b
Venkatraman Govindarajudc82ac02013-06-07 00:03:36 +000045;CHECK: cmp
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +000046;CHECK: bne
47;CHECK-NOT: nop
48 br i1 %exitcond, label %bb5, label %bb
49
50bb5: ; preds = %bb, %entry
51 %a_addr.1.lcssa = phi i32 [ %a, %entry ], [ %a_addr.0, %bb ]
Venkatraman Govindarajuad40dfc2014-01-10 02:55:27 +000052;CHECK: retl
Venkatraman Govindaraju3e8c7d92013-06-02 02:24:27 +000053;CHECK-NOT: restore
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +000054 ret i32 %a_addr.1.lcssa
55}
56
57define i32 @test_inlineasm(i32 %a) nounwind {
58entry:
Stephen Lin6f36b452013-07-18 22:47:09 +000059;CHECK-LABEL: test_inlineasm:
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +000060;CHECK: sethi
61;CHECK: !NO_APP
Venkatraman Govindarajudc82ac02013-06-07 00:03:36 +000062;CHECK-NEXT: cmp
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +000063;CHECK-NEXT: bg
Benjamin Kramere2a1d892013-06-17 19:00:36 +000064;CHECK-NEXT: or
Venkatraman Govindaraju058e1242011-01-20 05:08:26 +000065 tail call void asm sideeffect "sethi 0, %g0", ""() nounwind
66 %0 = icmp slt i32 %a, 0
67 br i1 %0, label %bb, label %bb1
68
69bb: ; preds = %entry
70 %1 = tail call i32 (...)* @foo(i32 %a) nounwind
71 ret i32 %1
72
73bb1: ; preds = %entry
74 %2 = tail call i32 @bar(i32 %a) nounwind
75 ret i32 %2
76}
77
78declare i32 @foo(...)
79
80declare i32 @bar(i32)
Venkatraman Govindaraju0c1f6532011-02-12 19:02:33 +000081
82
83define i32 @test_implicit_def() nounwind {
84entry:
Stephen Lin6f36b452013-07-18 22:47:09 +000085;UNOPT-LABEL: test_implicit_def:
Venkatraman Govindaraju0c1f6532011-02-12 19:02:33 +000086;UNOPT: call func
87;UNOPT-NEXT: nop
88 %0 = tail call i32 @func(i32* undef) nounwind
89 ret i32 0
90}
91
Venkatraman Govindaraju54bf6112013-05-16 23:53:29 +000092define i32 @prevent_o7_in_call_delay_slot(i32 %i0) {
93entry:
Stephen Lin6f36b452013-07-18 22:47:09 +000094;CHECK-LABEL: prevent_o7_in_call_delay_slot:
Venkatraman Govindaraju54bf6112013-05-16 23:53:29 +000095;CHECK: add %i0, 2, %o5
96;CHECK: add %i0, 3, %o7
97;CHECK: add %o5, %o7, %o0
98;CHECK: call bar
99;CHECK-NEXT: nop
100 %0 = add nsw i32 %i0, 2
101 %1 = add nsw i32 %i0, 3
Venkatraman Govindaraju3320e5a2013-05-19 20:07:20 +0000102 tail call void asm sideeffect "", "r,r,~{l0},~{l1},~{l2},~{l3},~{l4},~{l5},~{l6},~{l7},~{i0},~{i1},~{i2},~{i3},~{i4},~{i5},~{i6},~{i7},~{o0},~{o1},~{o2},~{o3},~{o4},~{o6},~{g1},~{g2},~{g3},~{g4},~{g5},~{g6},~{g7}"(i32 %0, i32 %1)
Venkatraman Govindaraju54bf6112013-05-16 23:53:29 +0000103 %2 = add nsw i32 %0, %1
104 %3 = tail call i32 @bar(i32 %2)
105 ret i32 %3
106}
107
108
Venkatraman Govindaraju0c1f6532011-02-12 19:02:33 +0000109declare i32 @func(i32*)
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000110
111
112define i32 @restore_add(i32 %a, i32 %b) {
113entry:
Stephen Lind24ab202013-07-14 06:24:09 +0000114;CHECK-LABEL: restore_add:
Venkatraman Govindarajuad40dfc2014-01-10 02:55:27 +0000115;CHECK: ret
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000116;CHECK: restore %o0, %i1, %o0
117 %0 = tail call i32 @bar(i32 %a) nounwind
118 %1 = add nsw i32 %0, %b
119 ret i32 %1
120}
121
122define i32 @restore_add_imm(i32 %a) {
123entry:
Stephen Lind24ab202013-07-14 06:24:09 +0000124;CHECK-LABEL: restore_add_imm:
Venkatraman Govindarajuad40dfc2014-01-10 02:55:27 +0000125;CHECK: ret
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000126;CHECK: restore %o0, 20, %o0
127 %0 = tail call i32 @bar(i32 %a) nounwind
128 %1 = add nsw i32 %0, 20
129 ret i32 %1
130}
131
132define i32 @restore_or(i32 %a) {
133entry:
Stephen Lind24ab202013-07-14 06:24:09 +0000134;CHECK-LABEL: restore_or:
Venkatraman Govindarajuad40dfc2014-01-10 02:55:27 +0000135;CHECK: ret
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000136;CHECK: restore %g0, %o0, %o0
137 %0 = tail call i32 @bar(i32 %a) nounwind
138 ret i32 %0
139}
140
141define i32 @restore_or_imm(i32 %a) {
142entry:
Stephen Lind24ab202013-07-14 06:24:09 +0000143;CHECK-LABEL: restore_or_imm:
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000144;CHECK: or %o0, 20, %i0
Venkatraman Govindarajuad40dfc2014-01-10 02:55:27 +0000145;CHECK: ret
Venkatraman Govindarajuf7eecf82014-03-01 01:04:26 +0000146;CHECK-NOT: restore %g0, %g0, %g0
147;CHECK: restore
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000148 %0 = tail call i32 @bar(i32 %a) nounwind
149 %1 = or i32 %0, 20
150 ret i32 %1
151}
152
153
154define i32 @restore_sethi(i32 %a) {
155entry:
Stephen Lin6f36b452013-07-18 22:47:09 +0000156;CHECK-LABEL: restore_sethi:
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000157;CHECK-NOT: sethi 3
158;CHECK: restore %g0, 3072, %o0
159 %0 = tail call i32 @bar(i32 %a) nounwind
160 %1 = icmp ne i32 %0, 0
161 %2 = select i1 %1, i32 3072, i32 0
162 ret i32 %2
163}
164
165define i32 @restore_sethi_3bit(i32 %a) {
166entry:
Stephen Lin6f36b452013-07-18 22:47:09 +0000167;CHECK-LABEL: restore_sethi_3bit:
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000168;CHECK: sethi 6
169;CHECK-NOT: restore %g0, 6144, %o0
170 %0 = tail call i32 @bar(i32 %a) nounwind
171 %1 = icmp ne i32 %0, 0
172 %2 = select i1 %1, i32 6144, i32 0
173 ret i32 %2
174}
175
176define i32 @restore_sethi_large(i32 %a) {
177entry:
Stephen Lin6f36b452013-07-18 22:47:09 +0000178;CHECK-LABEL: restore_sethi_large:
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000179;CHECK: sethi 4000, %i0
Venkatraman Govindarajuf7eecf82014-03-01 01:04:26 +0000180;CHECK-NOT: restore %g0, %g0, %g0
181;CHECK: restore
Venkatraman Govindaraju0bbe1b22013-06-02 21:48:17 +0000182 %0 = tail call i32 @bar(i32 %a) nounwind
183 %1 = icmp ne i32 %0, 0
184 %2 = select i1 %1, i32 4096000, i32 0
185 ret i32 %2
186}
187