|
9 | 9 | ;; CHECK: (type $struct-mut (struct (field (mut i32)))) |
10 | 10 | (type $struct-mut (struct (mut i32))) |
11 | 11 |
|
12 | | - ;; CHECK: (func $propagate (type $2) |
| 12 | + ;; CHECK: (type $array-mut (array (mut i32))) |
| 13 | + |
| 14 | + ;; CHECK: (type $array-imm (array i32)) |
| 15 | + (type $array-imm (array i32)) |
| 16 | + |
| 17 | + (type $array-mut (array (mut i32))) |
| 18 | + |
| 19 | + ;; CHECK: (func $propagate-struct (type $2) |
13 | 20 | ;; CHECK-NEXT: (local $ref-imm (ref null $struct-imm)) |
14 | 21 | ;; CHECK-NEXT: (local $ref-mut (ref null $struct-mut)) |
15 | 22 | ;; CHECK-NEXT: (local.set $ref-imm |
|
31 | 38 | ;; CHECK-NEXT: ) |
32 | 39 | ;; CHECK-NEXT: ) |
33 | 40 | ;; CHECK-NEXT: ) |
34 | | - (func $propagate |
| 41 | + (func $propagate-struct |
35 | 42 | (local $ref-imm (ref null $struct-imm)) |
36 | 43 | (local $ref-mut (ref null $struct-mut)) |
37 | 44 | ;; We can propagate from an immutable field of a struct created in this |
|
59 | 66 | ) |
60 | 67 | ) |
61 | 68 |
|
| 69 | + ;; CHECK: (func $propagate-array (type $2) |
| 70 | + ;; CHECK-NEXT: (local $ref-imm (ref null $array-imm)) |
| 71 | + ;; CHECK-NEXT: (local $ref-mut (ref null $array-mut)) |
| 72 | + ;; CHECK-NEXT: (local.set $ref-imm |
| 73 | + ;; CHECK-NEXT: (array.new_fixed $array-imm 3 |
| 74 | + ;; CHECK-NEXT: (i32.const 10) |
| 75 | + ;; CHECK-NEXT: (i32.const 20) |
| 76 | + ;; CHECK-NEXT: (i32.const 30) |
| 77 | + ;; CHECK-NEXT: ) |
| 78 | + ;; CHECK-NEXT: ) |
| 79 | + ;; CHECK-NEXT: (call $helper |
| 80 | + ;; CHECK-NEXT: (i32.const 30) |
| 81 | + ;; CHECK-NEXT: ) |
| 82 | + ;; CHECK-NEXT: (call $helper |
| 83 | + ;; CHECK-NEXT: (i32.const 3) |
| 84 | + ;; CHECK-NEXT: ) |
| 85 | + ;; CHECK-NEXT: (local.set $ref-mut |
| 86 | + ;; CHECK-NEXT: (array.new_fixed $array-mut 3 |
| 87 | + ;; CHECK-NEXT: (i32.const 10) |
| 88 | + ;; CHECK-NEXT: (i32.const 20) |
| 89 | + ;; CHECK-NEXT: (i32.const 30) |
| 90 | + ;; CHECK-NEXT: ) |
| 91 | + ;; CHECK-NEXT: ) |
| 92 | + ;; CHECK-NEXT: (call $helper |
| 93 | + ;; CHECK-NEXT: (array.get $array-mut |
| 94 | + ;; CHECK-NEXT: (local.get $ref-mut) |
| 95 | + ;; CHECK-NEXT: (i32.const 2) |
| 96 | + ;; CHECK-NEXT: ) |
| 97 | + ;; CHECK-NEXT: ) |
| 98 | + ;; CHECK-NEXT: (call $helper |
| 99 | + ;; CHECK-NEXT: (i32.const 3) |
| 100 | + ;; CHECK-NEXT: ) |
| 101 | + ;; CHECK-NEXT: ) |
| 102 | + (func $propagate-array |
| 103 | + (local $ref-imm (ref null $array-imm)) |
| 104 | + (local $ref-mut (ref null $array-mut)) |
| 105 | + ;; We can propagate from a slot in an immutable array created in this |
| 106 | + ;; function, and also get the length. |
| 107 | + (local.set $ref-imm |
| 108 | + (array.new_fixed $array-imm 3 |
| 109 | + (i32.const 10) |
| 110 | + (i32.const 20) |
| 111 | + (i32.const 30) |
| 112 | + ) |
| 113 | + ) |
| 114 | + (call $helper |
| 115 | + (array.get $array-imm ;; this returns 30 |
| 116 | + (local.get $ref-imm) |
| 117 | + (i32.const 2) |
| 118 | + ) |
| 119 | + ) |
| 120 | + (call $helper |
| 121 | + (array.len ;; this returns 3 |
| 122 | + (local.get $ref-imm) |
| 123 | + ) |
| 124 | + ) |
| 125 | + ;; But the same thing on a mutable array fails. |
| 126 | + (local.set $ref-mut |
| 127 | + (array.new_fixed $array-mut 3 |
| 128 | + (i32.const 10) |
| 129 | + (i32.const 20) |
| 130 | + (i32.const 30) |
| 131 | + ) |
| 132 | + ) |
| 133 | + (call $helper |
| 134 | + (array.get $array-mut |
| 135 | + (local.get $ref-mut) |
| 136 | + (i32.const 2) |
| 137 | + ) |
| 138 | + ) |
| 139 | + ;; We can, however, optimize array.len in both cases as that is an |
| 140 | + ;; immutable property. |
| 141 | + (call $helper |
| 142 | + (array.len ;; this returns 3 |
| 143 | + (local.get $ref-mut) |
| 144 | + ) |
| 145 | + ) |
| 146 | + ) |
| 147 | + |
62 | 148 | ;; CHECK: (func $non-constant (type $1) (param $param i32) |
63 | 149 | ;; CHECK-NEXT: (local $ref (ref null $struct-imm)) |
64 | 150 | ;; CHECK-NEXT: (local.set $ref |
|
118 | 204 | ) |
119 | 205 | ) |
120 | 206 |
|
121 | | - ;; CHECK: (func $param (type $4) (param $ref-imm (ref null $struct-imm)) |
| 207 | + ;; CHECK: (func $param (type $6) (param $ref-imm (ref null $struct-imm)) |
122 | 208 | ;; CHECK-NEXT: (call $helper |
123 | 209 | ;; CHECK-NEXT: (struct.get $struct-imm 0 |
124 | 210 | ;; CHECK-NEXT: (local.get $ref-imm) |
|
0 commit comments