|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "cfi" |
2 | 2 | ; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
|
3 | 3 | ; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' %s -mtriple=x86_64-apple-darwin -o - | FileCheck %s --check-prefix OPT
|
4 | 4 |
|
@@ -184,3 +184,134 @@ return:
|
184 | 184 | %retval = phi ptr [ %ptr, %if.then ], [ %obj, %entry ]
|
185 | 185 | ret ptr %retval
|
186 | 186 | }
|
| 187 | + |
| 188 | +define ptr @memset_tailc(ptr %ret_val, i64 %sz) { |
| 189 | +; CHECK-LABEL: memset_tailc: |
| 190 | +; CHECK: ## %bb.0: ## %entry |
| 191 | +; CHECK: pushq %rbx |
| 192 | +; CHECK: movq %rdi, %rbx |
| 193 | +; CHECK: testq %rdi, %rdi |
| 194 | +; CHECK: je LBB4_2 |
| 195 | +; CHECK: ## %bb.1: ## %if.then |
| 196 | +; CHECK: movq %rsi, %rdx |
| 197 | +; CHECK: movq %rbx, %rdi |
| 198 | +; CHECK: xorl %esi, %esi |
| 199 | +; CHECK: callq _memset |
| 200 | +; CHECK: LBB4_2: ## %return |
| 201 | +; CHECK: movq %rbx, %rax |
| 202 | +; CHECK: popq %rbx |
| 203 | +; CHECK: retq |
| 204 | +entry: |
| 205 | + %cmp = icmp eq ptr %ret_val, null |
| 206 | + br i1 %cmp, label %return, label %if.then |
| 207 | + |
| 208 | +if.then: |
| 209 | + tail call void @llvm.memset.p0.i64(ptr nonnull align 1 %ret_val, i8 0, i64 %sz, i1 false) |
| 210 | + br label %return |
| 211 | + |
| 212 | +return: |
| 213 | + ret ptr %ret_val |
| 214 | +} |
| 215 | + |
| 216 | +define ptr @memcpy_tailc(ptr %ret_val, i64 %sz, ptr %src) { |
| 217 | +; CHECK-LABEL: memcpy_tailc: |
| 218 | +; CHECK: ## %bb.0: ## %entry |
| 219 | +; CHECK: pushq %rbx |
| 220 | +; CHECK: testq %rsi, %rsi |
| 221 | +; CHECK: je LBB5_1 |
| 222 | +; CHECK: ## %bb.2: ## %if.then |
| 223 | +; CHECK: movq %rsi, %rax |
| 224 | +; CHECK: movq %rdi, %rbx |
| 225 | +; CHECK: movq %rdx, %rsi |
| 226 | +; CHECK: movq %rax, %rdx |
| 227 | +; CHECK: callq _memcpy |
| 228 | +; CHECK: jmp LBB5_3 |
| 229 | +; CHECK: LBB5_1: |
| 230 | +; CHECK: movq %rdx, %rbx |
| 231 | +; CHECK: LBB5_3: ## %return |
| 232 | +; CHECK: movq %rbx, %rax |
| 233 | +; CHECK: popq %rbx |
| 234 | +; CHECK: retq |
| 235 | +entry: |
| 236 | + %cmp = icmp eq i64 %sz, 0 |
| 237 | + br i1 %cmp, label %return, label %if.then |
| 238 | + |
| 239 | +if.then: |
| 240 | + tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %ret_val, ptr align 1 %src, i64 %sz, i1 false) |
| 241 | + br label %return |
| 242 | + |
| 243 | +return: |
| 244 | + %phi = phi ptr [ %ret_val, %if.then ], [ %src, %entry ] |
| 245 | + ret ptr %phi |
| 246 | +} |
| 247 | + |
| 248 | +define ptr @strcpy_tailc(i64 %0, ptr %src) { |
| 249 | +; CHECK-LABEL: strcpy_tailc: |
| 250 | +; CHECK: ## %bb.0: ## %entry |
| 251 | +; CHECK: pushq %r14 |
| 252 | +; CHECK: pushq %rbx |
| 253 | +; CHECK: pushq %rax |
| 254 | +; CHECK: movq %rsi, %rbx |
| 255 | +; CHECK: movq %rdi, %r14 |
| 256 | +; CHECK: movl $20, %edi |
| 257 | +; CHECK: callq _malloc |
| 258 | +; CHECK: testq %r14, %r14 |
| 259 | +; CHECK: je LBB6_2 |
| 260 | +; CHECK: ## %bb.1: ## %if.then |
| 261 | +; CHECK: movq %rax, %rdi |
| 262 | +; CHECK: movq %rbx, %rsi |
| 263 | +; CHECK: movq %rax, %rbx |
| 264 | +; CHECK: callq _strcpy |
| 265 | +; CHECK: LBB6_2: ## %return |
| 266 | +; CHECK: movq %rbx, %rax |
| 267 | +; CHECK: addq $8, %rsp |
| 268 | +; CHECK: popq %rbx |
| 269 | +; CHECK: popq %r14 |
| 270 | +; CHECK: retq |
| 271 | +entry: |
| 272 | + %ret_val = tail call noalias dereferenceable_or_null(20) ptr @malloc(i64 20) |
| 273 | + %cmp = icmp eq i64 %0, 0 |
| 274 | + br i1 %cmp, label %return, label %if.then |
| 275 | + |
| 276 | +if.then: |
| 277 | + %rv_unused = tail call ptr @strcpy(ptr dereferenceable(1) %ret_val, ptr dereferenceable(1) %src) |
| 278 | + br label %return |
| 279 | + |
| 280 | +return: |
| 281 | + %phi = phi ptr [ %ret_val, %if.then ], [ %src, %entry ] |
| 282 | + ret ptr %phi |
| 283 | +} |
| 284 | + |
| 285 | +define ptr @memset_not_to_tailc(ptr %arg, i64 %sz, ptr %ret_val_1, ptr %ret_val_2) { |
| 286 | +; CHECK-LABEL: memset_not_to_tailc: |
| 287 | +; CHECK: ## %bb.0: ## %entry |
| 288 | +; CHECK: movq %rdx, %rax |
| 289 | +; CHECK: testq %rsi, %rsi |
| 290 | +; CHECK: je LBB7_2 |
| 291 | +; CHECK: ## %bb.1: ## %if.then |
| 292 | +; CHECK: pushq %rbx |
| 293 | +; CHECK: movq %rcx, %rbx |
| 294 | +; CHECK: movq %rsi, %rdx |
| 295 | +; CHECK: xorl %esi, %esi |
| 296 | +; CHECK: callq _memset |
| 297 | +; CHECK: movq %rbx, %rax |
| 298 | +; CHECK: popq %rbx |
| 299 | +; CHECK: LBB7_2: ## %return |
| 300 | +; CHECK: retq |
| 301 | +entry: |
| 302 | + %cmp = icmp eq i64 %sz, 0 |
| 303 | + br i1 %cmp, label %return, label %if.then |
| 304 | + |
| 305 | +if.then: |
| 306 | + tail call void @llvm.memset.p0.i64(ptr align 1 %arg, i8 0, i64 %sz, i1 false) |
| 307 | + br label %return |
| 308 | + |
| 309 | +return: |
| 310 | + %phi = phi ptr [ %ret_val_2, %if.then ], [ %ret_val_1, %entry ] |
| 311 | + ret ptr %phi |
| 312 | +} |
| 313 | + |
| 314 | +declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) |
| 315 | +declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) |
| 316 | +declare noalias ptr @malloc(i64) |
| 317 | +declare ptr @strcpy(ptr noalias returned writeonly, ptr noalias nocapture readonly) |
0 commit comments