[erlang-bugs] HiPE bug with comparison of floats with integers

Kostis Sagonas <>
Wed Feb 2 11:50:49 CET 2011


Paul Guyot wrote:
> Hello,
> 
> There is a bug in HiPE compilation with the comparison of floats with integers.
> This bug happens with the following two functions:
> 
> ------
> -module(hipe_zero).
> -export([f/1, g/2]).
> 
> f(X) ->
>     Y = X / 2,
>     Y == 0.
> 
> g(X, Z) ->
>     Y = X / 2,
>     case Z of
>         test when Y == 0 -> test_zero;
>         test -> test_non_zero;
>         other -> other
>     end.
> ------
> 
> Beam will evaluate hipe_zero:f(0) and hipe_zero:f(0.0) to true, while HiPE will evaluate hipe_zero:f(0) and hipe_zero:f(0.0) to false. HiPE properly evaluates hipe_zero:f/1 to true if passed {icode_inline_bifs, false}. However, not inlining the '==' bif just masks the bug as HiPE does not properly evaluate hipe_zero:g(0, test) to test_zero.

This has now been fixed.  The relevant fetch command is:

    git fetch git://github.com/kostis/otp.git icode-range-fix

If one wants to apply the change manually to a previous OTP version, the 
last commit on that branch shows the fix that needs to be applied 
(basically change two calls in hipe_icode_range.erl from lists:any/2 to 
calls to lists:all/2).

Thanks to Paul for reporting this.

Kostis


More information about the erlang-bugs mailing list