Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 1 | ; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s |
| 2 | |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 3 | declare void @llvm.localescape(...) |
| 4 | declare i8* @llvm.localrecover(i8*, i8*, i32) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 5 | |
| 6 | define internal void @f() { |
| 7 | %a = alloca i8 |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 8 | call void (...) @llvm.localescape(i8* %a) |
| 9 | call void (...) @llvm.localescape(i8* %a) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 10 | ret void |
| 11 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 12 | ; CHECK: multiple calls to llvm.localescape in one function |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 13 | |
| 14 | define internal void @g() { |
| 15 | entry: |
| 16 | %a = alloca i8 |
| 17 | br label %not_entry |
| 18 | not_entry: |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 19 | call void (...) @llvm.localescape(i8* %a) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 20 | ret void |
| 21 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 22 | ; CHECK: llvm.localescape used outside of entry block |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 23 | |
| 24 | define internal void @h() { |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 25 | call i8* @llvm.localrecover(i8* null, i8* null, i32 0) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 26 | ret void |
| 27 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 28 | ; CHECK: llvm.localrecover first argument must be function defined in this module |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 29 | |
| 30 | @global = constant i8 0 |
| 31 | |
| 32 | declare void @declaration() |
| 33 | |
| 34 | define internal void @i() { |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 35 | call i8* @llvm.localrecover(i8* @global, i8* null, i32 0) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 36 | ret void |
| 37 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 38 | ; CHECK: llvm.localrecover first argument must be function defined in this module |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 39 | |
| 40 | define internal void @j() { |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 41 | call i8* @llvm.localrecover(i8* bitcast(void()* @declaration to i8*), i8* null, i32 0) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 42 | ret void |
| 43 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 44 | ; CHECK: llvm.localrecover first argument must be function defined in this module |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 45 | |
| 46 | define internal void @k(i32 %n) { |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 47 | call i8* @llvm.localrecover(i8* bitcast(void()* @f to i8*), i8* null, i32 %n) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 48 | ret void |
| 49 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 50 | ; CHECK: idx argument of llvm.localrecover must be a constant int |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 51 | |
| 52 | define internal void @l(i8* %b) { |
| 53 | %a = alloca i8 |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 54 | call void (...) @llvm.localescape(i8* %a, i8* %b) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 55 | ret void |
| 56 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 57 | ; CHECK: llvm.localescape only accepts static allocas |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 58 | |
| 59 | define internal void @m() { |
| 60 | %a = alloca i8 |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 61 | call void (...) @llvm.localescape(i8* %a) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 62 | ret void |
| 63 | } |
| 64 | |
| 65 | define internal void @n(i8* %fp) { |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 66 | call i8* @llvm.localrecover(i8* bitcast(void ()* @m to i8*), i8* %fp, i32 1) |
Reid Kleckner | 9f7c861 | 2015-03-05 18:26:34 +0000 | [diff] [blame] | 67 | ret void |
| 68 | } |
Reid Kleckner | 8f32e5f | 2015-07-07 22:25:32 +0000 | [diff] [blame] | 69 | ; CHECK: all indices passed to llvm.localrecover must be less than the number of arguments passed ot llvm.localescape in the parent function |