Skip to content

Commit b6486db

Browse files
authored
Merge pull request ethereum#15656 from ethereum/ssacfg_liveness_cjump
SSACFG liveness: add conditional jump values to live set
2 parents 2fe4769 + 81f410f commit b6486db

File tree

9 files changed

+146
-77
lines changed

9 files changed

+146
-77
lines changed

libyul/backends/evm/SSACFGLiveness.cpp

+19-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include <libyul/backends/evm/SSACFGLiveness.h>
2020

21+
#include <libsolutil/Visitor.h>
22+
2123
#include <range/v3/range/conversion.hpp>
2224
#include <range/v3/view/filter.hpp>
2325
#include <range/v3/view/reverse.hpp>
@@ -87,9 +89,23 @@ void SSACFGLiveness::runDagDfs()
8789
if (!m_topologicalSort.backEdge(blockId, _successor))
8890
live += m_liveIns[_successor.value] - m_cfg.block(_successor).phis;
8991
});
90-
if (std::holds_alternative<SSACFG::BasicBlock::FunctionReturn>(block.exit))
91-
live += std::get<SSACFG::BasicBlock::FunctionReturn>(block.exit).returnValues
92-
| ranges::views::filter(literalsFilter(m_cfg));
92+
util::GenericVisitor exitVisitor {
93+
[](SSACFG::BasicBlock::MainExit const&) {},
94+
[&](SSACFG::BasicBlock::FunctionReturn const& _functionReturn) {
95+
live += _functionReturn.returnValues | ranges::views::filter(literalsFilter(m_cfg));
96+
},
97+
[&](SSACFG::BasicBlock::JumpTable const& _jt) {
98+
if (literalsFilter(m_cfg)(_jt.value))
99+
live.emplace(_jt.value);
100+
},
101+
[](SSACFG::BasicBlock::Jump const&) {},
102+
[&](SSACFG::BasicBlock::ConditionalJump const& _conditionalJump) {
103+
if (literalsFilter(m_cfg)(_conditionalJump.condition))
104+
live.emplace(_conditionalJump.condition);
105+
},
106+
[](SSACFG::BasicBlock::Terminated const&) {}
107+
};
108+
std::visit(exitVisitor, block.exit);
93109

94110
// clean out unreachables
95111
live = live | ranges::views::filter([&](auto const& valueId) { return !std::holds_alternative<SSACFG::UnreachableValue>(m_cfg.valueInfo(valueId)); }) | ranges::to<std::set>;

test/cmdlineTests/standard_yul_cfg_json_export/output.json

