diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2015-07-08 12:04:28 +0200 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2015-07-08 12:04:28 +0200 |
commit | 52c6be30048bf9b77b9dd6bc66f052ee5386f16e (patch) | |
tree | 87ab50782e40116d4b23b6f61d90030d304993dd /cparser/StructReturn.ml | |
parent | ab1ddcd0d579d7e5760c6cfa84adbd55212c47e7 (diff) | |
parent | f869da75c970aec78975f7154c806f29e3012b7a (diff) | |
download | compcert-52c6be30048bf9b77b9dd6bc66f052ee5386f16e.tar.gz compcert-52c6be30048bf9b77b9dd6bc66f052ee5386f16e.zip |
Merge branch 'master' of https://github.com/AbsInt/CompCert
Diffstat (limited to 'cparser/StructReturn.ml')
-rw-r--r-- | cparser/StructReturn.ml | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/cparser/StructReturn.ml b/cparser/StructReturn.ml index 660f1d9b..5e5602f3 100644 --- a/cparser/StructReturn.ml +++ b/cparser/StructReturn.ml @@ -299,10 +299,15 @@ let rec transf_expr env ctx e = transf_call env ctx None fn args e.etyp (* Function calls returning a composite by reference: add first argument. - ctx = Effects: lv = f(...) -> f(&lv, ...) [copy optimization] + ctx = Effects: lv = f(...) -> f(&newtemp, ...), lv = newtemp f(...) -> f(&newtemp, ...) ctx = Val: lv = f(...) -> f(&newtemp, ...), lv = newtemp f(...) -> f(&newtemp, ...), newtemp + + We used to do a copy optimization: + ctx = Effects: lv = f(...) -> f(&lv, ...) + but it is not correct in case of overlap (see test/regression/struct12.c) + Function calls returning a composite by value: ctx = Effects: lv = f(...) -> newtemp = f(...), lv = newtemp f(...) -> f(...) @@ -332,13 +337,14 @@ and transf_call env ctx opt_lhs fn args ty = | Effects, None -> let tmp = new_temp ~name:"_res" ty in {edesc = ECall(fn', eaddrof tmp :: args'); etyp = TVoid []} - | Effects, Some lhs -> - {edesc = ECall(fn', eaddrof lhs :: args'); etyp = TVoid []} + (* Copy optimization, turned off as explained above *) + (* | Effects, Some lhs -> + {edesc = ECall(fn', eaddrof lhs :: args'); etyp = TVoid []} *) | Val, None -> let tmp = new_temp ~name:"_res" ty in ecomma {edesc = ECall(fn', eaddrof tmp :: args'); etyp = TVoid []} tmp - | Val, Some lhs -> + | _, Some lhs -> let tmp = new_temp ~name:"_res" ty in ecomma {edesc = ECall(fn', eaddrof tmp :: args'); etyp = TVoid []} (eassign lhs tmp) |