Skip to content

Commit 25e7e8d

Browse files
[CGP] Permit tail call optimization on undefined return value
We may freely allow tail call optzs on undef values as well. Fixes: #82387.
1 parent fde344a commit 25e7e8d

File tree

5 files changed

+66
-17
lines changed

5 files changed

+66
-17
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2686,8 +2686,9 @@ bool CodeGenPrepare::dupRetToEnableTailCallOpts(BasicBlock *BB,
26862686
attributesPermitTailCall(F, CI, RetI, *TLI)) {
26872687
// Either we return void or the return value must be the first
26882688
// argument of a known intrinsic or library function.
2689-
if (!V || (isIntrinsicOrLFToBeTailCalled(TLInfo, CI) &&
2690-
V == CI->getArgOperand(0))) {
2689+
if (!V || isa<UndefValue>(V) ||
2690+
(isIntrinsicOrLFToBeTailCalled(TLInfo, CI) &&
2691+
V == CI->getArgOperand(0))) {
26912692
TailCallBBs.push_back(Pred);
26922693
}
26932694
}

llvm/test/CodeGen/AArch64/addsub.ll

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -662,17 +662,13 @@ define dso_local i32 @_extract_crng_crng() {
662662
; CHECK-NEXT: cmn x8, #1272
663663
; CHECK-NEXT: b.pl .LBB36_3
664664
; CHECK-NEXT: .LBB36_2: // %if.then
665-
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
666-
; CHECK-NEXT: .cfi_def_cfa_offset 16
667-
; CHECK-NEXT: .cfi_offset w30, -16
668665
; CHECK-NEXT: adrp x8, primary_crng
669666
; CHECK-NEXT: ldr w8, [x8, :lo12:primary_crng]
670667
; CHECK-NEXT: cmp w8, #0
671668
; CHECK-NEXT: adrp x8, input_pool
672669
; CHECK-NEXT: add x8, x8, :lo12:input_pool
673670
; CHECK-NEXT: csel x0, xzr, x8, eq
674-
; CHECK-NEXT: bl crng_reseed
675-
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
671+
; CHECK-NEXT: b crng_reseed
676672
; CHECK-NEXT: .LBB36_3: // %if.end
677673
; CHECK-NEXT: ret
678674
entry:

llvm/test/CodeGen/AArch64/callbr-asm-obj-file.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ declare dso_local i32 @g(...) local_unnamed_addr
4040
declare dso_local i32 @i(...) local_unnamed_addr
4141

4242
; CHECK-LABEL: <test2>:
43-
; CHECK: bl {{.*}} <test2+0x18>
43+
; CHECK: b {{.*}} <test2+0x1c>
4444
; CHECK-LABEL: <$d.5>:
4545
; CHECK-LABEL: <$x.6>:
4646
; CHECK-NEXT: b {{.*}} <test2+0x18>

llvm/test/CodeGen/RISCV/pr51206.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,12 @@ define signext i32 @wobble() nounwind {
2727
; CHECK-NEXT: lui a2, %hi(global.3)
2828
; CHECK-NEXT: li a3, 5
2929
; CHECK-NEXT: sw a1, %lo(global.3)(a2)
30-
; CHECK-NEXT: bltu a0, a3, .LBB0_2
31-
; CHECK-NEXT: # %bb.1: # %bb10
32-
; CHECK-NEXT: addi sp, sp, -16
33-
; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
34-
; CHECK-NEXT: call quux
35-
; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
36-
; CHECK-NEXT: addi sp, sp, 16
37-
; CHECK-NEXT: .LBB0_2: # %bb12
30+
; CHECK-NEXT: bgeu a0, a3, .LBB0_2
31+
; CHECK-NEXT: # %bb.1: # %bb12
3832
; CHECK-NEXT: li a0, 0
3933
; CHECK-NEXT: ret
34+
; CHECK-NEXT: .LBB0_2: # %bb10
35+
; CHECK-NEXT: tail quux
4036
bb:
4137
%tmp = load i8, ptr @global, align 1
4238
%tmp1 = zext i8 %tmp to i32

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

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ return:
339339

340340
define ptr @strcpy_illegal_tailc(ptr %dest, i64 %sz, ptr readonly returned %src) nounwind {
341341
; CHECK-LABEL: strcpy_illegal_tailc:
342-
; CHECK: ## %bb.0:
342+
; CHECK: ## %bb.0: ## %entry
343343
; CHECK-NEXT: pushq %rbx
344344
; CHECK-NEXT: movq %rdx, %rbx
345345
; CHECK-NEXT: testq %rsi, %rsi
@@ -351,6 +351,7 @@ define ptr @strcpy_illegal_tailc(ptr %dest, i64 %sz, ptr readonly returned %src)
351351
; CHECK-NEXT: movq %rbx, %rax
352352
; CHECK-NEXT: popq %rbx
353353
; CHECK-NEXT: retq
354+
entry:
354355
%cmp = icmp eq i64 %sz, 0
355356
br i1 %cmp, label %return, label %if.then
356357

@@ -362,8 +363,63 @@ return:
362363
ret ptr %src
363364
}
364365

366+
@i = global i32 0, align 4
367+
368+
define i32 @undef_tailc() nounwind {
369+
; CHECK-LABEL: undef_tailc:
370+
; CHECK: ## %bb.0: ## %entry
371+
; CHECK-NEXT: cmpl $0, _i(%rip)
372+
; CHECK-NEXT: jne _qux ## TAILCALL
373+
; CHECK-NEXT: ## %bb.1: ## %return
374+
; CHECK-NEXT: retq
375+
entry:
376+
%val = load i32, ptr @i, align 4
377+
%cmp = icmp eq i32 %val, 0
378+
br i1 %cmp, label %return, label %if.then
379+
380+
if.then:
381+
%rv_unused = tail call i32 @qux()
382+
br label %return
383+
384+
return:
385+
ret i32 undef
386+
}
387+
388+
define i32 @undef_and_known_tailc() nounwind {
389+
; CHECK-LABEL: undef_and_known_tailc:
390+
; CHECK: ## %bb.0: ## %entry
391+
; CHECK-NEXT: movl _i(%rip), %eax
392+
; CHECK-NEXT: cmpl $5, %eax
393+
; CHECK-NEXT: je _qux ## TAILCALL
394+
; CHECK-NEXT: ## %bb.1: ## %entry
395+
; CHECK-NEXT: cmpl $2, %eax
396+
; CHECK-NEXT: je _quux ## TAILCALL
397+
; CHECK-NEXT: ## %bb.2: ## %return
398+
; CHECK-NEXT: retq
399+
entry:
400+
%val = load i32, ptr @i, align 4
401+
switch i32 %val, label %return [
402+
i32 2, label %case_2
403+
i32 5, label %case_5
404+
]
405+
406+
case_2:
407+
%rv_unused = tail call i32 @quux()
408+
br label %return
409+
410+
case_5:
411+
%rv = tail call i32 @qux()
412+
br label %return
413+
414+
return:
415+
%phi = phi i32 [ undef, %case_2 ], [ %rv, %case_5 ], [ undef, %entry ]
416+
ret i32 %phi
417+
}
418+
365419
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1)
366420
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1)
367421
declare noalias ptr @malloc(i64)
368422
declare ptr @strcpy(ptr noalias returned writeonly, ptr noalias nocapture readonly)
369423
declare ptr @baz(ptr, ptr)
424+
declare i32 @qux()
425+
declare i32 @quux()

0 commit comments

Comments
 (0)