Commit 886becb
authored
Add a new memcpy propagation pass (#7443)
## Description
For the Sway code in #7344, the IR after #7381 and after this PR is
shown here:
<details>
<summary> After #7381, before this PR </summary>
```
fn wrapper_1(__ret_value: __ptr { b256 }) -> (), !17 {
local { u64, ( () | { b256 } ) } __matched_value_4
local { u64, ( () | { b256 } ) } __ret_val
local { u64, ( () | { b256 } ) } self_
entry(__ret_value: __ptr { b256 }):
v0 = get_local __ptr { u64, ( () | { b256 } ) }, __ret_val
v1 = call return_option_5(v0)
v2 = get_local __ptr { u64, ( () | { b256 } ) }, self_, !20
mem_copy_val v2, v0
v3 = get_local __ptr { u64, ( () | { b256 } ) }, self_, !23
v4 = get_local __ptr { u64, ( () | { b256 } ) }, __matched_value_4, !25
mem_copy_val v4, v3
v5 = get_local __ptr { u64, ( () | { b256 } ) }, self_
v6 = const u64 0
v7 = get_elem_ptr v5, __ptr u64, v6
v8 = load v7, !20
v9 = const u64 1, !22
v10 = cmp eq v8 v9, !28
cbr v10, unwrap_2_block0(), unwrap_2_block1(), !29
unwrap_2_block0():
v11 = get_local __ptr { u64, ( () | { b256 } ) }, __matched_value_4, !30
v12 = const u64 1
v13 = const u64 1
v14 = get_elem_ptr v11, __ptr { b256 }, v12, v13, !20
mem_copy_val __ret_value, v14
v15 = const unit ()
ret () v15
unwrap_2_block1():
v16 = const u64 0, !31
revert v16, !36
}
fn return_option_5(__ret_value: __ptr { u64, ( () | { b256 } ) }) -> (), !39 {
local { u64, ( () | { b256 } ) } __anon_0
entry(__ret_value: __ptr { u64, ( () | { b256 } ) }):
v0 = get_local __ptr { u64, ( () | { b256 } ) }, __anon_0, !40
v1 = const u64 0
v2 = get_elem_ptr v0, __ptr u64, v1, !40
v3 = const u64 0, !40
store v3 to v2, !40
mem_copy_val __ret_value, v0
v4 = const unit ()
ret () v4
}
```
</details>
<details>
<summary> After this PR </summary>
```
fn wrapper_1(__ret_value: __ptr { b256 }) -> (), !17 {
local { u64, ( () | { b256 } ) } __matched_value_4
entry(__ret_value: __ptr { b256 }):
v0 = get_local __ptr { u64, ( () | { b256 } ) }, __matched_value_4
v1 = call return_option_5(v0)
v2 = get_local __ptr { u64, ( () | { b256 } ) }, __matched_value_4
v3 = const u64 0
v4 = get_elem_ptr v2, __ptr u64, v3
v5 = load v4, !20
v6 = const u64 1, !22
v7 = cmp eq v5 v6, !25
cbr v7, unwrap_2_block0(), unwrap_2_block1(), !26
unwrap_2_block0():
v8 = get_local __ptr { u64, ( () | { b256 } ) }, __matched_value_4, !27
v9 = const u64 1
v10 = const u64 1
v11 = get_elem_ptr v8, __ptr { b256 }, v9, v10, !20
mem_copy_val __ret_value, v11
v12 = const unit ()
ret () v12
unwrap_2_block1():
v13 = const u64 0, !28
revert v13, !33
}
fn return_option_5(__ret_value: __ptr { u64, ( () | { b256 } ) }) -> (), !36 {
entry(__ret_value: __ptr { u64, ( () | { b256 } ) }):
v0 = const u64 0
v1 = get_elem_ptr __ret_value, __ptr u64, v0, !37
v2 = const u64 0, !37
store v2 to v1, !37
v3 = const unit ()
ret () v3
}
```
</details>
`wrapper_1`, which had 3 `memcpy`s now has 1, and `return_option_5`
which had one, now has none.
Closes #7344.1 parent 6b26e50 commit 886becb
File tree
24 files changed
+830
-403
lines changed- sway-core/src
- sway-ir
- src
- analysis
- optimize
- tests
- memcpy_prop
- test/src
- e2e_vm_tests/test_programs/should_pass
- language
- attributes_deprecated
- configurable_consts
- configurable_dedup_decode
- panic_expression
- panicking_contract
- panicking_lib
- panicking_script
- u256/u256_abi
- require_contract_deployment
- array_of_structs_caller/src
- asset_ops_test/src
- call_basic_storage/src
- call_contract_with_type_aliases/src
- call_storage_enum/src
- nested_struct_args_caller/src
- storage_access_caller/src
- test_contracts/const_of_contract_call
- sdk-harness/test_projects/auth
24 files changed
+830
-403
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
61 | | - | |
62 | | - | |
| 61 | + | |
| 62 | + | |
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
| |||
1322 | 1322 | | |
1323 | 1323 | | |
1324 | 1324 | | |
| 1325 | + | |
1325 | 1326 | | |
1326 | 1327 | | |
1327 | 1328 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
222 | 222 | | |
223 | 223 | | |
224 | 224 | | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
225 | 253 | | |
226 | 254 | | |
227 | 255 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
76 | 81 | | |
77 | 82 | | |
78 | 83 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
219 | 219 | | |
220 | 220 | | |
221 | 221 | | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
222 | 229 | | |
223 | 230 | | |
224 | 231 | | |
| |||
0 commit comments