Chromium Code Reviews| 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 |