xref: /aosp_15_r20/external/llvm/test/Transforms/Inline/byval-tail-call.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -tailcallelim -inline -instcombine -dse -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; PR7272
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Calls that capture byval parameters cannot be marked as tail calls. Other
5*9880d681SAndroid Build Coastguard Worker; tails that don't capture byval parameters can still be tail calls.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
8*9880d681SAndroid Build Coastguard Workertarget triple = "i386-pc-linux-gnu"
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdeclare void @ext(i32*)
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine void @bar(i32* byval %x) {
13*9880d681SAndroid Build Coastguard Worker  call void @ext(i32* %x)
14*9880d681SAndroid Build Coastguard Worker  ret void
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine void @foo(i32* %x) {
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @foo(
19*9880d681SAndroid Build Coastguard Worker; CHECK: llvm.lifetime.start
20*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %2, i32* %x
21*9880d681SAndroid Build Coastguard Worker  call void @bar(i32* byval %x)
22*9880d681SAndroid Build Coastguard Worker  ret void
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine internal void @qux(i32* byval %x) {
26*9880d681SAndroid Build Coastguard Worker  call void @ext(i32* %x)
27*9880d681SAndroid Build Coastguard Worker  tail call void @ext(i32* null)
28*9880d681SAndroid Build Coastguard Worker  ret void
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine void @frob(i32* %x) {
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @frob(
33*9880d681SAndroid Build Coastguard Worker; CHECK: %[[POS:.*]] = alloca i32
34*9880d681SAndroid Build Coastguard Worker; CHECK: %[[VAL:.*]] = load i32, i32* %x
35*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %[[VAL]], i32* %[[POS]]
36*9880d681SAndroid Build Coastguard Worker; CHECK: {{^ *}}call void @ext(i32* nonnull %[[POS]]
37*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @ext(i32* null)
38*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
39*9880d681SAndroid Build Coastguard Worker  tail call void @qux(i32* byval %x)
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42