[LLVMdev] Counting instructions in MCJIT

Verena Beckham verena at codeplay.com
Thu Jun 28 04:19:17 PDT 2012


Hello Jin,

Thanks for your advice. However, I still don't think the Statistics 
class will work for me: I'm compiling two modules at the same time, with 
a single LLVM instance. Therefore the Statistics of the two will be 
collected in parallel and I can only get the sum of both. That is 
because Statistics is not associated with a module.

  Verena


On 28/06/2012 03:26, Jin Gu Kang wrote:
> Hi Verena,
>
> I think that we can count the number of instructions with "-stats"
> command line option. As you mentioned, this option uses Statistic class
> like "STATISTIC(EmittedInsts, "Number of machine instrs printed");"
>
> I don't know exactly about parallel code generation environment but
> this option seems like to work correctly in common case as following.
>
> This is an example from http://llvm.org/docs/DebuggingJITedCode.html.
> 1   int compute_factorial(int n)
> 2   {
> 3       if (n<= 1)
> 4           return 1;
> 5
> 6       int f = n;
> 7       while (--n>  1)
> 8           f *= n;
> 9       return f;
> 10  }
> 11
> 12
> 13  int main(int argc, char** argv)
> 14  {
> 15      if (argc<  2)
> 16          return -1;
> 17      char firstletter = argv[1][0];
> 18      int result = compute_factorial(firstletter - '0');
> 19
> 20      // Returned result is clipped at 255...
> 21      return result;
> 22  }
>
> The result from mcjit is
> ===-------------------------------------------------------------------------===
>                            ... Statistics Collected ...
> ===-------------------------------------------------------------------------===
>    45 asm-printer    - Number of machine instrs printed
>
> I tested this code on x86 32bit machine.
>
> To verify above result, we can use gdb.
> You can get information to debug jitted codes from
> http://llvm.org/docs/DebuggingJITedCode.html.
>
> (gdb) disassem
> Dump of assembler code for function main:
>     0xb7c27060<+0>:     sub    $0x1c,%esp
>     0xb7c27063<+3>:     movl   $0x0,0x18(%esp)
>     0xb7c2706b<+11>:    mov    0x20(%esp),%eax
>     0xb7c2706f<+15>:    mov    %eax,0x14(%esp)
>     0xb7c27073<+19>:    mov    0x24(%esp),%eax
>     0xb7c27077<+23>:    mov    %eax,0x10(%esp)
> =>  0xb7c2707b<+27>:    cmpl   $0x1,0x14(%esp)
>     0xb7c27080<+32>:    jg     0xb7c2708c<main+44>
>     0xb7c27082<+34>:    movl   $0xffffffff,0x18(%esp)
>     0xb7c2708a<+42>:    jmp    0xb7c270b1<main+81>
>     0xb7c2708c<+44>:    mov    0x10(%esp),%eax
>     0xb7c27090<+48>:    mov    0x4(%eax),%eax
>     0xb7c27093<+51>:    mov    (%eax),%al
>     0xb7c27095<+53>:    mov    %al,0xf(%esp)
>     0xb7c27099<+57>:    movsbl 0xf(%esp),%eax
>     0xb7c2709e<+62>:    add    $0xffffffd0,%eax
>     0xb7c270a1<+65>:    mov    %eax,(%esp)
>     0xb7c270a4<+68>:    call   0xb7c27010<compute_factorial>
>     0xb7c270a9<+73>:    mov    %eax,0x8(%esp)
>     0xb7c270ad<+77>:    mov    %eax,0x18(%esp)
>     0xb7c270b1<+81>:    mov    0x18(%esp),%eax
>     0xb7c270b5<+85>:    add    $0x1c,%esp
>     0xb7c270b8<+88>:    ret
> End of assembler dump.
>
> (gdb) disassem
> Dump of assembler code for function compute_factorial:
>     0xb7c27010<+0>:     sub    $0xc,%esp
>     0xb7c27013<+3>:     mov    0x10(%esp),%eax
>     0xb7c27017<+7>:     mov    %eax,0x4(%esp)
>     0xb7c2701b<+11>:    cmp    $0x1,%eax
> =>  0xb7c2701e<+14>:    jg     0xb7c2702a<compute_factorial+26>
>     0xb7c27020<+16>:    movl   $0x1,0x8(%esp)
>     0xb7c27028<+24>:    jmp    0xb7c27050<compute_factorial+64>
>     0xb7c2702a<+26>:    mov    0x4(%esp),%eax
>     0xb7c2702e<+30>:    jmp    0xb7c27038<compute_factorial+40>
>     0xb7c27030<+32>:    mov    (%esp),%eax
>     0xb7c27033<+35>:    imul   0x4(%esp),%eax
>     0xb7c27038<+40>:    mov    %eax,(%esp)
>     0xb7c2703b<+43>:    mov    0x4(%esp),%eax
>     0xb7c2703f<+47>:    dec    %eax
>     0xb7c27040<+48>:    mov    %eax,0x4(%esp)
>     0xb7c27044<+52>:    cmp    $0x2,%eax
>     0xb7c27047<+55>:    jge    0xb7c27030<compute_factorial+32>
>     0xb7c27049<+57>:    mov    (%esp),%eax
>     0xb7c2704c<+60>:    mov    %eax,0x8(%esp)
>     0xb7c27050<+64>:    mov    0x8(%esp),%eax
>     0xb7c27054<+68>:    add    $0xc,%esp
>     0xb7c27057<+71>:    ret
> End of assembler dump.
>
> Main function generates 23 instructions and compute_factorial function
> generates 22 instructions. The number of generated instructions are 45
> totally and this is same with the result of "-stats" option.
>
> I think that we can count the number of  instructions per module
> using Statistic class.
>
> Regards,
> Jin-Gu Kang
> ________________________________________
> From: llvmdev-bounces at cs.uiuc.edu [llvmdev-bounces at cs.uiuc.edu] On Behalf Of Verena Beckham [verena at codeplay.com]
> Sent: Wednesday, June 27, 2012 6:22 PM
> To: llvmdev at cs.uiuc.edu
> Subject: [LLVMdev] Counting instructions in MCJIT
>
> Hi there,
>
> I wondered whether anyone could give me any advice about counting
> assembly instructions when using MCJIT?
> For performance regression testing I would like to be able to count the
> number of instructions generated during the jit compilation of a given
> module.
>
> The Statistic class, as far as I understand, cannot collect this data
> per-module (per-ExecutionEngine/per-MCJIT), and there is no way of
> extracting a single statistic without doing string manipulation. I'm
> also doing several code gens in parallel, so even if the class is
> thread-safe, I cannot find the values for the single modules.
>
> In JIT you can add a JITListener, which can count the
> MachineInstructions, with the assumption that there is a (more or less)
> 1-2-1 mapping between machine and assembly instructions. Is there
> something equivalent for MCJIT?
>
> I can write a MachineFunctionPass to do the same, but I can find no way
> of inserting that into the PassManager that MCJIT uses. This means I'm
> replicating the passes and doing code gen twice, basically.
>
> Any advice would be much appreciated!
> Thank you very much,
>
> --
> Verena Beckham
>
> Vice President Engineering
>
> Codeplay Software Ltd
> 45 York Place, Edinburgh, EH1 3HP
> Tel: 0131 466 0503
> Fax: 0131 557 6600
> Website: http://www.codeplay.com
>
> This email and any attachments may contain confidential and /or
> privileged information and  is for use  by the addressee only. If you
> are not the intended recipient, please notify Codeplay Software Ltd
> immediately and delete the message from your computer. You may not copy
> or forward it,or use or disclose its contents to any other person. Any
> views or other information in this message which do not relate to our
> business are not authorized by Codeplay software Ltd, nor does this
> message form part of any contract unless so stated.
> As internet communications are capable of data corruption Codeplay
> Software Ltd does not accept any responsibility for any changes made to
> this message after it was sent. Please note that Codeplay Software Ltd
> does not accept any liability or responsibility for viruses and it is
> your responsibility to scan any attachments.
> Company registered in England and Wales, number: 04567874
> Registered office: 81 Linkfield Street, Redhill RH1 6BY
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev



More information about the llvm-dev mailing list