+47-23
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@
4545
"liveness": {
4646
"in": [],
4747
"out": [
48-
"v0"
48+
"v0",
49+
"v2"
4950
]
5051
},
5152
"type": "BuiltinCall"
@@ -188,7 +189,8 @@
188189
"liveness": {
189190
"in": [],
190191
"out": [
191-
"v0"
192+
"v0",
193+
"v5"
192194
]
193195
},
194196
"type": "BuiltinCall"
@@ -260,7 +262,8 @@
260262
"v0"
261263
],
262264
"out": [
263-
"v0"
265+
"v0",
266+
"v11"
264267
]
265268
},
266269
"type": "BuiltinCall"
@@ -303,7 +306,8 @@
303306
"v0"
304307
],
305308
"out": [
306-
"v0"
309+
"v0",
310+
"v12"
307311
]
308312
},
309313
"type": "BuiltinCall"
@@ -361,7 +365,8 @@
361365
"v0"
362366
],
363367
"out": [
364-
"v0"
368+
"v0",
369+
"v17"
365370
]
366371
},
367372
"type": "BuiltinCall"
@@ -492,7 +497,8 @@
492497
"liveness": {
493498
"in": [],
494499
"out": [
495-
"v0"
500+
"v0",
501+
"v2"
496502
]
497503
},
498504
"type": "BuiltinCall"
@@ -635,7 +641,8 @@
635641
"liveness": {
636642
"in": [],
637643
"out": [
638-
"v0"
644+
"v0",
645+
"v5"
639646
]
640647
},
641648
"type": "BuiltinCall"
@@ -707,7 +714,8 @@
707714
"v0"
708715
],
709716
"out": [
710-
"v0"
717+
"v0",
718+
"v11"
711719
]
712720
},
713721
"type": "BuiltinCall"
@@ -750,7 +758,8 @@
750758
"v0"
751759
],
752760
"out": [
753-
"v0"
761+
"v0",
762+
"v12"
754763
]
755764
},
756765
"type": "BuiltinCall"
@@ -808,7 +817,8 @@
808817
"v0"
809818
],
810819
"out": [
811-
"v0"
820+
"v0",
821+
"v17"
812822
]
813823
},
814824
"type": "BuiltinCall"
@@ -903,7 +913,8 @@
903913
"out": [
904914
"v0",
905915
"v18",
906-
"v24"
916+
"v24",
917+
"v28"
907918
]
908919
},
909920
"type": "BuiltinCall"
@@ -997,7 +1008,8 @@
9971008
"v24"
9981009
],
9991010
"out": [
1000-
"v41"
1011+
"v41",
1012+
"v42"
10011013
]
10021014
},
10031015
"type": "BuiltinCall"
@@ -1153,7 +1165,9 @@
11531165
"v41"
11541166
],
11551167
"out": [
1156-
"v46"
1168+
"v46",
1169+
"v59",
1170+
"v60"
11571171
]
11581172
},
11591173
"type": "BuiltinCall"
@@ -1224,10 +1238,12 @@
12241238
"instructions": [],
12251239
"liveness": {
12261240
"in": [
1227-
"v46"
1241+
"v46",
1242+
"v59"
12281243
],
12291244
"out": [
1230-
"v46"
1245+
"v46",
1246+
"v59"
12311247
]
12321248
}
12331249
},
@@ -1372,7 +1388,8 @@
13721388
"v46"
13731389
],
13741390
"out": [
1375-
"v46"
1391+
"v46",
1392+
"v67"
13761393
]
13771394
},
13781395
"type": "BuiltinCall"
@@ -1480,7 +1497,8 @@
14801497
"out": [
14811498
"v46",
14821499
"v71",
1483-
"v77"
1500+
"v77",
1501+
"v80"
14841502
]
14851503
},
14861504
"type": "BuiltinCall"
@@ -1570,7 +1588,8 @@
15701588
"v77"
15711589
],
15721590
"out": [
1573-
"v46"
1591+
"v46",
1592+
"v90"
15741593
]
15751594
},
15761595
"type": "BuiltinCall"
@@ -1718,7 +1737,8 @@
17181737
"liveness": {
17191738
"in": [],
17201739
"out": [
1721-
"v0"
1740+
"v0",
1741+
"v2"
17221742
]
17231743
},
17241744
"type": "BuiltinCall"
@@ -1861,7 +1881,8 @@
18611881
"liveness": {
18621882
"in": [],
18631883
"out": [
1864-
"v0"
1884+
"v0",
1885+
"v5"
18651886
]
18661887
},
18671888
"type": "BuiltinCall"
@@ -1933,7 +1954,8 @@
19331954
"v0"
19341955
],
19351956
"out": [
1936-
"v0"
1957+
"v0",
1958+
"v11"
19371959
]
19381960
},
19391961
"type": "BuiltinCall"
@@ -1976,7 +1998,8 @@
19761998
"v0"
19771999
],
19782000
"out": [
1979-
"v0"
2001+
"v0",
2002+
"v12"
19802003
]
19812004
},
19822005
"type": "BuiltinCall"
@@ -2034,7 +2057,8 @@
20342057
"v0"
20352058
],
20362059
"out": [
2037-
"v0"
2060+
"v0",
2061+
"v17"
20382062
]
20392063
},
20402064
"type": "BuiltinCall"

test/cmdlineTests/strict_asm_yul_cfg_json_export/output

+10-5
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ Yul Control Flow Graph:
4545
"liveness": {
4646
"in": [],
4747
"out": [
48-
"v0"
48+
"v0",
49+
"v2"
4950
]
5051
},
5152
"type": "BuiltinCall"
@@ -188,7 +189,8 @@ Yul Control Flow Graph:
188189
"liveness": {
189190
"in": [],
190191
"out": [
191-
"v0"
192+
"v0",
193+
"v5"
192194
]
193195
},
194196
"type": "BuiltinCall"
@@ -260,7 +262,8 @@ Yul Control Flow Graph:
260262
"v0"
261263
],
262264
"out": [
263-
"v0"
265+
"v0",
266+
"v11"
264267
]
265268
},
266269
"type": "BuiltinCall"
@@ -303,7 +306,8 @@ Yul Control Flow Graph:
303306
"v0"
304307
],
305308
"out": [
306-
"v0"
309+
"v0",
310+
"v12"
307311
]
308312
},
309313
"type": "BuiltinCall"
@@ -361,7 +365,8 @@ Yul Control Flow Graph:
361365
"v0"
362366
],
363367
"out": [
364-
"v0"
368+
"v0",
369+
"v17"
365370
]
366371
},
367372
"type": "BuiltinCall"

0 commit comments

Comments
 (0)