This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]