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) { |
| 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 |