[tree-ssa] Gimplifying Java

Andrew Haley aph@redhat.com
Tue Jun 17 18:29:00 GMT 2003


What fun! I'm making good progress gimplifying the bytecode compiler.
I can turn
 public void z(java.util.Map y)
 {
 NN (2);
 int z = zz;
 try3 xxyy = new try3();
 for (int i = 0; i < 10; i++)
 z += NNN (i);
 }
into 
Method void z(java.util.Map)
 0 aload_0
 1 iconst_2
 2 invokevirtual #27 <Method int NN(int)>
 5 pop
 6 getstatic #11 <Field int zz>
 9 istore_2
 10 new #2 <Class try3>
 13 dup
 14 invokespecial #31 <Method try3()>
 17 astore_3
 18 iconst_0
 19 istore 4
 21 iload 4
 23 bipush 10
 25 if_icmpge 42
 28 iload_2
 29 iload 4
 31 invokestatic #33 <Method int NNN(int)>
 34 iadd
 35 istore_2
 36 iinc 4 1
 39 goto 21
 42 return
into
try3.z(java.util.Map) (this, y)
{
 struct try3 * T.3;
 struct 
 {
 struct java.lang.Class * class;
 void * methods[2];
 } * T.4;
 void * * T.5;
 void * T.6;
 try3:: * T.7;
 struct java.lang.Class * try3.8;
 struct try3 * T.9;
 {
 <unnamed type> *.LJpc=42 = ;
 <unnamed type> *.LJpc=21 = ;
 <unnamed type> *.LJpc=0 = ;
 struct try3 * <UV2f50>;
 <UV2f50> = this;
 T.3 = <UV2f50>;
 T.4 = T.3->vtable;
 T.5 = T.4 + 28B;
 T.6 = *T.5;
 T.7 = (try3:: *)T.6;
 <UV50e0> = T.7 (T.3, 2);
 {
 int z;
 z = zz;
 {
 struct try3 * xxyy;
 try3.8 = &try3.class;
 <UV5230> = _Jv_AllocObjectNoFinalizer (try3.8, 4);
 <UV5310> = <UV5230>;
 <UV5230> = <UV5310>;
 T.9 = <UV5310>;
 <init> (T.9);
 xxyy = <UV5230>;
 {
 int <UV5700>;
 int <UV5620>;
 int <UV5460>;
 int i;
 i = 0;
 *.LJpc=21;
 <UV5460> = i;
 <UV50e0> = <UV5460>;
 <UV5540> = 10;
 if (<UV50e0> >= <UV5540>)
 {
 goto *.LJpc=42;
 };
 <UV5620> = z;
 <UV5700> = i;
 <UV50e0> = <UV5620>;
 <UV5540> = NNN (<UV5700>);
 z = <UV50e0> + <UV5540>;
 i = i + 1;
 goto *.LJpc=21;
 }
 }
 };
 *.LJpc=42;
 return;
 }
}
which is (believe it or not) correct, except for a minor gotcha in
that the local variable 'z' is not being SSAd - as you can see it's
initialized twice in this method. I have no idea why.
You may have noticed :-) that there is a ton of unnecessary
temporaries. That's bad of course, but I'll look at that later. The
main reason for these temporaries in the Java compiler is that the gcc
is very prone to rearranging expressions. I presume that SIMPLE won't
do that, so I can remove some of them.
Also, I have no idea why labels are attached to the local variables
list of each block, but I guess that's trivial to fix.
Andrew.


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /