Mercurial > hg > CbC > CbC_llvm
comparison test/CodeGen/SystemZ/memcmp-nobuiltin.ll @ 120:1172e4bd9c6f
update 4.0.0
author | mir3636 |
---|---|
date | Fri, 25 Nov 2016 19:14:25 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
101:34baf5011add | 120:1172e4bd9c6f |
---|---|
1 ; Test that memcmp won't be converted to CLC if calls are | |
2 ; marked with nobuiltin, eg. for sanitizers. | |
3 ; | |
4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s | |
5 | |
6 declare signext i32 @memcmp(i8 *%src1, i8 *%src2, i64 %size) | |
7 | |
8 ; Zero-length comparisons should be optimized away. | |
9 define i32 @f1(i8 *%src1, i8 *%src2) { | |
10 ; CHECK-LABEL: f1: | |
11 ; CHECK-NOT: clc | |
12 ; CHECK: brasl %r14, memcmp | |
13 ; CHECK: br %r14 | |
14 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 0) nobuiltin | |
15 ret i32 %res | |
16 } | |
17 | |
18 ; Check a case where the result is used as an integer. | |
19 define i32 @f2(i8 *%src1, i8 *%src2) { | |
20 ; CHECK-LABEL: f2: | |
21 ; CHECK-NOT: clc | |
22 ; CHECK: brasl %r14, memcmp | |
23 ; CHECK: br %r14 | |
24 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 2) nobuiltin | |
25 ret i32 %res | |
26 } | |
27 | |
28 ; Check a case where the result is tested for equality. | |
29 define void @f3(i8 *%src1, i8 *%src2, i32 *%dest) { | |
30 ; CHECK-LABEL: f3: | |
31 ; CHECK-NOT: clc | |
32 ; CHECK: brasl %r14, memcmp | |
33 ; CHECK: br %r14 | |
34 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 3) nobuiltin | |
35 %cmp = icmp eq i32 %res, 0 | |
36 br i1 %cmp, label %exit, label %store | |
37 | |
38 store: | |
39 store i32 0, i32 *%dest | |
40 br label %exit | |
41 | |
42 exit: | |
43 ret void | |
44 } | |
45 | |
46 ; Check a case where the result is tested for inequality. | |
47 define void @f4(i8 *%src1, i8 *%src2, i32 *%dest) { | |
48 ; CHECK-LABEL: f4: | |
49 ; CHECK-NOT: clc | |
50 ; CHECK: brasl %r14, memcmp | |
51 ; CHECK: br %r14 | |
52 entry: | |
53 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 4) nobuiltin | |
54 %cmp = icmp ne i32 %res, 0 | |
55 br i1 %cmp, label %exit, label %store | |
56 | |
57 store: | |
58 store i32 0, i32 *%dest | |
59 br label %exit | |
60 | |
61 exit: | |
62 ret void | |
63 } | |
64 | |
65 ; Check a case where the result is tested via slt. | |
66 define void @f5(i8 *%src1, i8 *%src2, i32 *%dest) { | |
67 ; CHECK-LABEL: f5: | |
68 ; CHECK-NOT: clc | |
69 ; CHECK: brasl %r14, memcmp | |
70 ; CHECK: br %r14 | |
71 entry: | |
72 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 5) nobuiltin | |
73 %cmp = icmp slt i32 %res, 0 | |
74 br i1 %cmp, label %exit, label %store | |
75 | |
76 store: | |
77 store i32 0, i32 *%dest | |
78 br label %exit | |
79 | |
80 exit: | |
81 ret void | |
82 } | |
83 | |
84 ; Check a case where the result is tested for sgt. | |
85 define void @f6(i8 *%src1, i8 *%src2, i32 *%dest) { | |
86 ; CHECK-LABEL: f6: | |
87 ; CHECK-NOT: clc | |
88 ; CHECK: brasl %r14, memcmp | |
89 ; CHECK: br %r14 | |
90 entry: | |
91 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 6) nobuiltin | |
92 %cmp = icmp sgt i32 %res, 0 | |
93 br i1 %cmp, label %exit, label %store | |
94 | |
95 store: | |
96 store i32 0, i32 *%dest | |
97 br label %exit | |
98 | |
99 exit: | |
100 ret void | |
101 } | |
102 | |
103 ; Check the upper end of the CLC range. Here the result is used both as | |
104 ; an integer and for branching. | |
105 define i32 @f7(i8 *%src1, i8 *%src2, i32 *%dest) { | |
106 ; CHECK-LABEL: f7: | |
107 ; CHECK-NOT: clc | |
108 ; CHECK: brasl %r14, memcmp | |
109 ; CHECK: br %r14 | |
110 entry: | |
111 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 256) nobuiltin | |
112 %cmp = icmp slt i32 %res, 0 | |
113 br i1 %cmp, label %exit, label %store | |
114 | |
115 store: | |
116 store i32 0, i32 *%dest | |
117 br label %exit | |
118 | |
119 exit: | |
120 ret i32 %res | |
121 } | |
122 | |
123 ; 257 bytes needs two CLCs. | |
124 define i32 @f8(i8 *%src1, i8 *%src2) { | |
125 ; CHECK-LABEL: f8: | |
126 ; CHECK-NOT: clc | |
127 ; CHECK: brasl %r14, memcmp | |
128 ; CHECK: br %r14 | |
129 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 257) nobuiltin | |
130 ret i32 %res | |
131 } | |
132 | |
133 ; Test a comparison of 258 bytes in which the CC result can be used directly. | |
134 define void @f9(i8 *%src1, i8 *%src2, i32 *%dest) { | |
135 ; CHECK-LABEL: f9: | |
136 ; CHECK-NOT: clc | |
137 ; CHECK: brasl %r14, memcmp | |
138 ; CHECK: br %r14 | |
139 entry: | |
140 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 257) nobuiltin | |
141 %cmp = icmp slt i32 %res, 0 | |
142 br i1 %cmp, label %exit, label %store | |
143 | |
144 store: | |
145 store i32 0, i32 *%dest | |
146 br label %exit | |
147 | |
148 exit: | |
149 ret void | |
150 } | |
151 | |
152 ; Test the largest size that can use two CLCs. | |
153 define i32 @f10(i8 *%src1, i8 *%src2) { | |
154 ; CHECK-LABEL: f10: | |
155 ; CHECK-NOT: clc | |
156 ; CHECK: brasl %r14, memcmp | |
157 ; CHECK: br %r14 | |
158 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 512) nobuiltin | |
159 ret i32 %res | |
160 } | |
161 | |
162 ; Test the smallest size that needs 3 CLCs. | |
163 define i32 @f11(i8 *%src1, i8 *%src2) { | |
164 ; CHECK-LABEL: f11: | |
165 ; CHECK-NOT: clc | |
166 ; CHECK: brasl %r14, memcmp | |
167 ; CHECK: br %r14 | |
168 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 513) nobuiltin | |
169 ret i32 %res | |
170 } | |
171 | |
172 ; Test the largest size than can use 3 CLCs. | |
173 define i32 @f12(i8 *%src1, i8 *%src2) { | |
174 ; CHECK-LABEL: f12: | |
175 ; CHECK-NOT: clc | |
176 ; CHECK: brasl %r14, memcmp | |
177 ; CHECK: br %r14 | |
178 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 768) nobuiltin | |
179 ret i32 %res | |
180 } | |
181 | |
182 ; The next size up uses a loop instead. We leave the more complicated | |
183 ; loop tests to memcpy-01.ll, which shares the same form. | |
184 define i32 @f13(i8 *%src1, i8 *%src2) { | |
185 ; CHECK-LABEL: f13: | |
186 ; CHECK-NOT: clc | |
187 ; CHECK: brasl %r14, memcmp | |
188 ; CHECK: br %r14 | |
189 %res = call i32 @memcmp(i8 *%src1, i8 *%src2, i64 769) nobuiltin | |
190 ret i32 %res | |
191 } |