blob: 074098b990dc8def1e7525e024ddd78c001e52c6 [file] [log] [blame]
Reid Kleckner9f7c8612015-03-05 18:26:34 +00001; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
2
Reid Kleckner8f32e5f2015-07-07 22:25:32 +00003declare void @llvm.localescape(...)
4declare i8* @llvm.localrecover(i8*, i8*, i32)
Reid Kleckner9f7c8612015-03-05 18:26:34 +00005
6define internal void @f() {
7 %a = alloca i8
Reid Kleckner8f32e5f2015-07-07 22:25:32 +00008 call void (...) @llvm.localescape(i8* %a)
9 call void (...) @llvm.localescape(i8* %a)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000010 ret void
11}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000012; CHECK: multiple calls to llvm.localescape in one function
Reid Kleckner9f7c8612015-03-05 18:26:34 +000013
14define internal void @g() {
15entry:
16 %a = alloca i8
17 br label %not_entry
18not_entry:
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000019 call void (...) @llvm.localescape(i8* %a)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000020 ret void
21}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000022; CHECK: llvm.localescape used outside of entry block
Reid Kleckner9f7c8612015-03-05 18:26:34 +000023
24define internal void @h() {
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000025 call i8* @llvm.localrecover(i8* null, i8* null, i32 0)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000026 ret void
27}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000028; CHECK: llvm.localrecover first argument must be function defined in this module
Reid Kleckner9f7c8612015-03-05 18:26:34 +000029
30@global = constant i8 0
31
32declare void @declaration()
33
34define internal void @i() {
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000035 call i8* @llvm.localrecover(i8* @global, i8* null, i32 0)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000036 ret void
37}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000038; CHECK: llvm.localrecover first argument must be function defined in this module
Reid Kleckner9f7c8612015-03-05 18:26:34 +000039
40define internal void @j() {
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000041 call i8* @llvm.localrecover(i8* bitcast(void()* @declaration to i8*), i8* null, i32 0)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000042 ret void
43}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000044; CHECK: llvm.localrecover first argument must be function defined in this module
Reid Kleckner9f7c8612015-03-05 18:26:34 +000045
46define internal void @k(i32 %n) {
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000047 call i8* @llvm.localrecover(i8* bitcast(void()* @f to i8*), i8* null, i32 %n)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000048 ret void
49}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000050; CHECK: idx argument of llvm.localrecover must be a constant int
Reid Kleckner9f7c8612015-03-05 18:26:34 +000051
52define internal void @l(i8* %b) {
53 %a = alloca i8
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000054 call void (...) @llvm.localescape(i8* %a, i8* %b)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000055 ret void
56}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000057; CHECK: llvm.localescape only accepts static allocas
Reid Kleckner9f7c8612015-03-05 18:26:34 +000058
59define internal void @m() {
60 %a = alloca i8
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000061 call void (...) @llvm.localescape(i8* %a)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000062 ret void
63}
64
65define internal void @n(i8* %fp) {
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000066 call i8* @llvm.localrecover(i8* bitcast(void ()* @m to i8*), i8* %fp, i32 1)
Reid Kleckner9f7c8612015-03-05 18:26:34 +000067 ret void
68}
Reid Kleckner8f32e5f2015-07-07 22:25:32 +000069; CHECK: all indices passed to llvm.localrecover must be less than the number of arguments passed ot llvm.localescape in the parent function