Re: Why does a 'new' statement produce so many temporary variables

Andrew Haley <[email protected]>
Newsgroups gmane.comp.gcc.java.devel
Message-ID <[email protected]>
On 08/09/2011 08:18 AM, Li junsong wrote:
> Hi,
> 
> I am writing a plugin to add a pass in gcc 4.6.1. the pass will do
> some optimizations before high gimple lowering,
> moving some gimple nodes from one place to another. In cc1, the gimple
> code is quite
> understandable.  But I'm confused by the gimple that Java front end converts to.
> 
> I dump the file, here is a piece of code doing "new".
> 
> #ref#2#4 = _Jv_AllocObjectNoFinalizer (&Number.class$$);
> #ref#3#6 = #ref#2#4;
> #ref#2#4 = #ref#3#6;
> D.459 = #slot#1#1;
> #slot#4#7 = D.459;
> #ref#3#6.1 = #ref#3#6;
> (#ref#3#6.1, #slot#4#7);
> 
> the corresponding Java source code is
> 
>         int sum = 4;
>         Number number;
>         if ( sum < 100 )
>             number = new Number(sum);   <=here
> 
> the Number class is a simple one:
> 
> class Number
> {
>     int i;
>     Number(int inputi){
>         i = inputi;
>     }
> }
> 
> Here comes my question:
>  1. I am wondering why we don't use 'NEW_EXPR' to represent a "new" statement?
>      The 'NEW_EXPR' has already been defined in the cp-tree.def.( As I know, the
>      "new" statement in cp front end is also represented as that in
> Java front end,
>      which is "gimple_call" in gimple code, "ADDR_EXPR" in tree code,
> is it? why?)

Why would we want to use 'NEW_EXPR' ?  We simply call the allocator
which creates the object.

>  2. How can I figure out which pieces of code are corresponding
>      to 'NEW' statement? ( Can I always first find the
> "_Jv_AllocObjectNoFinalize" or "_Jv_AllocObject"
>      gimple_call and then "<init>" gimple_call to locate the code?)

I think so.

>  3. I find that there is no document to describe the implementation of
> Java front end.
>      I don't understand why we need so many temporary variables:
> 
>      #ref#2#4 = _Jv_AllocObjectNoFinalizer (&Number.class$$);
>      #ref#3#6 = #ref#2#4;
>      #ref#2#4 = #ref#3#6;
> 
>      Here, the #ref#3#6 and #ref#2#4 is a kind waste. But each "new" statement
>      does the same thing.

It's not really a waste: we assume that the optimizer will delete
useless temporaries, and as far as I know it does.

Andrew.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.