Search code examples
erlanghipe

hipe compile option meaning and where is the native file


When reading rabbitmq's rabbit.erl,it contain hipe compilation related code.

hipe_compile() ->
    Count = length(?HIPE_WORTHY),
    io:format("HiPE compiling:  |~s|~n                 |",
              [string:copies("-", Count)]),
    T1 = erlang:now(),
    PidMRefs = [spawn_monitor(fun () -> [begin
                                             {ok, M} = hipe:c(M, [o3]),
                                             io:format("#")
                                         end || M <- Ms]
                              end) ||
                   Ms <- split(?HIPE_WORTHY, ?HIPE_PROCESSES)],
    [receive
         {'DOWN', MRef, process, _, normal} -> ok;
         {'DOWN', MRef, process, _, Reason} -> exit(Reason)
     end || {_Pid, MRef} <- PidMRefs],
    T2 = erlang:now(),
    io:format("|~n~nCompiled ~B modules in ~Bs~n",
              [Count, timer:now_diff(T2, T1) div 1000000]).

But there is no explanation about hipe in the erlang's reference doc. What's the meaning of 'o3'?

(emacs@chen-yumatoMacBook-Pro.local)51> hipe:c(xx_reader,[o3]).
{ok,xx_reader}

After I use hipe:c as above, No new compiled file can be found the in the pwd() directory? Where it is?


Solution

  • o3 indicates the optimization level used by the compiler. There're also levels o0, o1, o2. Details of the levels are as follows:

       o1 = [inline_fp,pmatch,peephole],
       o2 = [icode_range,icode_ssa_const_prop,icode_ssa_copy_prop,icode_type,
             icode_inline_bifs,rtl_lcm,rtl_ssa,rtl_ssa_const_prop,spillmin_color,
             use_indexing,remove_comments,concurrent_comp,binary_opt] ++ o1,
       o3 = [{regalloc,coalescing},icode_range] ++ o2.
    

    You can use hipe:help_option(Option) to further investigate the meanings of different options. For example,

    3> hipe:help_option(regalloc).
    regalloc - Select register allocation algorithm. Used as {regalloc, METHOD}.
      Currently available methods:
        naive - spills everything (for debugging and testing)
        linear_scan - fast; not so good if few registers available
        graph_color - slow, but gives OK performance
        coalescing - slower, tries hard to use registers
        optimistic - another variant of a coalescing allocator
    ok
    4> hipe:help_option(icode_range).
    icode_range - Performs integer range analysis on the Icode level
    ok
    

    I think HiPE is JIT compilation, just as the one used in Java. The native parts are available only in runtime, so there should be no explicit representation in your file system.

    Also, hipe:c do require a .beam file is present. For example, if you create a test.erl with some stuff, and without compiling it to a .beam file, call hipe:c directly will lead to an error:

    1> hipe:c(test, [o3]).
    <HiPE (v 3.9.3)> EXITED with reason {cant_find_beam_file,test} @hipe:419
    
    =ERROR REPORT==== 29-Nov-2012::17:03:02 ===
    <HiPE (v 3.9.3)> Error: [hipe:418]: Cannot find test.beam file.** exception error: {hipe,419,{cant_find_beam_file,test}}
         in function  hipe:beam_file/1 (hipe.erl, line 419)
         in call from hipe:c/2 (hipe.erl, line 313)
    2> c(test).
    {ok,test}
    3> hipe:c(test, [o3]).
    {ok,test}