OLD | NEW |
---|---|
(Empty) | |
1 ; RUN: opt < %s -rewrite-pnacl-library-calls -S | FileCheck %s | |
2 ; Test the RewritePNaClLibraryCalls pass | |
3 | |
4 declare i32 @setjmp(i64*) | |
5 declare void @longjmp(i64*, i32) | |
6 | |
7 ; Since the address of longjmp is being taken here, a body is generated | |
8 ; for it, which does a cast and calls an intrinsic | |
9 | |
10 ; CHECK: define internal void @longjmp(i64* %env, i32 %val) { | |
11 ; CHECK: entry: | |
12 ; CHECK: %jmp_buf_i8 = bitcast i64* %env to i8* | |
13 ; CHECK: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %val) | |
14 ; CHECK: unreachable | |
15 ; CHECK: } | |
16 | |
17 define i32 @call_setjmp(i64* %arg) { | |
18 ; CHECK-NOT: call i32 @setjmp | |
19 ; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8* | |
20 ; CHECK-NEXT: %val = call i32 @llvm.nacl.setjmp(i8* %jmp_buf_i8) | |
21 %val = call i32 @setjmp(i64* %arg) | |
22 ret i32 %val | |
23 } | |
24 | |
25 define void @call_longjmp(i64* %arg, i32 %num) { | |
Mark Seaborn
2013/05/13 23:39:58
Seems to duplicate @call_longjmp() in rewrite-long
eliben
2013/05/14 17:38:58
rewrite-longjmp-no-store.ll is targeted specifical
| |
26 ; CHECK-NOT: call void @longjmp | |
27 ; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8* | |
28 ; CHECK-NEXT: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %num) | |
29 call void @longjmp(i64* %arg, i32 %num) | |
30 ret void | |
31 } | |
32 | |
33 define i32 @takeaddr_longjmp(i64* %arg, i32 %num) { | |
34 %fp = alloca void (i64*, i32)*, align 8 | |
35 ; CHECK: store void (i64*, i32)* @longjmp, void (i64*, i32)** %fp | |
36 store void (i64*, i32)* @longjmp, void (i64*, i32)** %fp, align 8 | |
37 ret i32 7 | |
38 } | |
39 | |
40 ; A more complex example with a number of calls in several BBs | |
41 define void @multiple_calls(i64* %arg, i32 %num) { | |
42 entryblock: | |
43 ; CHECK: entryblock | |
44 ; CHECK: bitcast | |
45 ; CHECK-NEXT: call void @llvm.nacl.longjmp | |
46 call void @longjmp(i64* %arg, i32 %num) | |
47 br label %block1 | |
48 block1: | |
49 ; CHECK: block1 | |
50 ; CHECK: bitcast | |
51 ; CHECK-NEXT: call void @llvm.nacl.longjmp | |
52 call void @longjmp(i64* %arg, i32 %num) | |
53 ; CHECK: call i32 @llvm.nacl.setjmp | |
54 %val = call i32 @setjmp(i64* %arg) | |
55 %num2 = add i32 %val, %num | |
56 ; CHECK: bitcast | |
57 ; CHECK-NEXT: call void @llvm.nacl.longjmp | |
58 call void @longjmp(i64* %arg, i32 %num2) | |
59 br label %exitblock | |
60 exitblock: | |
61 %num3 = add i32 %num, %num | |
62 call void @longjmp(i64* %arg, i32 %num3) | |
63 %num4 = add i32 %num, %num3 | |
64 ; CHECK: bitcast | |
65 ; CHECK-NEXT: call void @llvm.nacl.longjmp | |
66 call void @longjmp(i64* %arg, i32 %num4) | |
67 ret void | |
68 } | |
69 | |
70 ; CHECK: declare i32 @llvm.nacl.setjmp(i8*) | |
71 ; CHECK: declare void @llvm.nacl.longjmp(i8*, i32) | |
72 | |
OLD | NEW |