xref: /llvm-project/llvm/test/Instrumentation/AddressSanitizer/musttail.ll (revision 855fe35064674c4601ea9c659a015cacdcec9f63)
1; To test that asan does not break the musttail call contract.
2;
3; RUN: opt < %s -passes=asan -S | FileCheck %s
4
5define internal i32 @foo(ptr %p) sanitize_address {
6  %rv = load i32, ptr %p
7  ret i32 %rv
8}
9
10declare void @alloca_test_use(ptr)
11define i32 @call_foo(ptr %a) sanitize_address {
12  %x = alloca [10 x i8], align 1
13  call void @alloca_test_use(ptr %x)
14  %r = musttail call i32 @foo(ptr %a)
15  ret i32 %r
16}
17
18; CHECK-LABEL:  define i32 @call_foo(ptr %a)
19; CHECK:          %r = musttail call i32 @foo(ptr %a)
20; CHECK-NEXT:     ret i32 %r
21
22
23define i32 @call_foo_cast(ptr %a) sanitize_address {
24  %x = alloca [10 x i8], align 1
25  call void @alloca_test_use(ptr %x)
26  %r = musttail call i32 @foo(ptr %a)
27  %t = bitcast i32 %r to i32
28  ret i32 %t
29}
30
31; CHECK-LABEL:  define i32 @call_foo_cast(ptr %a)
32; CHECK:          %r = musttail call i32 @foo(ptr %a)
33; CHECK-NEXT:     %t = bitcast i32 %r to i32
34; CHECK-NEXT:     ret i32 %t
35