| OLD | NEW |
| 1 ; RUN: opt %s -pnacl-sjlj-eh -O2 -S | FileCheck %s | 1 ; RUN: opt %s -pnacl-sjlj-eh -O2 -S | FileCheck %s |
| 2 | 2 |
| 3 ; datalayout must be specified for GVN to work. | 3 ; datalayout must be specified for GVN to work. |
| 4 target datalayout = "p:32:32:32" | 4 target datalayout = "p:32:32:32" |
| 5 | 5 |
| 6 ; This must be declared for expanding "invoke" and "landingpad" instructions. | 6 ; This must be declared for expanding "invoke" and "landingpad" instructions. |
| 7 @__pnacl_eh_stack = external thread_local global i8* | 7 @__pnacl_eh_stack = external thread_local global i8* |
| 8 | 8 |
| 9 declare i1 @might_be_setjmp() | 9 declare i1 @might_be_setjmp() |
| 10 declare void @external_func(i32* %ptr) | 10 declare void @external_func(i32* %ptr) |
| 11 declare void @var_is_nonzero() | 11 declare void @var_is_nonzero() |
| 12 | 12 |
| 13 | 13 |
| 14 ; Test for a bug in which PNaClSjLjEH would transform | 14 ; Test for a bug in which PNaClSjLjEH would transform |
| 15 ; @invoke_optimize_test() such that the call to @var_is_nonzero() | 15 ; @invoke_optimize_test() such that the call to @var_is_nonzero() |
| 16 ; could get optimized away by a later optimization pass. This | 16 ; could get optimized away by a later optimization pass. This |
| 17 ; happened because PNaClSjLjEH generated code similar to | 17 ; happened because PNaClSjLjEH generated code similar to |
| 18 ; @branch_optimize_test() below. | 18 ; @branch_optimize_test() below. |
| 19 | 19 |
| 20 define void @invoke_optimize_test() { | 20 define void @invoke_optimize_test() { |
| 21 %var = alloca i32 | 21 %var = alloca i32 |
| 22 store i32 0, i32* %var | 22 store i32 0, i32* %var |
| 23 | 23 |
| 24 invoke void @external_func(i32* %var) | 24 invoke void @external_func(i32* %var) |
| 25 to label %exit unwind label %lpad | 25 to label %exit unwind label %lpad |
| 26 | 26 |
| 27 lpad: | 27 lpad: |
| 28 landingpad i32 personality i8* null | 28 landingpad i32 personality i8* null |
| 29 catch i8* null | 29 catch i8* null |
| 30 %value = load i32* %var | 30 %value = load i32, i32* %var |
| 31 %is_zero = icmp eq i32 %value, 0 | 31 %is_zero = icmp eq i32 %value, 0 |
| 32 br i1 %is_zero, label %exit, label %do_call | 32 br i1 %is_zero, label %exit, label %do_call |
| 33 | 33 |
| 34 do_call: | 34 do_call: |
| 35 call void @var_is_nonzero() | 35 call void @var_is_nonzero() |
| 36 ret void | 36 ret void |
| 37 | 37 |
| 38 exit: | 38 exit: |
| 39 ret void | 39 ret void |
| 40 } | 40 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 59 store i32 0, i32* %var | 59 store i32 0, i32* %var |
| 60 | 60 |
| 61 %cond = call i1 @might_be_setjmp() returns_twice | 61 %cond = call i1 @might_be_setjmp() returns_twice |
| 62 br i1 %cond, label %iftrue, label %iffalse | 62 br i1 %cond, label %iftrue, label %iffalse |
| 63 | 63 |
| 64 iftrue: | 64 iftrue: |
| 65 call void @external_func(i32* %var) | 65 call void @external_func(i32* %var) |
| 66 ret void | 66 ret void |
| 67 | 67 |
| 68 iffalse: | 68 iffalse: |
| 69 %value = load i32* %var | 69 %value = load i32, i32* %var |
| 70 %is_zero = icmp eq i32 %value, 0 | 70 %is_zero = icmp eq i32 %value, 0 |
| 71 br i1 %is_zero, label %exit, label %do_call | 71 br i1 %is_zero, label %exit, label %do_call |
| 72 | 72 |
| 73 do_call: | 73 do_call: |
| 74 call void @var_is_nonzero() | 74 call void @var_is_nonzero() |
| 75 ret void | 75 ret void |
| 76 | 76 |
| 77 exit: | 77 exit: |
| 78 ret void | 78 ret void |
| 79 } | 79 } |
| 80 ; CHECK: define void @branch_optimize_test() | 80 ; CHECK: define void @branch_optimize_test() |
| 81 ; CHECK-NOT: @var_is_nonzero | 81 ; CHECK-NOT: @var_is_nonzero |
| OLD | NEW |