This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: [parisc-linux] hppa64-linux gcc bug
- To: Grant Grundler <grundler at cup dot hp dot com>
- Subject: Re: [parisc-linux] hppa64-linux gcc bug
- From: Alan Modra <alan at linuxcare dot com dot au>
- Date: Thu, 26 Oct 2000 19:11:13 +1100 (EST)
- cc: parisc-linux at thepuffingroup dot com, opensource at cup dot hp dot com, gcc-bugs at gcc dot gnu dot org
On Wed, 25 Oct 2000, Grant Grundler wrote:
> Though this seems like a "generic" hppa bug to me, I doubt it's
> in the currently published hppa2.0-hpux toolchain.
>
> [ Note : hppa64-linux tool chain isn't fully merged up with the
The bug manifests itself on today's CVS gcc from sourceware.
.../configure --host=i686-linux --target=hppa64-linux
Maybe one of the gcc maintainers can clue me in to where I should be
looking for a problem from the following.
Extract from generic.c.17.sched
[snip, nothing changes reg:DI 29 (ARG_POINTER_REGNUM)]
(insn 4 23 9 (set (reg:DI 66)
(plus:DI (reg:DI 29 %r29)
(const_int -64 [0xffffffc0]))) 166 {fixuns_truncdfdi2+2} (nil)
(nil))
[snip, nothing changes reg:DI 66, but reg:DI 29 gets set before a number
of function calls, including this one. ]
(insn 199 203 204 (set (reg:DI 26 %r26)
(mem/f:DI (plus:DI (reg:DI 66)
(const_int 16 [0x10])) 0)) 123 {movstrsi_internal+11} (insn_list 194 (nil))
(expr_list:REG_DEAD (reg:DI 66)
(nil)))
(call_insn 204 199 206 (parallel[
(set (reg:DI 28 %r28)
(call (mem:SI (symbol_ref/v:DI ("@proc_register")) 0)
(const_int 64 [0x40])))
(clobber (reg:SI 2 %r2))
(use (const_int 0 [0x0]))
] ) 272 {call_value_internal_symref} (insn_list 194 (insn_list 203 (insn_list 199 (insn_list 201 (nil)))))
(expr_list:REG_DEAD (reg:DI 26 %r26)
(expr_list:REG_DEAD (reg:DI 25 %r25)
(expr_list:REG_DEAD (reg:DI 27 %r27)
(expr_list:REG_DEAD (reg:DI 29 %r29)
(expr_list:REG_UNUSED (reg:DI 28 %r28)
(expr_list:REG_UNUSED (reg:SI 2 %r2)
(expr_list:REG_EH_REGION (const_int 0 [0x0])
(nil))))))))
(expr_list (use (reg:DI 29 %r29))
(expr_list (use (reg:DI 4 %r4))
(expr_list (use (reg:DI 27 %r27))
(expr_list (use (reg:DI 25 %r25))
(expr_list (use (reg:DI 26 %r26))
(nil)))))))
Now the corresponding rtl from generic.c.18.lreg
[snip a number of places like the following insn where reg:DI 29
(ARG_POINTER_REGNUM) is set for function calls. How is it that
gcc doesn't see this register has been trashed?]
(insn 203 201 239 (set (reg:DI 29 %r29)
(plus:DI (reg:DI 30 %r30)
(const_int -16 [0xfffffff0]))) 166 {fixuns_truncdfdi2+2} (nil)
(nil))
(insn 239 203 199 (set (reg:DI 66)
(plus:DI (reg:DI 29 %r29)
(const_int -64 [0xffffffc0]))) 166 {fixuns_truncdfdi2+2} (nil)
(expr_list:REG_EQUIV (plus:DI (reg:DI 29 %r29)
(const_int -64 [0xffffffc0]))
(nil)))
(insn 199 239 204 (set (reg:DI 26 %r26)
(mem/f:DI (plus:DI (reg:DI 66)
(const_int 16 [0x10])) 0)) 123 {movstrsi_internal+11} (insn_list 194 (nil))
(expr_list:REG_DEAD (reg:DI 66)
(nil)))
(call_insn 204 199 206 (parallel[
(set (reg:DI 28 %r28)
(call (mem:SI (symbol_ref/v:DI ("@proc_register")) 0)
(const_int 64 [0x40])))
(clobber (reg:SI 2 %r2))
(use (const_int 0 [0x0]))
] ) 272 {call_value_internal_symref} (insn_list 194 (insn_list 203 (insn_list 199 (insn_list 201 (nil)))))
(expr_list:REG_DEAD (reg:DI 26 %r26)
(expr_list:REG_DEAD (reg:DI 25 %r25)
(expr_list:REG_DEAD (reg:DI 27 %r27)
(expr_list:REG_DEAD (reg:DI 29 %r29)
(expr_list:REG_UNUSED (reg:DI 28 %r28)
(expr_list:REG_UNUSED (reg:SI 2 %r2)
(expr_list:REG_EH_REGION (const_int 0 [0x0])
(nil))))))))
(expr_list (use (reg:DI 29 %r29))
(expr_list (use (reg:DI 4 %r4))
(expr_list (use (reg:DI 27 %r27))
(expr_list (use (reg:DI 25 %r25))
(expr_list (use (reg:DI 26 %r26))
(nil)))))))
--
Linuxcare. Support for the Revolution.
generic.i.gz