aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hipe/rtl/hipe_rtl_lcm.erl
diff options
context:
space:
mode:
authorKostis Sagonas <[email protected]>2018-06-11 17:47:37 +0200
committerKostis Sagonas <[email protected]>2018-06-11 17:47:37 +0200
commit992a1f18934f071858b5e87f32bda5b49bed637d (patch)
tree8c80b41f4c6ea7b0066a4d6af94ef16cb0a99d15 /lib/hipe/rtl/hipe_rtl_lcm.erl
parentcf2ad431487cb533aac2854843aa61b8e1e5af62 (diff)
downloadotp-992a1f18934f071858b5e87f32bda5b49bed637d.tar.gz
otp-992a1f18934f071858b5e87f32bda5b49bed637d.tar.bz2
otp-992a1f18934f071858b5e87f32bda5b49bed637d.zip
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.
Diffstat (limited to 'lib/hipe/rtl/hipe_rtl_lcm.erl')
-rw-r--r--lib/hipe/rtl/hipe_rtl_lcm.erl9
1 files changed, 6 insertions, 3 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
@@ -267,14 +267,17 @@ try_insert_expr_last(CFG0, Label, Instr) ->
%% with the new code inserted second to last (assuming the last expression
%% is a branch operation).
insert_expr_last_work(_Instr, [#call{}]) ->
- %% Call instructions clobber all expressions; we musn't insert the expression
- %% before it
+ %% Call instructions clobber all expressions; we must not insert the
+ %% expression before it
not_safe;
insert_expr_last_work(Instr, [Code1]) ->
%% We insert the code next to last.
[Instr, Code1];
insert_expr_last_work(Instr, [Code|Codes]) ->
- [Code|insert_expr_last_work(Instr, Codes)].
+ case insert_expr_last_work(Instr, Codes) of
+ not_safe -> not_safe;
+ NewCodes -> [Code|NewCodes]
+ end.
%%=============================================================================
%% Inserts expression first in the block for the given label.