GCJ Optimizer troubles: testcase
Andrew Haley
aph@redhat.com
Thu Aug 12 21:22:00 GMT 2004
Thomas Aeby writes:
> On Tue, 2004-08-10 at 22:27, Bryce McKinlay wrote:
> > Could you post a full test case please? That behaviour would surprise
> > me, too.
>
> Ok, here it is:
Yes, it's a bug. Confirmed in gcc 3.4.0, OK in mainline.
The Initial RTL is broken. Note that insn 18 is a jump around the
code that increments "value". If compiled with -O0, the initial RTL
is correct.
This means that some optimization which happens before RTL generation
is causing the problem. There aren't many optimizations which happen
so early.
Andrew.
(call_insn 9 8 10 (set (reg:SI 0 ax)
(call (mem:QI (symbol_ref:SI ("_Jv_MonitorEnter") [flags 0x41] <function_decl 0x403884a4 _Jv_MonitorEnter>) [0 S1 A8])
(const_int 4 [0x4]))) -1 (nil)
(nil)
(nil))
(note 10 9 11 NOTE_INSN_DELETED)
(note 11 10 12 NOTE_INSN_DELETED)
(note 12 11 13 1 NOTE_INSN_EH_REGION_BEG)
(note 13 12 17 NOTE_INSN_DELETED)
(note 17 13 18 1 NOTE_INSN_EH_REGION_END)
(jump_insn 18 17 19 (set (pc)
(label_ref 30)) -1 (nil)
(nil))
(barrier 19 18 20)
(code_label 20 19 21 3 "" [0 uses])
(insn 21 20 22 (set (reg:SI 61)
(reg:SI 62)) -1 (nil)
(nil))
(insn 22 21 23 (set (reg:SI 63)
(reg:SI 64)) -1 (nil)
(nil))
(insn 23 22 14 (set (mem/f:SI (reg/f:SI 56 virtual-outgoing-args) [0 S4 A32])
(reg/v/f:SI 58 [ this ])) -1 (nil)
(nil))
(insn 14 23 15 (set (reg:SI 60)
(mem/s/j:SI (plus:SI (reg/v/f:SI 58 [ this ])
(const_int 4 [0x4])) [0 <variable>.value+0 S4 A32])) -1 (nil)
(nil))
(insn 15 14 16 (parallel [
(set (reg:SI 59)
(plus:SI (reg:SI 60)
(const_int 1 [0x1])))
(clobber (reg:CC 17 flags))
]) -1 (nil)
(nil))
(insn 16 15 24 (set (mem/s/j:SI (plus:SI (reg/v/f:SI 58 [ this ])
(const_int 4 [0x4])) [0 <variable>.value+0 S4 A32])
(reg:SI 59)) -1 (nil)
(nil))
(call_insn 24 16 25 (set (reg:SI 0 ax)
(call (mem:QI (symbol_ref:SI ("_Jv_MonitorExit") [flags 0x41] <function_decl 0x40388510 _Jv_MonitorExit>) [0 S1 A8])
(const_int 4 [0x4]))) -1 (nil)
(nil)
(nil))
(insn 25 24 26 (set (reg:SI 65)
(reg:SI 0 ax)) -1 (nil)
(nil))
(insn 26 25 27 (set (reg:SI 62)
(reg:SI 61)) -1 (nil)
(nil))
(insn 27 26 28 (set (reg:SI 64)
(reg:SI 63)) -1 (nil)
(nil))
(jump_insn 28 27 29 (resx 1) -1 (nil)
(nil))
(barrier 29 28 30)
(code_label 30 29 31 4 "" [0 uses])
>
> public class testcase {
>
> private static class encapsulatedInt {
> int value;
>
> public encapsulatedInt( int i ) {
> value = i;
> }
>
> public synchronized void increment() {
> value++;
> }
>
> public int intValue() {
> return value;
> }
> }
>
> public static void main( String args[] ) {
> encapsulatedInt tester = new encapsulatedInt(0);
> System.out.println( "value: " + tester.intValue() );
> tester.increment();
> System.out.println( "value: " + tester.intValue() );
> }
> }
>
> Compiled with GCJ 3.4.0 (with <3.4 everything seems to work
> as expected):
>
> $ gcj -O -o testcase --main=testcase testcase.java
> $ ./testcase
> value: 0
> value: 0
> $ gcj -o testcase --main=testcase testcase.java
> $ ./testcase
> value: 0
> value: 1
> $ gcj --version
> gcj (GCC) 3.4.0
> [...]
>
> Now, isn't that cool?
>
> Best regards,
> Tom
> --------------------------------------------------------------------
> Thomas Aeby, Kirchweg 52, 1735 Giffers, Switzerland, aeby@graeff.com
> Voice:(+41)26 4180040 PGP public key available
> --------------------------------------------------------------------
>
More information about the Java
mailing list