Improve independence analysis in code optimizer (#483)
* Improve independence analysis * Changelog updated
This commit is contained in:
parent
3b0ca28c8e
commit
08fa372c24
@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Removed
|
### Removed
|
||||||
### Fixed
|
### 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 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]
|
## [7.2.1]
|
||||||
### Fixed
|
### Fixed
|
||||||
|
@ -1141,11 +1141,16 @@ independent({i, _, I}, {i, _, J}) ->
|
|||||||
StackI = lists:member(?a, [WI | RI]),
|
StackI = lists:member(?a, [WI | RI]),
|
||||||
StackJ = lists:member(?a, [WJ | RJ]),
|
StackJ = lists:member(?a, [WJ | RJ]),
|
||||||
|
|
||||||
if WI == pc; WJ == pc -> false; %% no jumps
|
ReadStoreI = [] /= [ x || {store, _} <- RI ],
|
||||||
not (PureI or PureJ) -> false; %% at least one is pure
|
ReadStoreJ = [] /= [ x || {store, _} <- RJ ],
|
||||||
StackI and StackJ -> false; %% cannot both use the stack
|
|
||||||
WI == WJ -> false; %% cannot write to the same register
|
if WI == pc; WJ == pc -> false; %% no jumps
|
||||||
true ->
|
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
|
%% and cannot write to each other's inputs
|
||||||
not lists:member(WI, RJ) andalso
|
not lists:member(WI, RJ) andalso
|
||||||
not lists:member(WJ, RI)
|
not lists:member(WJ, RI)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user