diff options
author | Kostis Sagonas <[email protected]> | 2018-06-11 17:47:37 +0200 |
---|---|---|
committer | Kostis Sagonas <[email protected]> | 2018-06-11 17:47:37 +0200 |
commit | 992a1f18934f071858b5e87f32bda5b49bed637d (patch) | |
tree | 8c80b41f4c6ea7b0066a4d6af94ef16cb0a99d15 /lib/hipe/rtl | |
parent | cf2ad431487cb533aac2854843aa61b8e1e5af62 (diff) | |
download | otp-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')
-rw-r--r-- | lib/hipe/rtl/hipe_rtl_lcm.erl | 9 |
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. |