https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55212

--- Comment #382 from Oleg Endo <olegendo at gcc dot gnu.org> ---
(In reply to Kazumoto Kojima from comment #381)
> (In reply to John Paul Adrian Glaubitz from comment #378)
> > I just tried a full bootstrap using that tree with all languages but Rust
> > and Go enabled and it fails with:
> > 
> > during RTL pass: subreg3
> > ../../gcc/ipa-sra.cc: In function 'void
> > {anonymous}::isra_read_edge_summary(lto_input_block*, cgraph_edge*)':
> > ../../gcc/ipa-sra.cc:2933:1: internal compiler error: in
> > decompose_multiword_subregs, at lower-subreg.cc:1731
> 
> Compression of the huge test case is still in progress.  It seems it happens
> for -O2 -fpic for the original test case.  A quick look at an intermediate
> test case with gdb shows that the compiler complains
> 
> (set (mem:QI (plus:SI (reg:SI 555)
>             (reg:SI 0 r0)) [0  S1 A8])
>     (subreg:QI (reg:DI 214 [ bp$word ]) 0))
> 
> can't be recognized.   I've missed that devel/sh-lra removed the following
> patterns
> 
> (define_insn "*mov<mode>_store_mem_index"
>   [(set (mem:QIHI
>               (plus:SI (match_operand:SI 0 "arith_reg_operand" "%r")
>                              (match_operand:SI 1 "arith_reg_operand" "z")))
>          (match_operand:QIHI 2 "arith_reg_operand" "r"))]
>   "TARGET_SH1 && ! TARGET_SH2A && sh_lra_p ()
>    && REG_P (operands[1]) && REGNO (operands[1]) == R0_REG"
>   "mov.<bw>   %2,@(%1,%0)"
>   [(set_attr "type" "store")])
> 
> (define_insn "*movsf_ie_store_mem_index"
>   [(set (mem:SF
>                (plus:SI (match_operand:SI 0 "arith_reg_operand" "%r")
>                               (match_operand:SI 1 "arith_reg_operand" "z")))
>            (match_operand:SF 2 "fp_arith_reg_operand" "f"))
>     (use (reg:SI FPSCR_MODES_REG))]
>   "TARGET_SH2E && sh_lra_p ()
>    && REG_P (operands[1]) && REGNO (operands[1]) == R0_REG"
>   "fmov.s    %2,@(%1,%0)"
>   [(set_attr "type" "store")])
> 
> (define_insn "*movsf_ie_load_mem_index"
>   [(set (match_operand:SF 0 "fp_arith_reg_operand" "=f")
>          (mem:SF
>                (plus:SI (match_operand:SI 1 "arith_reg_operand" "%r")
>                               (match_operand:SI 2 "arith_reg_operand" "z"))))
>    (use (reg:SI FPSCR_MODES_REG))]
>   "TARGET_SH2E && sh_lra_p ()
>    && REG_P (operands[2]) && REGNO (operands[2]) == R0_REG"
>   "fmov.s    @(%2,%1),%0"
>   [(set_attr "type" "load")])
> 
> required as no-clobber versions of the similar patterns.  The ICE in c#378
> is fixed here with adding the above patterns to devel/sh-lra.

OK, thanks.  So it was wrong to remove these after all.  I will modify the
corresponding commits and reinstate these patterns.


Instead of ...

&& REG_P (operands[1]) && REGNO (operands[1]) == R0_REG"

... could we also write it as... 

(define_predicate "hard_reg_r0"
  (and (match_code "reg")
       (match_test "REGNO (op) == R0_REG")))

(match_operand:SI 1 "hard_reg_r0" "z")))

... if you have a chance, can you please try?

Reply via email to