Possible bug in HiPE pattern matching

Jon Meredith <>
Thu Jul 9 22:53:01 CEST 2009


Hi all,

I think I've discovered an issue with pattern matching under HiPE  
going back on at least 5.6.3 under Debian/lenny and 5.7.2 under OS X

Here is a module that demonstrates the issue

-module(bug).
-export([f/1,g/1]).
f(0) -> zero;
f(-10) -> one;
f(-20) -> two;
f(-30) -> three;
f(-40) -> four;
f(-50) -> five;
f(-60) -> six;
f(-70) -> seven;
f(-80) -> eight;  %% Uncomment this line to make it work with HiPE
f(X) -> {error, X}.

g(X) ->
     case X of
         0 -> zero;
         -10 -> one;
         -20 -> two;
         -30 -> three;
         -40 -> four;
         -50 -> five;
         -60 -> six;
         -70 -> seven;
         -80 -> eight;  %% Uncomment this line to make it work with HiPE
         X -> {error, X}
     end.

Running normally without HiPE it does what I expect

   :~$ /usr/bin/erlc bug.erl
   :~$ /usr/bin/erl
   Erlang (BEAM) emulator version 5.6.3 [source] [64-bit] [smp:2]  
[async-threads:0] [hipe] [kernel-poll:false]

   Eshell V5.6.3  (abort with ^G)
   1> bug:f(0).
   zero
   2> bug:g(0).
   zero

If I compile with +native, the pattern doesn't match the first case as  
it should

   :~$ /usr/bin/erlc +native bug.erl
   :~$ /usr/bin/erl
   Erlang (BEAM) emulator version 5.6.3 [source] [64-bit] [smp:2]  
[async-threads:0] [hipe] [kernel-poll:false]

   Eshell V5.6.3  (abort with ^G)
   1> bug:f(0).
   {error,0}
   2> bug:g(0).
   {error,0}

If I remove the commented lines above it works correctly.  Is there  
something I don't understand about HiPE?

Many thanks, Jon



More information about the erlang-bugs mailing list