• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1;RUN: llc -march=sparc < %s | FileCheck %s
2;RUN: llc -march=sparc -O0 < %s | FileCheck %s -check-prefix=UNOPT
3
4
5define i32 @test(i32 %a) nounwind {
6entry:
7; CHECK: test
8; CHECK: call bar
9; CHECK-NOT: nop
10; CHECK: jmp
11; CHECK-NEXT: restore
12  %0 = tail call i32 @bar(i32 %a) nounwind
13  ret i32 %0
14}
15
16define i32 @test_jmpl(i32 (i32, i32)* nocapture %f, i32 %a, i32 %b) nounwind {
17entry:
18; CHECK:      test_jmpl
19; CHECK:      call
20; CHECK-NOT:  nop
21; CHECK:      jmp
22; CHECK-NEXT: restore
23  %0 = tail call i32 %f(i32 %a, i32 %b) nounwind
24  ret i32 %0
25}
26
27define i32 @test_loop(i32 %a, i32 %b) nounwind readnone {
28; CHECK: test_loop
29entry:
30  %0 = icmp sgt i32 %b, 0
31  br i1 %0, label %bb, label %bb5
32
33bb:                                               ; preds = %entry, %bb
34  %a_addr.18 = phi i32 [ %a_addr.0, %bb ], [ %a, %entry ]
35  %1 = phi i32 [ %3, %bb ], [ 0, %entry ]
36  %tmp9 = mul i32 %1, %b
37  %2 = and i32 %1, 1
38  %tmp = xor i32 %2, 1
39  %.pn = shl i32 %tmp9, %tmp
40  %a_addr.0 = add i32 %.pn, %a_addr.18
41  %3 = add nsw i32 %1, 1
42  %exitcond = icmp eq i32 %3, %b
43;CHECK:      cmp
44;CHECK:      bne
45;CHECK-NOT:  nop
46  br i1 %exitcond, label %bb5, label %bb
47
48bb5:                                              ; preds = %bb, %entry
49  %a_addr.1.lcssa = phi i32 [ %a, %entry ], [ %a_addr.0, %bb ]
50;CHECK:      jmp
51;CHECK-NOT: restore
52  ret i32 %a_addr.1.lcssa
53}
54
55define i32 @test_inlineasm(i32 %a) nounwind {
56entry:
57;CHECK-LABEL:      test_inlineasm:
58;CHECK:      sethi
59;CHECK:      !NO_APP
60;CHECK-NEXT: cmp
61;CHECK-NEXT: bg
62;CHECK-NEXT: or
63  tail call void asm sideeffect "sethi 0, %g0", ""() nounwind
64  %0 = icmp slt i32 %a, 0
65  br i1 %0, label %bb, label %bb1
66
67bb:                                               ; preds = %entry
68  %1 = tail call i32 (...)* @foo(i32 %a) nounwind
69  ret i32 %1
70
71bb1:                                              ; preds = %entry
72  %2 = tail call i32 @bar(i32 %a) nounwind
73  ret i32 %2
74}
75
76declare i32 @foo(...)
77
78declare i32 @bar(i32)
79
80
81define i32 @test_implicit_def() nounwind {
82entry:
83;UNOPT-LABEL:       test_implicit_def:
84;UNOPT:       call func
85;UNOPT-NEXT:  nop
86  %0 = tail call i32 @func(i32* undef) nounwind
87  ret i32 0
88}
89
90define i32 @prevent_o7_in_call_delay_slot(i32 %i0) {
91entry:
92;CHECK-LABEL:       prevent_o7_in_call_delay_slot:
93;CHECK:       add %i0, 2, %o5
94;CHECK:       add %i0, 3, %o7
95;CHECK:       add %o5, %o7, %o0
96;CHECK:       call bar
97;CHECK-NEXT:  nop
98  %0 = add nsw i32 %i0, 2
99  %1 = add nsw i32 %i0, 3
100  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)
101  %2 = add nsw i32 %0, %1
102  %3 = tail call i32 @bar(i32 %2)
103  ret i32 %3
104}
105
106
107declare i32 @func(i32*)
108
109
110define i32 @restore_add(i32 %a, i32 %b) {
111entry:
112;CHECK-LABEL:  restore_add:
113;CHECK:  jmp %i7+8
114;CHECK:  restore %o0, %i1, %o0
115  %0 = tail call i32 @bar(i32 %a) nounwind
116  %1 = add nsw i32 %0, %b
117  ret i32 %1
118}
119
120define i32 @restore_add_imm(i32 %a) {
121entry:
122;CHECK-LABEL:  restore_add_imm:
123;CHECK:  jmp %i7+8
124;CHECK:  restore %o0, 20, %o0
125  %0 = tail call i32 @bar(i32 %a) nounwind
126  %1 = add nsw i32 %0, 20
127  ret i32 %1
128}
129
130define i32 @restore_or(i32 %a) {
131entry:
132;CHECK-LABEL:  restore_or:
133;CHECK:  jmp %i7+8
134;CHECK:  restore %g0, %o0, %o0
135  %0 = tail call i32 @bar(i32 %a) nounwind
136  ret i32 %0
137}
138
139define i32 @restore_or_imm(i32 %a) {
140entry:
141;CHECK-LABEL:  restore_or_imm:
142;CHECK:  or %o0, 20, %i0
143;CHECK:  jmp %i7+8
144;CHECK:  restore %g0, %g0, %g0
145  %0 = tail call i32 @bar(i32 %a) nounwind
146  %1 = or i32 %0, 20
147  ret i32 %1
148}
149
150
151define i32 @restore_sethi(i32 %a) {
152entry:
153;CHECK-LABEL: restore_sethi:
154;CHECK-NOT: sethi  3
155;CHECK: restore %g0, 3072, %o0
156  %0 = tail call i32 @bar(i32 %a) nounwind
157  %1 = icmp ne i32 %0, 0
158  %2 = select i1 %1, i32 3072, i32 0
159  ret i32 %2
160}
161
162define i32 @restore_sethi_3bit(i32 %a) {
163entry:
164;CHECK-LABEL: restore_sethi_3bit:
165;CHECK: sethi  6
166;CHECK-NOT: restore %g0, 6144, %o0
167  %0 = tail call i32 @bar(i32 %a) nounwind
168  %1 = icmp ne i32 %0, 0
169  %2 = select i1 %1, i32 6144, i32 0
170  ret i32 %2
171}
172
173define i32 @restore_sethi_large(i32 %a) {
174entry:
175;CHECK-LABEL: restore_sethi_large:
176;CHECK: sethi  4000, %i0
177;CHECK: restore %g0, %g0, %g0
178  %0 = tail call i32 @bar(i32 %a) nounwind
179  %1 = icmp ne i32 %0, 0
180  %2 = select i1 %1, i32 4096000, i32 0
181  ret i32 %2
182}
183
184