diff options
author | Magnus Lång <[email protected]> | 2016-11-19 15:55:45 +0100 |
---|---|---|
committer | Magnus Lång <[email protected]> | 2016-11-19 16:13:36 +0100 |
commit | bb4624af3e5e1a5979c547e70110a923f1c9d503 (patch) | |
tree | 023a9570cea3fbb04c30da67b97da209e049c9b9 | |
parent | e7250092945c7d15063d7b2f8ab50070b2a30786 (diff) | |
download | otp-bb4624af3e5e1a5979c547e70110a923f1c9d503.tar.gz otp-bb4624af3e5e1a5979c547e70110a923f1c9d503.tar.bz2 otp-bb4624af3e5e1a5979c547e70110a923f1c9d503.zip |
hipe_icode_call_elim: Fix cf elimination crash
hipe_icode_call_elim could in some cases replace an #icode_call{} with
control flow with a move instruction. This would break the control flow
graph invariants and cause a crash.
-rw-r--r-- | lib/hipe/icode/hipe_icode_call_elim.erl | 3 | ||||
-rw-r--r-- | lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl | 14 |
2 files changed, 16 insertions, 1 deletions
diff --git a/lib/hipe/icode/hipe_icode_call_elim.erl b/lib/hipe/icode/hipe_icode_call_elim.erl index 6a22133962..71c709a7d1 100644 --- a/lib/hipe/icode/hipe_icode_call_elim.erl +++ b/lib/hipe/icode/hipe_icode_call_elim.erl @@ -46,7 +46,8 @@ cfg(IcodeSSA) -> -spec elim_insn(icode_instr()) -> icode_instr(). elim_insn(Insn=#icode_call{'fun'={_,_,_}=MFA, args=Args, type=remote, dstlist=[Dst=#icode_variable{ - annotation={type_anno, RetType, _}}]}) -> + annotation={type_anno, RetType, _}}], + continuation=[], fail_label=[]}) -> Opaques = 'universe', case erl_types:t_is_singleton(RetType, Opaques) of true -> diff --git a/lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl b/lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl new file mode 100644 index 0000000000..17c3acd6af --- /dev/null +++ b/lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl @@ -0,0 +1,14 @@ +-module(maps_redundant_branch_is_key). +-export([test/0]). + +test() -> + ok = thingy(#{a => 1}), + ok = thingy(#{a => 2}), + ok. + +thingy(Map) -> + try + #{a := _} = Map, + ok + catch _ -> error + end. |