From bb4624af3e5e1a5979c547e70110a923f1c9d503 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magnus=20L=C3=A5ng?= <margnus1@telia.com>
Date: Sat, 19 Nov 2016 15:55:45 +0100
Subject: 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.
---
 lib/hipe/icode/hipe_icode_call_elim.erl                    |  3 ++-
 .../test/maps_SUITE_data/maps_redundant_branch_is_key.erl  | 14 ++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl

(limited to 'lib')

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.
-- 
cgit v1.2.3