Skip to content

Commit 225ccca

Browse files
[CGP] Precommit tests for PR76613 (NFC)
1 parent 7ff2dc3 commit 225ccca

File tree

1 file changed

+132
-1
lines changed

1 file changed

+132
-1
lines changed

llvm/test/CodeGen/X86/tailcall-cgp-dup.ll

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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"
22
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
33
; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' %s -mtriple=x86_64-apple-darwin -o - | FileCheck %s --check-prefix OPT
44

@@ -184,3 +184,134 @@ return:
184184
%retval = phi ptr [ %ptr, %if.then ], [ %obj, %entry ]
185185
ret ptr %retval
186186
}
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

Comments
 (0)