From 17229f40149d4ff892930f76d1caaff6d3d4a189 Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Wed, 23 Aug 2023 13:16:57 +0200 Subject: [PATCH 1/2] Improve independence analysis --- src/aeso_fcode_to_fate.erl | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 5c99d70..96ffe69 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -1141,11 +1141,16 @@ independent({i, _, I}, {i, _, J}) -> StackI = lists:member(?a, [WI | RI]), StackJ = lists:member(?a, [WJ | RJ]), - if WI == pc; WJ == pc -> false; %% no jumps - not (PureI or PureJ) -> false; %% at least one is pure - StackI and StackJ -> false; %% cannot both use the stack - WI == WJ -> false; %% cannot write to the same register - true -> + ReadStoreI = [] /= [ x || {store, _} <- RI ], + ReadStoreJ = [] /= [ x || {store, _} <- RJ ], + + if WI == pc; WJ == pc -> false; %% no jumps + not (PureI or PureJ) -> false; %% at least one is pure + StackI and StackJ -> false; %% cannot both use the stack + WI == WJ -> false; %% cannot write to the same register + ReadStoreI and not PureJ -> false; %% can't read store/state if other is impure + ReadStoreJ and not PureI -> false; %% can't read store/state if other is impure + true -> %% and cannot write to each other's inputs not lists:member(WI, RJ) andalso not lists:member(WJ, RI) -- 2.30.2 From 3a822e5aef828fe798886760945cbce785d10a67 Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Wed, 23 Aug 2023 13:44:46 +0200 Subject: [PATCH 2/2] Changelog updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52bf16f..96e8df8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed - Fixed a bug with polymorphism that allowed functions with the same name but different type to be considered as implementations for their corresponding interface function. +- Fixed a bug in the byte code optimization that incorrectly reordered dependent instructions. ## [7.2.1] ### Fixed -- 2.30.2