[erlang-bugs] HiPe compiler FP inlining crashing

Mikael Pettersson mikpelinux@REDACTED
Wed Nov 25 20:46:40 CET 2015


Mattias Jansson writes:
 > Hello.
 > 
 > I am having a problem with a crashing HiPe compiler.

Note, it's "HiPE" not "HiPe".

 > 
 > It has been tested on Erlang OTP 18.1 (64-bit) on OSX 10.11.1, and also on Fedora Linux 22 with OTP versions 18.0 and 17.5 (64-bit).
 > It crashes on Linux as well as OSX, but it does not crash in OTP 17.5. This has only been seen in 18.*
 > 
 > The following code has been shrunk to remain syntactically correct and still show the error when compiling
 > (you’d be surprised by how much of this code is actually necessary to reproduce this).
 > 
 > <code>
 > -module(rat_calc).
 > 
 > -export([eat/0]).
 > 
 > eat() ->
 >     eat_what(1.0, #{}).
 > 
 > eat_what(Factor, #{rat_type := LT} = Rat) ->
 >     #{ cheese := Cheese } = Rat,
 >     UnitCheese = Cheese / 2,
 >     RetA = case eat() of
 >                {full, RetA1} ->
 >                    CheeseB2 = min(RetA1, UnitCheese) * Factor,
 >                    case eat() of
 >                        full ->
 >                            {win, RetA1};
 >                        hungry ->
 >                            {partial, RetA1 - CheeseB2}
 >                    end;
 >                AOther ->
 >                    AOther
 >            end,
 >     RetB = case eat() of
 >                {full, RetB1} ->
 >                    CheeseA2 = min(RetB1, UnitCheese) * Factor,
 >                    rat:init(single, LT, CheeseA2),
 >                    case eat() of
 >                        full ->
 >                            {full, RetB1};
 >                        hungry ->
 >                            {hungry, RetB1 - CheeseA2}
 >                    end
 >            end,
 >     {RetA, RetB}.
 > </code>
 > 
 > The code compiles without problem if running the compiler without the +native flag. With the flag, the compiler will crash.
 > If compiling with the no_inline_fp flag enabled, the compiler does not crash.

I can reproduce the compiler crash with OTP 18.1 on Linux/x86_64, but not with OTP 17.5.
The crash is in a sanity check (hipe_icode_fp:assert_assigned/1) at the ICode level, well
before any target-dependent code is generated.

This could be caused by changes in the BEAM compiler's output, or by some change in HiPE.
Presumably a git bisect ought to identify it; care to try that?

/Mikael



More information about the erlang-bugs mailing list