This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Bootstrap failure on sh-linux target (PR 13567)
- From: kaz Kojima <kkojima at rr dot iij4u dot or dot jp>
- To: gcc at gcc dot gnu dot org
- Cc: joern dot rennecke at superh dot com, aoliva at redhat dot com
- Date: Mon, 05 Jan 2004 15:11:39 +0900 (JST)
- Subject: Bootstrap failure on sh-linux target (PR 13567)
Hi,
gcc-3.4 doesn't bootstrap on sh-linux target from the middle
of Oct because of a miscompiling of calls.c.
I've finally got a small testcase for it and created PR 13567.
gcc-3.4 -O2 for SH target compiles the code below
static int
foo (int sz, long long *p)
{
*p = (*p > sz)? *p : sz;
*p -= sz;
return 0;
}
long long
bar (long long *p)
{
int i;
int mysz = 0;
for (i = 0; i < 2; i++)
foo (mysz, p);
return *p;
}
to
.type bar, @function
bar:
mov.l r14,@-r15
mov #2,r7
mov.l @r4,r2
mov.l @(4,r4),r3
sts.l pr,@-r15
mov r15,r14
.L7:
mov #0,r0
mov #0,r1
cmp/eq r3,r1
bf/s .Ldi15
cmp/ge r3,r1
cmp/hs r2,r0
.Ldi15:
bt/s .L11
clrt
mov r2,r0
mov r3,r1
.L11:
subc r5,r0
subc r6,r1
...
which uses an uninitialized register pair r5/r6.
Before gcse, the rtl dump of the above testcase looks
(insn 30 28 27 1 (clobber (reg:DI 166 [ sz ])) -1 (nil)
(insn_list:REG_LIBCALL 31 (nil)))
(insn 27 30 29 1 (set (subreg:SI (reg:DI 166 [ sz ]) 0)
(const_int 0 [0x0])) 123 {movsi_ie} (nil)
(expr_list:REG_NO_CONFLICT (reg/v:SI 163 [ sz ])
(nil)))
(insn 29 27 31 1 (set (subreg:SI (reg:DI 166 [ sz ]) 4)
(const_int 0 [0x0])) 123 {movsi_ie} (nil)
(expr_list:REG_NO_CONFLICT (reg/v:SI 163 [ sz ])
(nil)))
(insn 31 29 33 1 (set (reg:DI 169 [ sz ])
(reg:DI 166 [ sz ])) 136 {*movdi_i} (nil)
(insn_list:REG_RETVAL 30 (expr_list:REG_EQUAL (const_int 0 [0x0])
(nil))))
...
(insn 47 45 108 3 (parallel [
(set (reg:DI 174)
(minus:DI (reg:DI 169 [ sz ])
(reg:DI 166 [ sz ])))
(clobber (reg:SI 147 t))
]) 25 {subdi3_compact} (nil)
(nil))
...
and delete_trivially_dead_insns replaces REG_LIBCALL/REG_RETVAL
block into one insn after gcse_main done, like as following:
(insn 31 83 35 (set (reg:DI 169 [ sz ])
(const_int 0 [0x0])) -1 (nil)
(nil))
...
(insn 47 109 108 (parallel [
(set (reg:DI 174)
(minus:DI (reg:DI 178 [ sz ])
(reg:DI 166 [ sz ])))
(clobber (reg:SI 147 t))
]) -1 (nil)
(nil))
Thus (reg:DI 166 [ sz ]) which corresponds to the pair r5/r6 is
uninitialized.
Is the later use of the register 166 in subtraction insn illegal?
If not, does delete_trivially_dead_insns remove set insns wrongly?
Regards,
kaz