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