A new user interface for you! Read more...

File 0337-Fix-a-crash-ih-HoPE-s-lazy-code-motion-pass.patch of Package erlang

From 992a1f18934f071858b5e87f32bda5b49bed637d Mon Sep 17 00:00:00 2001
From: Kostis Sagonas <kostis@it.uu.se>
Date: Mon, 11 Jun 2018 17:47:37 +0200
Subject: [PATCH 1/2] Fix a crash ih HoPE's lazy code motion pass

Some change in the BEAM compiler resulted in the creation of basic
blocks that differed from those previously created by the compiler.
As a result, the lazy code motion pass of RTL crashed when compiling
some of the new code.

Crashes were privately reported by @richcarl.
---
 lib/hipe/rtl/hipe_rtl_lcm.erl                      |  9 ++++---
 .../test/basic_SUITE_data/basic_issues_hipe.erl    | 28 ++++++++++++++++++++--
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/lib/hipe/rtl/hipe_rtl_lcm.erl b/lib/hipe/rtl/hipe_rtl_lcm.erl
index af39c9a0a4..2c8cc80e56 100644
--- a/lib/hipe/rtl/hipe_rtl_lcm.erl
+++ b/lib/hipe/rtl/hipe_rtl_lcm.erl
@@ -270,7 +270,10 @@ insert_expr_last_work(_, Instr, [Code1]) ->
   %% We insert the code next to last.
   [Instr, Code1];
 insert_expr_last_work(Label, Instr, [Code|Codes]) ->
-  [Code|insert_expr_last_work(Label, Instr, Codes)].
+  case insert_expr_last_work(Label, Instr, Codes) of
+    not_safe -> not_safe;
+    NewCodes -> [Code|NewCodes]
+  end.
 
 %%=============================================================================
 %% Inserts expression first in the block for the given label.
diff --git a/lib/hipe/test/basic_SUITE_data/basic_issues_hipe.erl b/lib/hipe/test/basic_SUITE_data/basic_issues_hipe.erl
index e71045bfe2..860d882632 100644
--- a/lib/hipe/test/basic_SUITE_data/basic_issues_hipe.erl
+++ b/lib/hipe/test/basic_SUITE_data/basic_issues_hipe.erl
@@ -8,8 +8,9 @@
 
 -export([test/0]).
 
-%% functions that need to be exported so that they are retained.
--export([auth/4]).
+%% functions that need to be exported so that they are retained and/or
+%% not specialized away by the compiler.
+-export([auth/4, wxSizer_replace/2, parent_class/1]).
 
 test() ->
   ok = test_dominance_trees(),
@@ -18,6 +19,7 @@ test() ->
   ok = test_bif_fails(),
   ok = test_find_catches(),
   ok = test_heap_allocate_trim(),
+  ok = wxSizer_replace(),
   ok.
 
 %%--------------------------------------------------------------------
@@ -151,3 +153,25 @@ get_next_retry(Error, Count) ->
   end.
 
 pair(A, B) -> {A, B}.
+
+%%--------------------------------------------------------------------
+%% Date: June 11, 2018
+%%
+%% Stripped down test case (from `wxSizer') that crashed the lazy code
+%% motion pass of the HiPE compiler in a pre-release of Erlang/OTP 21.
+%% A similar crash existed in `ssl_correction'.
+%%--------------------------------------------------------------------
+
+wxSizer_replace() ->
+  wxSizer_replace(wxSizer, wxSizer).
+
+-define(CLASS(Type, Class), ((Type) =:= Class) orelse (Type):parent_class(Class)).
+
+wxSizer_replace(OldwinT, NewwinT) -> % this function was the culprit
+  ?CLASS(OldwinT, wxSizer),
+  ?CLASS(NewwinT, wxSizer),
+  ok.
+
+parent_class(wxWindow) -> true;
+parent_class(wxEvtHandler) -> true;
+parent_class(_Class) -> erlang:error({badtype, ?MODULE}).
-- 
2.16.4