diff options
author | Björn Gustavsson <[email protected]> | 2019-08-01 10:24:23 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2019-08-01 10:24:23 +0200 |
commit | c7ac8d9bf26cbb04c2942e792f766a2ba6d8b07e (patch) | |
tree | b0ddf6ca605ccc5e198d4f739716c09d31223022 /lib/compiler/src | |
parent | 1a8f8b199589b5a16b22489e6501f13fbc2e1b54 (diff) | |
parent | e553fbc8d6e55773172358f75c7e83ab38f0cb4c (diff) | |
download | otp-c7ac8d9bf26cbb04c2942e792f766a2ba6d8b07e.tar.gz otp-c7ac8d9bf26cbb04c2942e792f766a2ba6d8b07e.tar.bz2 otp-c7ac8d9bf26cbb04c2942e792f766a2ba6d8b07e.zip |
Merge branch 'bjorn/compiler/fix-unsafe-sharing/OTP-15963' into maint
* bjorn/compiler/fix-unsafe-sharing/OTP-15963:
Fix unsafe code sharing
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/beam_ssa_share.erl | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/compiler/src/beam_ssa_share.erl b/lib/compiler/src/beam_ssa_share.erl index 426efa2cc9..73983bd34a 100644 --- a/lib/compiler/src/beam_ssa_share.erl +++ b/lib/compiler/src/beam_ssa_share.erl @@ -303,8 +303,12 @@ canonical_is([#b_ret{arg=Arg}], VarMap, Acc0) -> Acc0 end, {{ret,canonical_arg(Arg, VarMap),Acc1},VarMap}; -canonical_is([#b_br{bool=#b_var{},fail=Fail}], VarMap, Acc) -> - {{br,succ,Fail,Acc},VarMap}; +canonical_is([#b_br{bool=#b_var{}=Arg,fail=Fail}], VarMap, Acc) -> + %% A previous buggy version of this code omitted the canonicalized + %% argument in the return value. Unfortunately, that worked most + %% of the time, except when `br` terminator referenced a variable + %% defined in a previous block instead of in the same block. + {{br,canonical_arg(Arg, VarMap),succ,Fail,Acc},VarMap}; canonical_is([#b_br{succ=Succ}], VarMap, Acc) -> {{br,Succ,Acc},VarMap}; canonical_is([], VarMap, Acc) -> |