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 |