[Soot-list] qustion about loop fusion

caoj at purdue.edu caoj at purdue.edu
Sun Feb 26 17:21:56 EST 2006


Hi:

I use soot to do loop fusion. The following is a simple test case:

class A
{
	public static void main (String[] args) 
	{
		int[] a;
		int[] b; 

		a = new int[10];
		b = new int[11];

		for (int i=0; i<10; i++)
		{
			a[i] = i;
		}

		for (int i=0; i<10; i++)
		{
			System.out.println ("a["+i+"]="+a[i]+"\n");
		}
	}
}


I want to change it into:

class A
{
	public static void main (String[] args) 
	{
		int[] a;
		int[] b; 

		a = new int[10];
		b = new int[11];

		for (int i=0; i<10; i++)
		{
			a[i] = i;
			System.out.println ("a["+i+"]="+a[i]+"\n");
		}
	}
}


The following jimple codes corresponding to the original codes:

args := @parameter0: java.lang.String[]
a = newarray (int)[10]
b = newarray (int)[11]
i = 0
if i >= 10 goto i = 0
a[i] = i
i = i + 1
goto [?= (branch)]
i = 0
if i >= 10 goto return
$r0 = <java.lang.System: java.io.PrintStream out>
$r1 = new java.lang.StringBuffer
specialinvoke $r1.<java.lang.StringBuffer: void <init>()>()
$r2 = virtualinvoke $r1.<java.lang.StringBuffer: java.lang.StringBuffer append
(java.lang.String)>("a[")
$r3 = virtualinvoke $r2.<java.lang.StringBuffer: java.lang.StringBuffer append
(int)>(i)
$r4 = virtualinvoke $r3.<java.lang.StringBuffer: java.lang.StringBuffer append
(java.lang.String)>("]=")
$i0 = a[i]
$r5 = virtualinvoke $r4.<java.lang.StringBuffer: java.lang.StringBuffer append
(int)>($i0)
$r6 = virtualinvoke $r5.<java.lang.StringBuffer: java.lang.StringBuffer append
(java.lang.String)>("\n")
$r7 = virtualinvoke $r6.<java.lang.StringBuffer: java.lang.String toString()>()
virtualinvoke $r0.<java.io.PrintStream: void println(java.lang.String)>($r7)
i = i + 1
goto [?= (branch)]
return


The following jimple codes corresponding to the changedd codes:

args := @parameter0: java.lang.String[]
a = newarray (int)[10]
b = newarray (int)[11]
i = 0
if i >= 10 goto return
a[i] = i
$r0 = <java.lang.System: java.io.PrintStream out>
$r1 = new java.lang.StringBuffer
specialinvoke $r1.<java.lang.StringBuffer: void <init>()>()
$r2 = virtualinvoke $r1.<java.lang.StringBuffer: java.lang.StringBuffer append
(java.lang.String)>("a[")
$r3 = virtualinvoke $r2.<java.lang.StringBuffer: java.lang.StringBuffer append
(int)>(i)
$r4 = virtualinvoke $r3.<java.lang.StringBuffer: java.lang.StringBuffer append
(java.lang.String)>("]=")
$i0 = a[i]
$r5 = virtualinvoke $r4.<java.lang.StringBuffer: java.lang.StringBuffer append
(int)>($i0)
$r6 = virtualinvoke $r5.<java.lang.StringBuffer: java.lang.StringBuffer append
(java.lang.String)>("\n")
$r7 = virtualinvoke $r6.<java.lang.StringBuffer: java.lang.String toString()>()
virtualinvoke $r0.<java.io.PrintStream: void println(java.lang.String)>($r7)
i = i + 1
goto [?= (branch)]
return


After it, I run "java A", it gives me the following error: 

Exception in thread "main" java.lang.VerifyError: (class: A, method: main 
signature: ([Ljava/lang/String;)V) Accessing value from uninitialized register 2


Does anyone know what is wrong with my changed jimple codes? Thanks.


Jun Cao


More information about the Soot-list mailing list