Skip to content

Commit 6a6876a

Browse files
authored
[spec] Fix state for expression evaluation (#2078)
1 parent 20aba52 commit 6a6876a

11 files changed

Lines changed: 342 additions & 125 deletions

File tree

document/core/exec/modules.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,14 @@ $${definition: instantiate}
182182

183183
where:
184184

185+
.. _eval-exprs:
186+
187+
$${definition-prose: evalexprs}
188+
189+
$${definition: evalexprs}
190+
191+
and:
192+
185193
.. _eval-globals:
186194

187195
$${definition-prose: evalglobals}

specification/wasm-3.0/4.4-execution.modules.spectec

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -157,17 +157,31 @@ def $runelem_(x, ELEM rt e^n (ACTIVE y instr*)) =
157157
instr* (CONST I32 0) (CONST I32 n) (TABLE.INIT y x) (ELEM.DROP x)
158158

159159
;; TODO(2, rossberg): replace with something more uniform
160-
def $evalglobals(state, globaltype*, expr*) : (state, val*) hint(show $evalglobal*#((%,%,%)))
160+
def $evalexprs(state, expr*) : (state, ref*) hint(show $evalexpr*#((%,%))) hint(macro none)
161+
def $evalexprs(z, eps) = (z, eps)
162+
def $evalexprs(z, expr expr'*) = (z'', ref ref'*)
163+
----
164+
-- Eval_expr: z; expr ~>* z'; ref
165+
-- if (z'', ref'*) = $evalexprs(z', expr'*)
166+
167+
def $evalexprss(state, expr**) : (state, ref**) hint(show $evalexpr**#((%,%))) hint(macro none)
168+
def $evalexprss(z, eps) = (z, eps)
169+
def $evalexprss(z, expr* expr'**) = (z'', ref* ref'**)
170+
----
171+
-- if (z', ref*) = $evalexprs(z, expr*)
172+
-- if (z'', ref'**) = $evalexprss(z', expr'**)
173+
174+
def $evalglobals(state, globaltype*, expr*) : (state, val*) hint(show $evalglobal*#((%,%,%))) hint(macro none)
161175
def $evalglobals(z, eps, eps) = (z, eps)
162-
def $evalglobals(z, gt gt'*, expr expr'*) = (z', val val'*)
176+
def $evalglobals(z, gt gt'*, expr expr'*) = (z'', val val'*)
163177
----
164-
-- Eval_expr: z; expr ~>* z; val
165-
-- if z = s; f
178+
-- Eval_expr: z; expr ~>* z'; val
179+
-- if z' = s; f
166180
-- if (s', a) = $allocglobal(s, gt, val)
167-
-- if (z', val'*) = $evalglobals((s'; f[.MODULE.GLOBALS =++ a]), gt'*, expr'*)
181+
-- if (z'', val'*) = $evalglobals((s'; f[.MODULE.GLOBALS =++ a]), gt'*, expr'*)
168182

169183
def $instantiate(store, module, externaddr*) : config
170-
def $instantiate(s, module, externaddr*) = s'; {MODULE moduleinst}; instr_E* instr_D* instr_S?
184+
def $instantiate(s, module, externaddr*) = s''''; {MODULE moduleinst}; instr_E* instr_D* instr_S?
171185
---- ----
172186
-- Module_ok: |- module : xt_I* -> xt_E*
173187
-- (Externaddr_ok: s |- externaddr : xt_I)*
@@ -184,11 +198,12 @@ def $instantiate(s, module, externaddr*) = s'; {MODULE moduleinst}; instr_E* ins
184198
GLOBALS $globalsxa(externaddr*),
185199
FUNCS $funcsxa(externaddr*) ($(|s.FUNCS|+i_F))^(i_F<|func*|) \
186200
}
187-
-- if z = s; {MODULE moduleinst_0} ;; TODO(2, rossberg): inline
201+
-- if z = s; {MODULE moduleinst_0}
188202
-- if (z', val_G*) = $evalglobals(z, globaltype*, expr_G*)
189-
-- (Eval_expr : z'; expr_T ~>* z'; ref_T)*
190-
-- (Eval_expr : z'; expr_E ~>* z'; ref_E)**
191-
-- if (s', moduleinst) = $allocmodule(s, module, externaddr*, val_G*, ref_T*, (ref_E*)*)
203+
-- if (z'', ref_T*) = $evalexprs(z', expr_T*)
204+
-- if (z''', ref_E**) = $evalexprss(z'', expr_E**)
205+
-- if z''' = s'''; f
206+
-- if (s'''', moduleinst) = $allocmodule(s''', module, externaddr*, val_G*, ref_T*, (ref_E*)*)
192207
-- if instr_D* = $concat_(instr, $rundata_(i_D, data*[i_D])^(i_D<|data*|))
193208
-- if instr_E* = $concat_(instr, $runelem_(i_E, elem*[i_E])^(i_E<|elem*|))
194209
-- if instr_S? = (CALL x)?

specification/wasm-latest/4.4-execution.modules.spectec

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -157,17 +157,31 @@ def $runelem_(x, ELEM rt e^n (ACTIVE y instr*)) =
157157
instr* (CONST I32 0) (CONST I32 n) (TABLE.INIT y x) (ELEM.DROP x)
158158

159159
;; TODO(2, rossberg): replace with something more uniform
160-
def $evalglobals(state, globaltype*, expr*) : (state, val*) hint(show $evalglobal*#((%,%,%)))
160+
def $evalexprs(state, expr*) : (state, ref*) hint(show $evalexpr*#((%,%))) hint(macro none)
161+
def $evalexprs(z, eps) = (z, eps)
162+
def $evalexprs(z, expr expr'*) = (z'', ref ref'*)
163+
----
164+
-- Eval_expr: z; expr ~>* z'; ref
165+
-- if (z'', ref'*) = $evalexprs(z', expr'*)
166+
167+
def $evalexprss(state, expr**) : (state, ref**) hint(show $evalexpr**#((%,%))) hint(macro none)
168+
def $evalexprss(z, eps) = (z, eps)
169+
def $evalexprss(z, expr* expr'**) = (z'', ref* ref'**)
170+
----
171+
-- if (z', ref*) = $evalexprs(z, expr*)
172+
-- if (z'', ref'**) = $evalexprss(z', expr'**)
173+
174+
def $evalglobals(state, globaltype*, expr*) : (state, val*) hint(show $evalglobal*#((%,%,%))) hint(macro none)
161175
def $evalglobals(z, eps, eps) = (z, eps)
162-
def $evalglobals(z, gt gt'*, expr expr'*) = (z', val val'*)
176+
def $evalglobals(z, gt gt'*, expr expr'*) = (z'', val val'*)
163177
----
164-
-- Eval_expr: z; expr ~>* z; val
165-
-- if z = s; f
178+
-- Eval_expr: z; expr ~>* z'; val
179+
-- if z' = s; f
166180
-- if (s', a) = $allocglobal(s, gt, val)
167-
-- if (z', val'*) = $evalglobals((s'; f[.MODULE.GLOBALS =++ a]), gt'*, expr'*)
181+
-- if (z'', val'*) = $evalglobals((s'; f[.MODULE.GLOBALS =++ a]), gt'*, expr'*)
168182

169183
def $instantiate(store, module, externaddr*) : config
170-
def $instantiate(s, module, externaddr*) = s'; {MODULE moduleinst}; instr_E* instr_D* instr_S?
184+
def $instantiate(s, module, externaddr*) = s''''; {MODULE moduleinst}; instr_E* instr_D* instr_S?
171185
---- ----
172186
-- Module_ok: |- module : xt_I* -> xt_E*
173187
-- (Externaddr_ok: s |- externaddr : xt_I)*
@@ -184,11 +198,12 @@ def $instantiate(s, module, externaddr*) = s'; {MODULE moduleinst}; instr_E* ins
184198
GLOBALS $globalsxa(externaddr*),
185199
FUNCS $funcsxa(externaddr*) ($(|s.FUNCS|+i_F))^(i_F<|func*|) \
186200
}
187-
-- if z = s; {MODULE moduleinst_0} ;; TODO(2, rossberg): inline
201+
-- if z = s; {MODULE moduleinst_0}
188202
-- if (z', val_G*) = $evalglobals(z, globaltype*, expr_G*)
189-
-- (Eval_expr : z'; expr_T ~>* z'; ref_T)*
190-
-- (Eval_expr : z'; expr_E ~>* z'; ref_E)**
191-
-- if (s', moduleinst) = $allocmodule(s, module, externaddr*, val_G*, ref_T*, (ref_E*)*)
203+
-- if (z'', ref_T*) = $evalexprs(z', expr_T*)
204+
-- if (z''', ref_E**) = $evalexprss(z'', expr_E**)
205+
-- if z''' = s'''; f
206+
-- if (s'''', moduleinst) = $allocmodule(s''', module, externaddr*, val_G*, ref_T*, (ref_E*)*)
192207
-- if instr_D* = $concat_(instr, $rundata_(i_D, data*[i_D])^(i_D<|data*|))
193208
-- if instr_E* = $concat_(instr, $runelem_(i_E, elem*[i_E])^(i_E<|elem*|))
194209
-- if instr_S? = (CALL x)?
0 Bytes
Binary file not shown.

spectec/src/il2al/animate.ml

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ let large_enough_subsets xs =
243243
let min = if n >= 2 then n-1 else n in
244244
List.filter ( fun ys -> min <= List.length ys ) yss
245245

246-
let (@@) f g x = f x @ g x
246+
let (@@@) f g x = f x @ g x
247247

248248
let is_not_lhs e = match e.it with
249249
| LenE _ | IterE (_, (ListN (_, Some _), _)) | DotE _ -> true
@@ -262,7 +262,7 @@ let is_call e = match e.it with
262262

263263
let subset_selector e =
264264
if is_not_lhs e then (fun _ -> [])
265-
else if is_call e then singletons @@ group_arg e
265+
else if is_call e then singletons @@@ group_arg e
266266
else if is_atomic_lhs e then wrap
267267
else large_enough_subsets
268268

@@ -294,13 +294,24 @@ let rec rows_of_prem vars len i p =
294294
let covering_vars = List.filter_map (index_of len vars) targets in
295295
[ Assign targets, p, [i] @ covering_vars ]
296296
| RulePr (_, _, _, { it = TupE args; _ }) ->
297-
(* Assumpton: the only possible assigned-value is the last arg (i.e. ... |- lhs ) *)
298-
let _, l = Util.Lib.List.split_last args in
299-
let frees = (free_exp_list l) in
300-
[
301-
Condition, p, [i];
302-
Assign frees, p, [i] @ List.filter_map (index_of len vars) (free_exp_list l)
303-
]
297+
(* Assumption:
298+
* The only possible set of output variable
299+
* is the last arg (i.e. ... |- lhs )
300+
* or the last two args (i.e. ... ~>* z; v) *)
301+
let assign_last n =
302+
if List.length args <= n then [] else
303+
let outs, ins = Lib.List.split n (List.rev args) in
304+
let free_exps es = es |> List.map (free_exp false) |> List.fold_left union empty in
305+
let free_set = free_exps outs in
306+
let bound_set = free_exps ins in
307+
if not (disjoint free_set bound_set) then [] else
308+
let frees = free_set.varid |> Set.elements in
309+
[ Assign frees, p, [i] @ List.filter_map (index_of len vars) frees ]
310+
in
311+
312+
[ Condition, p, [i] ]
313+
@ assign_last 1
314+
@ assign_last 2
304315
| IterPr (p', iterexp) ->
305316
let p_r = rewrite_iterexp iterexp p' in
306317
let to_iter (tag, p, coverings) = tag, IterPr (recover_iterexp iterexp p, iterexp) $ p.at, coverings in
@@ -342,7 +353,7 @@ let animate_prems known_vars prems =
342353
Error.error (over_region (List.map at unhandled_prems)) "prose translation" "There might be a cyclic binding"
343354
else
344355
snd !best'
345-
| Some x -> x
356+
| Some prems -> prems
346357

347358
(* Animate rule *)
348359
let animate_rule r = match r.it with

spectec/src/il2al/transpile.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ let hide_state_expr expr =
946946
| CallE (f, args) -> CallE (f, hide_state_args args)
947947
| TupE [ s; e ] when is_store s -> e.it
948948
| TupE [ z; e ] when is_state z -> e.it
949+
| VarE id when is_state expr && String.starts_with ~prefix:"z" id -> VarE "z"
949950
| e -> e
950951
in
951952
{ expr with it = expr' }

spectec/test-frontend/TEST.md

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7285,22 +7285,48 @@ def $runelem_(elemidx : elemidx, elem : elem) : instr*
72857285
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec
72867286
rec {
72877287

7288-
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:160.1-160.94
7288+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:160.1-160.92
7289+
def $evalexprs(state : state, expr*) : (state, ref*)
7290+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:161.1-161.34
7291+
def $evalexprs{z : state}(z, []) = (z, [])
7292+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:162.1-165.46
7293+
def $evalexprs{z : state, expr : expr, `expr'*` : expr*, z'' : state, ref : ref, `ref'*` : ref*, z' : state}(z, [expr] ++ expr'*{expr' <- `expr'*`}) = (z'', [ref] ++ ref'*{ref' <- `ref'*`})
7294+
-- Eval_expr: `%;%~>*%;%`(z, expr, z', [(ref : ref <: val)])
7295+
-- if ((z'', ref'*{ref' <- `ref'*`}) = $evalexprs(z', expr'*{expr' <- `expr'*`}))
7296+
}
7297+
7298+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec
7299+
rec {
7300+
7301+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:167.1-167.96
7302+
def $evalexprss(state : state, expr**) : (state, ref**)
7303+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:168.1-168.35
7304+
def $evalexprss{z : state}(z, []) = (z, [])
7305+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:169.1-172.49
7306+
def $evalexprss{z : state, `expr*` : expr*, `expr'**` : expr**, z'' : state, `ref*` : ref*, `ref'**` : ref**, z' : state}(z, [expr*{expr <- `expr*`}] ++ expr'*{expr' <- `expr'*`}*{`expr'*` <- `expr'**`}) = (z'', [ref*{ref <- `ref*`}] ++ ref'*{ref' <- `ref'*`}*{`ref'*` <- `ref'**`})
7307+
-- if ((z', ref*{ref <- `ref*`}) = $evalexprs(z, expr*{expr <- `expr*`}))
7308+
-- if ((z'', ref'*{ref' <- `ref'*`}*{`ref'*` <- `ref'**`}) = $evalexprss(z', expr'*{expr' <- `expr'*`}*{`expr'*` <- `expr'**`}))
7309+
}
7310+
7311+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec
7312+
rec {
7313+
7314+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:174.1-174.111
72897315
def $evalglobals(state : state, globaltype*, expr*) : (state, val*)
7290-
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:161.1-161.41
7316+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:175.1-175.41
72917317
def $evalglobals{z : state}(z, [], []) = (z, [])
7292-
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:162.1-167.81
7293-
def $evalglobals{z : state, gt : globaltype, `gt'*` : globaltype*, expr : expr, `expr'*` : expr*, z' : state, val : val, `val'*` : val*, s : store, f : frame, s' : store, a : addr}(z, [gt] ++ gt'*{gt' <- `gt'*`}, [expr] ++ expr'*{expr' <- `expr'*`}) = (z', [val] ++ val'*{val' <- `val'*`})
7294-
-- Eval_expr: `%;%~>*%;%`(z, expr, z, [val])
7295-
-- if (z = `%;%`_state(s, f))
7318+
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec:176.1-181.82
7319+
def $evalglobals{z : state, gt : globaltype, `gt'*` : globaltype*, expr : expr, `expr'*` : expr*, z'' : state, val : val, `val'*` : val*, z' : state, s : store, f : frame, s' : store, a : addr}(z, [gt] ++ gt'*{gt' <- `gt'*`}, [expr] ++ expr'*{expr' <- `expr'*`}) = (z'', [val] ++ val'*{val' <- `val'*`})
7320+
-- Eval_expr: `%;%~>*%;%`(z, expr, z', [val])
7321+
-- if (z' = `%;%`_state(s, f))
72967322
-- if ((s', a) = $allocglobal(s, gt, val))
7297-
-- if ((z', val'*{val' <- `val'*`}) = $evalglobals(`%;%`_state(s', f[MODULE_frame.GLOBALS_moduleinst =++ [a]]), gt'*{gt' <- `gt'*`}, expr'*{expr' <- `expr'*`}))
7323+
-- if ((z'', val'*{val' <- `val'*`}) = $evalglobals(`%;%`_state(s', f[MODULE_frame.GLOBALS_moduleinst =++ [a]]), gt'*{gt' <- `gt'*`}, expr'*{expr' <- `expr'*`}))
72987324
}
72997325

73007326
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec
73017327
def $instantiate(store : store, module : module, externaddr*) : config
73027328
;; ../../../../specification/wasm-latest/4.4-execution.modules.spectec
7303-
def $instantiate{s : store, module : module, `externaddr*` : externaddr*, s' : store, moduleinst : moduleinst, `instr_E*` : instr*, `instr_D*` : instr*, `instr_S?` : instr?, `xt_I*` : externtype*, `xt_E*` : externtype*, `type*` : type*, `import*` : import*, `tag*` : tag*, `global*` : global*, `mem*` : mem*, `table*` : table*, `func*` : func*, `data*` : data*, `elem*` : elem*, `start?` : start?, `export*` : export*, `expr_G*` : expr*, `globaltype*` : globaltype*, `expr_T*` : expr*, `tabletype*` : tabletype*, `byte**` : byte**, `datamode*` : datamode*, `elemmode*` : elemmode*, `expr_E**` : expr**, `reftype*` : reftype*, `x?` : idx?, moduleinst_0 : moduleinst, z : state, z' : state, `val_G*` : val*, `ref_T*` : ref*, `ref_E**` : ref**, i_D : nat, i_E : nat}(s, module, externaddr*{externaddr <- `externaddr*`}) = `%;%`_config(`%;%`_state(s', {LOCALS [], MODULE moduleinst}), instr_E*{instr_E <- `instr_E*`} ++ instr_D*{instr_D <- `instr_D*`} ++ lift(instr_S?{instr_S <- `instr_S?`}))
7329+
def $instantiate{s : store, module : module, `externaddr*` : externaddr*, s'''' : store, moduleinst : moduleinst, `instr_E*` : instr*, `instr_D*` : instr*, `instr_S?` : instr?, `xt_I*` : externtype*, `xt_E*` : externtype*, `type*` : type*, `import*` : import*, `tag*` : tag*, `global*` : global*, `mem*` : mem*, `table*` : table*, `func*` : func*, `data*` : data*, `elem*` : elem*, `start?` : start?, `export*` : export*, `expr_G*` : expr*, `globaltype*` : globaltype*, `expr_T*` : expr*, `tabletype*` : tabletype*, `byte**` : byte**, `datamode*` : datamode*, `elemmode*` : elemmode*, `expr_E**` : expr**, `reftype*` : reftype*, `x?` : idx?, moduleinst_0 : moduleinst, z : state, z' : state, `val_G*` : val*, z'' : state, `ref_T*` : ref*, z''' : state, `ref_E**` : ref**, s''' : store, f : frame, i_D : nat, i_E : nat}(s, module, externaddr*{externaddr <- `externaddr*`}) = `%;%`_config(`%;%`_state(s'''', {LOCALS [], MODULE moduleinst}), instr_E*{instr_E <- `instr_E*`} ++ instr_D*{instr_D <- `instr_D*`} ++ lift(instr_S?{instr_S <- `instr_S?`}))
73047330
-- Module_ok: `|-%:%`(module, `%->%`_moduletype(xt_I*{xt_I <- `xt_I*`}, xt_E*{xt_E <- `xt_E*`}))
73057331
-- (Externaddr_ok: `%|-%:%`(s, externaddr, xt_I))*{externaddr <- `externaddr*`, xt_I <- `xt_I*`}
73067332
-- if (module = MODULE_module(type*{type <- `type*`}, import*{import <- `import*`}, tag*{tag <- `tag*`}, global*{global <- `global*`}, mem*{mem <- `mem*`}, table*{table <- `table*`}, func*{func <- `func*`}, data*{data <- `data*`}, elem*{elem <- `elem*`}, start?{start <- `start?`}, export*{export <- `export*`}))
@@ -7312,9 +7338,10 @@ def $instantiate(store : store, module : module, externaddr*) : config
73127338
-- if (moduleinst_0 = {TYPES $alloctypes(type*{type <- `type*`}), TAGS [], GLOBALS $globalsxa(externaddr*{externaddr <- `externaddr*`}), MEMS [], TABLES [], FUNCS $funcsxa(externaddr*{externaddr <- `externaddr*`}) ++ (|s.FUNCS_store| + i_F)^(i_F<|func*{func <- `func*`}|){}, DATAS [], ELEMS [], EXPORTS []})
73137339
-- if (z = `%;%`_state(s, {LOCALS [], MODULE moduleinst_0}))
73147340
-- if ((z', val_G*{val_G <- `val_G*`}) = $evalglobals(z, globaltype*{globaltype <- `globaltype*`}, expr_G*{expr_G <- `expr_G*`}))
7315-
-- (Eval_expr: `%;%~>*%;%`(z', expr_T, z', [(ref_T : ref <: val)]))*{expr_T <- `expr_T*`, ref_T <- `ref_T*`}
7316-
-- (Eval_expr: `%;%~>*%;%`(z', expr_E, z', [(ref_E : ref <: val)]))*{expr_E <- `expr_E*`, ref_E <- `ref_E*`}*{`expr_E*` <- `expr_E**`, `ref_E*` <- `ref_E**`}
7317-
-- if ((s', moduleinst) = $allocmodule(s, module, externaddr*{externaddr <- `externaddr*`}, val_G*{val_G <- `val_G*`}, ref_T*{ref_T <- `ref_T*`}, ref_E*{ref_E <- `ref_E*`}*{`ref_E*` <- `ref_E**`}))
7341+
-- if ((z'', ref_T*{ref_T <- `ref_T*`}) = $evalexprs(z', expr_T*{expr_T <- `expr_T*`}))
7342+
-- if ((z''', ref_E*{ref_E <- `ref_E*`}*{`ref_E*` <- `ref_E**`}) = $evalexprss(z'', expr_E*{expr_E <- `expr_E*`}*{`expr_E*` <- `expr_E**`}))
7343+
-- if (z''' = `%;%`_state(s''', f))
7344+
-- if ((s'''', moduleinst) = $allocmodule(s''', module, externaddr*{externaddr <- `externaddr*`}, val_G*{val_G <- `val_G*`}, ref_T*{ref_T <- `ref_T*`}, ref_E*{ref_E <- `ref_E*`}*{`ref_E*` <- `ref_E**`}))
73187345
-- if (instr_D*{instr_D <- `instr_D*`} = $concat_(syntax instr, $rundata_(`%`_dataidx(i_D), data*{data <- `data*`}[i_D])^(i_D<|data*{data <- `data*`}|){}))
73197346
-- if (instr_E*{instr_E <- `instr_E*`} = $concat_(syntax instr, $runelem_(`%`_elemidx(i_E), elem*{elem <- `elem*`}[i_E])^(i_E<|elem*{elem <- `elem*`}|){}))
73207347
-- if (instr_S?{instr_S <- `instr_S?`} = CALL_instr(x)?{x <- `x?`})

0 commit comments

Comments
 (0)