From 8b919f6db465bc4bf22bc165bb12ea45e2cf504e Mon Sep 17 00:00:00 2001 From: Erwan Jahier <jahier@imag.fr> Date: Fri, 29 Aug 2008 11:24:21 +0200 Subject: [PATCH] Do not introduce unnecessary intermediary variables for tuples when splitting expressions. --- src/TODO | 7 -- src/split.ml | 8 +- src/test/test.res.exp | 271 +++++++++++------------------------------- 3 files changed, 77 insertions(+), 209 deletions(-) diff --git a/src/TODO b/src/TODO index d8dcbd2d..2e138341 100644 --- a/src/TODO +++ b/src/TODO @@ -148,11 +148,6 @@ est traduit en y il faudrait plutot - (a, b, c) = (_v1 fby _v2); - (_v1, _v2, _v3) = (1, 1, 1); - (_v4, _v5, _v6) = (x, x, x); - - ??? a = _v1 -> _v4; @@ -163,8 +158,6 @@ il faudrait plutot * Revoir la facon de fournir des noms frais de variables (eg, split.ml) -> renommer les variables du programme en les prefixant par "_". -* Renommer CompiledData en Eff comme dans lic2loc - * verifier que chacun des exemples du repertoire "should_fail" échoue avec un bon message d'erreur. diff --git a/src/split.ml b/src/split.ml index 28d44ca7..3093b3d9 100644 --- a/src/split.ml +++ b/src/split.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 29/08/2008 (at 10:43) by Erwan Jahier> *) +(** Time-stamp: <modified the 29/08/2008 (at 11:17) by Erwan Jahier> *) open Lxm @@ -59,13 +59,15 @@ and (split_val_exp : bool -> Eff.val_exp -> Eff.val_exp * split_acc) = let lxm = by_pos_op_eff.src in let (rhs, vel, (eql,vl)) = match by_pos_op_eff.it with + (* for with and hat, a particuliar treatment is done because + a val_exp is attached to them *) | Eff.WITH(ve) -> let ve, (eql, vl) = split_val_exp false ve in let by_pos_op_eff = Lxm.flagit (Eff.WITH(ve)) lxm in let rhs = CallByPosEff(by_pos_op_eff, OperEff []) in rhs, [ve], (eql, vl) - | Eff.HAT (i,ve) -> + | Eff.HAT(i,ve) -> let ve, (eql, vl) = split_val_exp false ve in let by_pos_op_eff = Lxm.flagit (Eff.HAT(i, ve)) lxm in let rhs = CallByPosEff(by_pos_op_eff, OperEff []) in @@ -76,7 +78,7 @@ and (split_val_exp : bool -> Eff.val_exp -> Eff.val_exp * split_acc) = let rhs = CallByPosEff(by_pos_op_eff, OperEff vel) in rhs, vel, (eql, vl) in - if top_level then + if top_level || by_pos_op_eff.it = TUPLE then CallByPosEff(by_pos_op_eff, OperEff vel), (eql, vl) else (* create the var for the current call *) diff --git a/src/test/test.res.exp b/src/test/test.res.exp index 219a3eaa..b5418e19 100644 --- a/src/test/test.res.exp +++ b/src/test/test.res.exp @@ -651,29 +651,20 @@ node Watch::DIVIDE(scale:int) returns (quotient:bool); var n:int; _v1:int; - _v2:bool; - _v3:int; + _v2:int; + _v3:bool; _v4:int; - _v5:bool; + _v5:int; _v6:int; _v7:bool; - _v8:int; - _v9:int; - _v10:int; - _v11:bool; - _v12:int; - _v13:bool; let - (n, quotient) = ((_v1, _v2) -> (_v12, _v13)); - (_v1, _v2) = (0, true); - _v3 = (pre n); - _v4 = (_v3 + 1); - _v5 = (_v4 = scale); - (_v6, _v7) = (0, true); - _v8 = (pre n); - _v9 = (_v8 + 1); - (_v10, _v11) = (_v9, false); - (_v12, _v13) = ( if _v5 then (_v6, _v7) else (_v10, _v11)); + (n, quotient) = ((0, true) -> (_v6, _v7)); + _v1 = (pre n); + _v2 = (_v1 + 1); + _v3 = (_v2 = scale); + _v4 = (pre n); + _v5 = (_v4 + 1); + (_v6, _v7) = ( if _v3 then (0, true) else (_v5, false)); tel -- end of node Watch::DIVIDE @@ -738,37 +729,25 @@ var _v3:_Watch::string; _v4:_Watch::MAIN_DISPLAY_TYPE; _v5:_Watch::MINI_DISPLAY_TYPE; - _v6:_Watch::string; - _v7:_Watch::MAIN_DISPLAY_TYPE; - _v8:_Watch::MINI_DISPLAY_TYPE; - _v9:_Watch::MAIN_DISPLAY_TYPE; - _v10:_Watch::MINI_DISPLAY_TYPE; - _v11:_Watch::string; - _v12:_Watch::MAIN_DISPLAY_TYPE; - _v13:_Watch::MINI_DISPLAY_TYPE; - _v14:_Watch::MAIN_DISPLAY_TYPE; - _v15:_Watch::MINI_DISPLAY_TYPE; - _v16:_Watch::string; - _v17:_Watch::MAIN_DISPLAY_TYPE; - _v18:_Watch::MINI_DISPLAY_TYPE; - _v19:_Watch::string; + _v6:_Watch::MAIN_DISPLAY_TYPE; + _v7:_Watch::MINI_DISPLAY_TYPE; + _v8:_Watch::MAIN_DISPLAY_TYPE; + _v9:_Watch::MINI_DISPLAY_TYPE; + _v10:_Watch::string; let display = (Watch::MAKE_DISPLAY(main_display, mini_display, alpha_display, status, position_enhanced, labels)); (main_display, mini_display, alpha_display) = ( if mode_is_watch then - (_v4, _v5, _v6) else (_v17, _v18, _v19)); + (_v1, _v2, _v3) else (_v8, _v9, _v10)); _v1 = (Watch::WATCH_TIME_TO_MAIN_DISPLAY(watch_time)); _v2 = (Watch::WATCH_DATE_TO_MINI_DISPLAY(watch_time)); _v3 = (Watch::WATCH_DAY_TO_ALPHA_DISPLAY(watch_time)); - (_v4, _v5, _v6) = (_v1, _v2, _v3); - _v7 = (Watch::STOPWATCH_TIME_TO_MAIN_DISPLAY(stopwatch_time)); - _v8 = (Watch::WATCH_TIME_TO_MINI_DISPLAY(watch_time)); - (_v9, _v10, _v11) = (_v7, _v8, Watch::stringST); - _v12 = (Watch::ALARM_TIME_TO_MAIN_DISPLAY(alarm_time)); - _v13 = (Watch::WATCH_TIME_TO_MINI_DISPLAY(watch_time)); - (_v14, _v15, _v16) = (_v12, _v13, Watch::stringAL); - (_v17, _v18, _v19) = ( if mode_is_stopwatch then (_v9, _v10, _v11) else - (_v14, _v15, _v16)); + _v4 = (Watch::STOPWATCH_TIME_TO_MAIN_DISPLAY(stopwatch_time)); + _v5 = (Watch::WATCH_TIME_TO_MINI_DISPLAY(watch_time)); + _v6 = (Watch::ALARM_TIME_TO_MAIN_DISPLAY(alarm_time)); + _v7 = (Watch::WATCH_TIME_TO_MINI_DISPLAY(watch_time)); + (_v8, _v9, _v10) = ( if mode_is_stopwatch then (_v4, _v5, Watch::stringST) + else (_v6, _v7, Watch::stringAL)); tel -- end of node Watch::DISPLAY extern function Watch::SOMME(i1:int; i2:int; i3:int) returns (somme:int); @@ -1336,41 +1315,26 @@ node Watch::MORE_RECENT(evt:bool; delay:int) returns (more_recent:bool); var deadline:int; _v1:bool; - _v2:int; - _v3:bool; + _v2:bool; + _v3:int; _v4:int; - _v5:bool; - _v6:int; - _v7:bool; + _v5:int; + _v6:bool; + _v7:int; _v8:bool; _v9:int; - _v10:int; - _v11:bool; - _v12:int; - _v13:int; - _v14:bool; - _v15:int; - _v16:bool; - _v17:int; - _v18:bool; - _v19:int; - _v20:bool; - _v21:int; + _v10:bool; + _v11:int; let - (more_recent, deadline) = ( if evt then (_v1, _v2) else (_v20, _v21)); - (_v1, _v2) = (true, 0); - (_v3, _v4) = (false, delay); - (_v5, _v6) = (true, 0); - _v7 = (pre more_recent); - _v8 = (deadline < delay); - _v9 = (pre deadline); - _v10 = (_v9 + 1); - (_v11, _v12) = (_v8, _v10); - _v13 = (pre deadline); - (_v14, _v15) = (false, _v13); - (_v16, _v17) = ( if _v7 then (_v11, _v12) else (_v14, _v15)); - (_v18, _v19) = ( if evt then (_v5, _v6) else (_v16, _v17)); - (_v20, _v21) = ((_v3, _v4) -> (_v18, _v19)); + (more_recent, deadline) = ( if evt then (true, 0) else (_v10, _v11)); + _v1 = (pre more_recent); + _v2 = (deadline < delay); + _v3 = (pre deadline); + _v4 = (_v3 + 1); + _v5 = (pre deadline); + (_v6, _v7) = ( if _v1 then (_v2, _v4) else (false, _v5)); + (_v8, _v9) = ( if evt then (true, 0) else (_v6, _v7)); + (_v10, _v11) = ((false, delay) -> (_v8, _v9)); tel -- end of node Watch::MORE_RECENT @@ -2090,20 +2054,14 @@ var _v5:int; _v6:int; _v7:int; - _v8:int; - _v9:int; - _v10:int; - _v11:int; let - (c, d) = ( if _v1 then (_v4, _v5) else (_v10, _v11)); + (c, d) = ( if _v1 then (_v2, _v3) else (_v5, _v7)); _v1 = (a > 0); - (_v2, _v3) = (a, b); - (_v4, _v5) = (pre (_v2, _v3)); - _v6 = (pre a); + (_v2, _v3) = (pre (a, b)); + _v4 = (pre a); + _v5 = (_v4 + 1); + _v6 = (pre b); _v7 = (_v6 + 1); - _v8 = (pre b); - _v9 = (_v8 + 1); - (_v10, _v11) = (_v7, _v9); tel -- end of node aux1::aux1 @@ -2147,15 +2105,9 @@ extern function call::f(a:int) returns (b:int); node call::n(a:int; b:bool) returns (x:int; y:int); var _v1:int; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (x, y) = ( if b then (_v2, _v3) else (_v4, _v5)); + (x, y) = ( if b then (_v1, 0) else (0, a)); _v1 = (call::f(a)); - (_v2, _v3) = (_v1, 0); - (_v4, _v5) = (0, a); tel -- end of node call::n extern function call::p(a:int) returns (x:int; y:int); @@ -3049,15 +3001,9 @@ Opening file should_work/NONREG/minmax1.lus node minmax1::minmax1(a:int; b:int) returns (min:int; max:int); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (min, max) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (min, max) = ( if _v1 then (a, b) else (b, a)); _v1 = (a < b); - (_v2, _v3) = (a, b); - (_v4, _v5) = (b, a); tel -- end of node minmax1::minmax1 @@ -3068,15 +3014,9 @@ Opening file should_work/NONREG/minmax2.lus node minmax2::minmax(a:int; b:int) returns (min:int; max:int); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (min, max) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (min, max) = ( if _v1 then (a, b) else (b, a)); _v1 = (a < b); - (_v2, _v3) = (a, b); - (_v4, _v5) = (b, a); tel -- end of node minmax2::minmax node minmax2::minmax2(a:int; b:int) returns (min:int; max:int); @@ -3092,15 +3032,9 @@ Opening file should_work/NONREG/minmax3.lus node minmax3::minmax(a:int; b:int) returns (min:int; max:int); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (min, max) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (min, max) = ( if _v1 then (a, b) else (b, a)); _v1 = (a <= b); - (_v2, _v3) = (a, b); - (_v4, _v5) = (b, a); tel -- end of node minmax3::minmax @@ -3130,15 +3064,9 @@ Opening file should_work/NONREG/minmax4.lus node minmax4::minmax(a:int; b:int) returns (min:int; max:int); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (min, max) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (min, max) = ( if _v1 then (a, b) else (b, a)); _v1 = (a <= b); - (_v2, _v3) = (a, b); - (_v4, _v5) = (b, a); tel -- end of node minmax4::minmax @@ -3175,15 +3103,9 @@ Opening file should_work/NONREG/minmax4_bis.lus node minmax4_bis::minmax(a:int; b:int) returns (min:int; max:int); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (min, max) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (min, max) = ( if _v1 then (a, b) else (b, a)); _v1 = (a <= b); - (_v2, _v3) = (a, b); - (_v4, _v5) = (b, a); tel -- end of node minmax4_bis::minmax @@ -3290,15 +3212,9 @@ Opening file should_work/NONREG/minmax6.lus node minmax6::minmax(a:int; b:int) returns (min:int; max:int); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (min, max) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (min, max) = ( if _v1 then (a, b) else (b, a)); _v1 = (a <= b); - (_v2, _v3) = (a, b); - (_v4, _v5) = (b, a); tel -- end of node minmax6::minmax @@ -3354,15 +3270,9 @@ type _mm::pairpair = struct {a : _mm::pair; b : _mm::pair}; node mm::mm(a:int; b:int) returns (min:int; max:int); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (min, max) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (min, max) = ( if _v1 then (b, a) else (a, b)); _v1 = (a > b); - (_v2, _v3) = (b, a); - (_v4, _v5) = (a, b); tel -- end of node mm::mm @@ -3375,15 +3285,9 @@ type _mm1::pairpair = struct {a : _mm1::pair; b : _mm1::pair}; node mm1::mm1(a:int; b:int) returns (y:_mm1::pair); var _v1:bool; - _v2:int; - _v3:int; - _v4:int; - _v5:int; let - (y.a, y.b) = ( if _v1 then (_v2, _v3) else (_v4, _v5)); + (y.a, y.b) = ( if _v1 then (b, a) else (a, b)); _v1 = (a > b); - (_v2, _v3) = (b, a); - (_v4, _v5) = (a, b); tel -- end of node mm1::mm1 @@ -3420,21 +3324,15 @@ var _v5:int; _v6:int; _v7:int; - _v8:int; - _v9:int; - _v10:int; - _v11:int; let - (y.a, y.b) = ( if _v3 then (_v6, _v7) else (_v10, _v11)); + (y.a, y.b) = ( if _v3 then (_v4, _v5) else (_v6, _v7)); _v1 = a.a; _v2 = a.b; _v3 = (_v1 > _v2); _v4 = a.b; _v5 = a.a; - (_v6, _v7) = (_v4, _v5); - _v8 = a.a; - _v9 = a.b; - (_v10, _v11) = (_v8, _v9); + _v6 = a.a; + _v7 = a.b; tel -- end of node mm3::mm3 @@ -14840,28 +14738,9 @@ var _v1:bool; _v2:bool; _v3:bool; - _v4:bool; - _v5:bool; - _v6:bool; - _v7:bool; - _v8:bool; - _v9:bool; - _v10:bool; - _v11:bool; - _v12:bool; - _v13:bool; - _v14:bool; - _v15:bool; - _v16:bool; let - (c4, c5, c6) = ((_v1, _v2, _v3) -> (_v14, _v15, _v16)); - (_v1, _v2, _v3) = (true, false, true); - (_v4, _v5) = (c1, c2); - (_v6, _v7, _v8) = ((_v4, _v5), c3); - (_v9, _v10) = (c2, c3); - (_v11, _v12, _v13) = (c1, (_v9, _v10)); - (_v14, _v15, _v16) = ( if c1 then (_v6, _v7, _v8) else (_v11, _v12, - _v13)); + (c4, c5, c6) = ((true, false, true) -> (_v1, _v2, _v3)); + (_v1, _v2, _v3) = ( if c1 then ((c1, c2), c3) else (c1, (c2, c3))); tel -- end of node test::three_outputs node test::two_outputs(c1:bool; c2:bool) returns (c4:bool; c5:bool); @@ -18715,18 +18594,14 @@ var _v5:int; _v6:real; _v7:real; - _v8:int; + _v8:real; _v9:real; - _v10:real; - _v11:real; + _v10:int; + _v11:int; _v12:int; - _v13:real; + _v13:int; _v14:int; _v15:int; - _v16:int; - _v17:int; - _v18:int; - _v19:int; let begin = (active -> _v1); _v1 = (bug::edge_detect(active)); @@ -18734,23 +18609,21 @@ let _v2 = (not active); alarm = (not _v3); _v3 = (bug::once_from_to(action, begin, en)); - (intO, realO) = ((_v8, _v9) -> (_v12, _v13)); + (intO, realO) = ((_v5, _v7) -> (intI, _v9)); _v4 = (bug::ze_const_int + x); _v5 = (_v4 + y); _v6 = (10.0 - 10.0); _v7 = (_v6 - 10.0); - (_v8, _v9) = (_v5, _v7); - _v10 = (pre realO); - _v11 = (_v10 * realI); - (_v12, _v13) = (intI, _v11); - x = (0 -> _v16); - _v14 = (pre x); - _v15 = (_v14 + 1); - _v16 = ( if active then y else _v15); - y = (1 -> _v19); - _v17 = (pre y); - _v18 = (_v17 + 1); - _v19 = ( if active then _v18 else x); + _v8 = (pre realO); + _v9 = (_v8 * realI); + x = (0 -> _v12); + _v10 = (pre x); + _v11 = (_v10 + 1); + _v12 = ( if active then y else _v11); + y = (1 -> _v15); + _v13 = (pre y); + _v14 = (_v13 + 1); + _v15 = ( if active then _v14 else x); tel -- end of node bug::bug -- automatically defined aliases: -- GitLab