[Soot-list] question about Soot optimization

Tobias Gutzmann tobias.gutzmann at lnu.se
Wed Apr 25 04:53:21 EDT 2012


Hi,

I don't think that's entirely true, Eric. Such an optimization should be 
allowed as long as "b" is not "volatile"
See table 17.4 at the JVM spec: 
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4
It's not exactly the same, but a similar situation.

/Tobias

On 2012-04-25 10:38, Eric Bodden wrote:
> Hi Mu.
>
> The optimization you propose is not sound in multi-threaded programs.
> The field's value could have been modified between both assignments,
> which would make the second assignment necessary.
> My guess is that, since usually Soot has no knowledge about whether
> your program is multi-threaded or not, or which parts of it may be, it
> assumes the worst and hence does not apply the optimization.
>
> Eric
>
> On 25 April 2012 01:29, Mu Zhang<muzhang82 at gmail.com>  wrote:
>> Hi,
>>
>> I have a question about Soot optimization. I'm writing a program to
>> instrument Java bytecode and using Soot to remove redundant code. However, I
>> found Soot was not able to optimize the instrumented code in some cases.
>> Here is an example and the redundant instructions are in black:
>>
>> public int cryptWrapper(int, tester.BoolWrapper, tester.BoolWrapper,
>> tester.BoolWrapper)
>>      {
>>          tester.B r0;
>>          int i0, i1, $i2;
>>          tester.BoolWrapper r1, r2, r3;
>>          boolean z0, z1, z3, z4;
>>
>>          r0 := @this: tester.B;
>>          i0 := @parameter0: int;
>>          r1 := @parameter1: tester.BoolWrapper;
>>          r2 := @parameter2: tester.BoolWrapper;
>>          r3 := @parameter3: tester.BoolWrapper;
>>          z0 = r2.<tester.BoolWrapper: boolean b>;
>>          z1 = r1.<tester.BoolWrapper: boolean b>;
>>          z3 = r3.<tester.BoolWrapper: boolean b>;
>>          $i2 = r0.<tester.B: int key>;
>>          i1 = i0 ^ $i2;
>>          z4 = z1 | 0;
>>          r2.<tester.BoolWrapper: boolean b>  = z0;
>>          r1.<tester.BoolWrapper: boolean b>  = z1;
>>          r3.<tester.BoolWrapper: boolean b>  = z4;
>>          return i1;
>>      }
>>
>> Basically, z0 is assigned with r2.b and later is assigned to r2.b without
>> any modification in between. I was wondering if it is because Soot considers
>> r2.b to be an object field with side-effects and thus doesn't optimize it.
>> If that is true, I'm curious to know how Soot determine whether a local has
>> side-effects or not. Does it simply consider all objects have side-effects?
>> Also, is there a way to trick Soot and bypass the check, so that it can
>> optimize some certain instructions that may have side-effects?
>>
>> Thanks,
>>
>> Mu
>>
>> _______________________________________________
>> Soot-list mailing list
>> Soot-list at sable.mcgill.ca
>> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>>
>
>



More information about the Soot-list mailing list