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

Li junsong ljs.darkfish@gmail.com
Tue Aug 9 07:18:00 GMT 2011


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?)

 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?)

 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.

Please tell me where can I find some resources to solve these
question. I have read some paper about
generic and gimple, researched the whole gcj mail list, read the gcc
internals. These questions must have
been too detailed. I did not find anything useful. Is it about alias?

I appreciate any explanations and advices.
Thanks.



More information about the Java mailing list