public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: [SH] ICE compiling pr34330 testcase for sh-linux-gnu
@ 2009-07-30 14:32 Joern Rennecke
  0 siblings, 0 replies; 5+ messages in thread
From: Joern Rennecke @ 2009-07-30 14:32 UTC (permalink / raw)
  To: Andrew Stubbs; +Cc: Ian Lance Taylor, gcc

> This is then transformed by subst_reloads to the final broken form:
>
> (insn 171 170 172 5 .../pr34330.c:17 (set (reg:SI 9 r9)
>          (plus:SI (reg:SI 8 r8)
>              (reg:SI 0 r0 [orig:243 ivtmp.11 ] [243]))) -1 (nil))
>
> This is logically correct as r9 genuinely does contain the result of the
> substituted expression, but it does not satisfy the constraints.
>
> And here's where I get stuck. I don't know where in the code it's
> supposed to check that the code will be correct after the substitution.
>
> The (plus (plus ...) ...) rtl is generated by
> find_reloads_subreg_address using make_memloc and plus_constant, and it
> seems correct in itself.

This used to be 'handled' by reload register allocation which would
use the same reload register for RELOAD_FOR_INPUT_ADDRESS as for
RELOAD_FOR_INPADDR_ADDREESS if both are for the same operand.
It is strange that you have two RELOAD_FOR_INPUT_ADDRESS reloads
instead.

Although, in terms of ensuring correctness, it would be saner if
gen_reload would make sure it generates valid code even for unusual
reload register allocations.
Unfortunately, that'll require it to make a guess if a two-address add
is required; you can scan the insn pattern for matching constraints, but
that is somewhat hit-and-miss (obviously you can't use constrain_operands
there unless you want to save / restore all the extraction data); you'll
end up generating some unneeded register-register moves on some
architectures.  But you could make sure they get removed in postreload.

^ permalink raw reply	[flat|nested] 5+ messages in thread
* [SH] ICE compiling pr34330 testcase for sh-linux-gnu
@ 2009-07-09 11:54 Andrew Stubbs
  2009-07-09 18:12 ` Ian Lance Taylor
  2009-07-15  6:39 ` Maxim Kuvyrkov
  0 siblings, 2 replies; 5+ messages in thread
From: Andrew Stubbs @ 2009-07-09 11:54 UTC (permalink / raw)
  To: gcc

I'm having trouble with an ICE, and I'm hoping somebody can enlighten me.

Given the following command:

cc1 -fpreprocessed ../pr34330.i -quiet -dumpbase pr34330.c -da -mb 
-auxbase-strip pr34330.c -Os -version -ftree-parallelize-loops=4 
-ftree-vectorize -o pr34330.s -fschedule-insns

I get an internal compiler error:

GNU C (GCC) version 4.5.0 20090702 (experimental) (sh-linux-gnu)
         compiled by GNU C version 4.3.2, GMP version 4.3.1, MPFR 
version 2.4.1-p5, MPC version 0.6
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
GNU C (GCC) version 4.5.0 20090702 (experimental) (sh-linux-gnu)
         compiled by GNU C version 4.3.2, GMP version 4.3.1, MPFR 
version 2.4.1-p5, MPC version 0.6
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: c91a929a0209c0670a3ae8b8067b9f9a
/scratch/ams/4.4-sh-linux-gnu-lite/src/gcc-trunk-4.4/gcc/testsuite/gcc.dg/torture/pr34330.c: 
In function 'foo':
/scratch/ams/4.4-sh-linux-gnu-lite/src/gcc-trunk-4.4/gcc/testsuite/gcc.dg/torture/pr34330.c:22:1: 
error: insn does not satisfy its constraints:
(insn 171 170 172 4 
/scratch/ams/4.4-sh-linux-gnu-lite/src/gcc-trunk-4.4/gcc/testsuite/gcc.dg/torture/pr34330.c:17 
(set (reg:SI 9 r9)
         (plus:SI (reg:SI 8 r8)
             (reg:SI 0 r0 [orig:243 ivtmp.11 ] [243]))) 35 
{*addsi3_compact} (nil))
/scratch/ams/4.4-sh-linux-gnu-lite/src/gcc-trunk-4.4/gcc/testsuite/gcc.dg/torture/pr34330.c:22:1: 
internal compiler error: in reload_cse_simplify_operands, at 
postreload.c:396
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

The problem is that r8 != r9 but SH requires that it is.

The problem insn is created by gen_reload when it is given the following 
rtl as input:

(plus:SI (plus:SI (reg/v/f:SI 4 r4 [orig:192 a ] [192])
         (const_int 2 [0x2]))
     (reg:SI 0 r0 [orig:188 ivtmp.24 ] [188]))

The problem appears to be that the nested plus does not match any of the 
patterns it recognizes so it falls through to the final else clause:

   /* Otherwise, just write (set OUT IN) and hope for the best.  */
   else
     emit_insn (gen_rtx_SET (VOIDmode, out, in));

... which doesn't even attempt to check the constraints.

Is this an unexpected corner case for reload? Or is the input RTL 
mal-formed somehow?

This case fails in both GCC 4.4 and SVN trunk (although the latter has 
disabled -fschedule-insns by default so it needs to be re-enabled 
explicitly).

Thanks for an help.

Andrew

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-07-30 14:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-30 14:32 [SH] ICE compiling pr34330 testcase for sh-linux-gnu Joern Rennecke
  -- strict thread matches above, loose matches on Subject: below --
2009-07-09 11:54 Andrew Stubbs
2009-07-09 18:12 ` Ian Lance Taylor
2009-07-30  8:27   ` Andrew Stubbs
2009-07-15  6:39 ` Maxim Kuvyrkov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).