Question

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?

Was it helpful?

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}

OTHER TIPS

There is some in erlang's doc. See here. But the doc is not much indeed. The index page of HiPE only updated recently.

Also, you can check some help in erlang shell.

> hipe:help().
> hipe:help_options().
> hipe:help_option(Option).
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top