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