This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
ARM: Bug in gcc-3.3 optimizer
- From: "Rainer Keuchel" <keuchel at rainer-keuchel dot de>
- To: <gcc-bugs at gcc dot gnu dot org>
- Cc: "Craig A. Vanderborgh \(E-Mail\)" <craigv at voxware dot com>
- Date: Sun, 8 Jun 2003 16:32:34 +0200
- Subject: ARM: Bug in gcc-3.3 optimizer
ARM: Bug in gcc-3.3 optimizer
After a conditional call the old condition code is used
for setting the return register.
Happens with -O2 -O1 -Os.
Does not happen when only turning on lots of -f options.
I did not find this in the bug-list, so I assume it is new/unfixed.
Should calls have (clobber (reg:CC CC_REGNUM)) set?
**********************************************************************
VMClassLoader::findClass
b8864: e1a00004 mov r0, r4
b8868: e8fd85f0 ldmia sp!, {r4, r5, r6, r7, r8, sl, pc}^
b8910: e3540000 cmp r4, #0 ; 0x0
b8914: 01a0000a moveq r0, sl
b8918: 01a01006 moveq r1, r6
b891c: 0bfff9bc bleq b7014 <URLClassLoader::findClass>
; conditions might have changed!!!! r4 unchanged!
b8920: 01a04000 moveq r4, r0
b8924: eaffffce b b8864
**********************************************************************
natVMClassLoader.cc:
jclass
gnu::gcj::runtime::VMClassLoader::findClass (jstring name)
{
_Jv_Utf8Const *name_u = _Jv_makeUtf8Const (name);
jclass klass = _Jv_FindClassInCache (name_u, 0);
if (! klass)
{
// Skip inner classes
jstring cn;
jint ci = name->indexOf('$');
if (ci == -1)
cn = name;
else
cn = name->substring (0, ci);
jstring so_base_name = (sb->append (cn)->toString ())->replace ('.',
'-');
// Compare against `3' because that is the length of "lib".
while (! klass && so_base_name && so_base_name->length() > 3)
{
using namespace ::java::lang;
Runtime *rt = Runtime::getRuntime();
jboolean loaded = rt->loadLibraryInternal (so_base_name);
jint nd = so_base_name->lastIndexOf ('-');
if (nd == -1)
so_base_name = NULL;
else
so_base_name = so_base_name->substring (0, nd);
if (loaded)
klass = _Jv_FindClassInCache (name_u, 0);
}
}
// Now try loading using the interpreter.
if (! klass)
klass = java::net::URLClassLoader::findClass (name);
// klass is NULL
return klass;
}
**********************************************************************
These also seem strange...
51b3c: 0b03c8f9 bleq 143f28 <___fixsfsi>
51b40: 01a00c00 moveq r0, r0, lsl #24
51b44: 01a02c40 moveq r2, r0, asr #24
51c34: 0b03c8bb bleq 143f28 <___fixsfsi>
51c38: 01a02000 moveq r2, r0
169f4: e3500102 cmp r0, #-2147483648 ; 0x80000000
169f8: 03710001 cmneq r1, #1 ; 0x1
169fc: 1b04abeb blne 1419b0 <___divsi3>
16a00: 11a0c000 movne ip, r0
Also commonly used...
1ee18: 1bffe6c0 blne 18920 <NewStringUtf8ConstP13_Jv_Utf8Const>
1ee1c: 15880000 strne r0, [r8]
**********************************************************************
Here is the -dP output:
@(insn 319 478 320 0x406e991c (set (reg:CC 24 cc)
@ (compare:CC (reg/v/f:SI 4 r4 [36])
@ (const_int 0 [0x0]))) 216 {*arm_cmpsi_insn} (nil)
@ (nil))
cmp r4, #0 @ 319 *arm_cmpsi_insn/1 [length = 4]
@(jump_insn 320 319 323 0x406e991c (set (pc)
@ (if_then_else (ne (reg:CC 24 cc)
@ (const_int 0 [0x0]))
@ (label_ref 338)
@ (pc))) 233 {*arm_cond_branch} (insn_list 319 (nil))
@ (expr_list:REG_DEAD (reg:CC 24 cc)
@ (expr_list:REG_BR_PROB (const_int 9087 [0x237f])
@ (nil))))
.stabn
68,0,64,LM23-__ZN3gnu3gcj7runtime13VMClassLoader9findClassEPN4java4lang6Stri
ngE
LM23:
@(insn 333 373 334 0x406e991c (set (reg:SI 0 r0)
@ (reg/v/u/f:SI 10 sl [33])) 175 {*arm_movsi_insn} (nil)
@ (nil))
moveq r0, sl @ 333 *arm_movsi_insn/1 [length = 4]
@(insn 334 333 335 0x406e991c (set (reg:SI 1 r1)
@ (reg/v/f:SI 6 r6 [34])) 175 {*arm_movsi_insn} (nil)
@ (nil))
moveq r1, r6 @ 334 *arm_movsi_insn/1 [length = 4]
@(call_insn 335 334 336 0x406e991c (parallel [
@ (set (reg:SI 0 r0)
@ (call (mem:SI (symbol_ref:SI
("_ZN4java3net14URLClassLoader9findClassEPNS_4lang6StringE")) [0 S4 A32])
@ (const_int 0 [0x0])))
@ (use (const_int 0 [0x0]))
@ (clobber (reg:SI 14 lr))
@ ]) 253 {*call_value_symbol} (insn_list 334 (insn_list 333 (nil)))
@ (expr_list:REG_DEAD (reg:SI 1 r1)
@ (nil))
@ (expr_list (use (reg:SI 1 r1))
@ (expr_list (use (reg:SI 0 r0))
@ (nil))))
bleq __ZN4java3net14URLClassLoader9findClassEPNS_4lang6StringE @ 335
*call_value_symbol/1 [length = 4]
@(insn 336 335 445 0x406e991c (set (reg/v/f:SI 4 r4 [36])
@ (reg:SI 0 r0)) 175 {*arm_movsi_insn} (insn_list 335 (nil))
@ (expr_list:REG_DEAD (reg:SI 0 r0)
@ (nil)))
moveq r4, r0 @ 336 *arm_movsi_insn/1 [length = 4]
@(jump_insn 445 336 446 (nil) (set (pc)
@ (label_ref 338)) 244 {*arm_jump} (nil)
@ (nil))
b L15 @ 445 *arm_jump [length = 4]