On Mon, Jun 09, 2025 at 04:42:49PM +0100, Richard Sandiford wrote:
> Stafford Horne <sho...@gmail.com> writes:
> > On Fri, Jun 06, 2025 at 04:41:21PM +0100, Stafford Horne wrote:
> >> On Fri, Jun 06, 2025 at 04:20:10PM +0100, Richard Sandiford wrote:
> >> > Stafford Horne <sho...@gmail.com> writes:
> >> > > Hello,
> >> > >
> >> > > This seems to be causing a build regression on the or1k port.
> >> > >
> >> > > I have not quite figured it out yet but I have bisected to this commit.
> >> > >
> >> > > The failure is as below, this seems to be caused by the cstoresi4 
> >> > > instruction produced by
> >> > > or1k.md.  So I think its likely something we are doing funny in the 
> >> > > port.
> >> > >
> >> > > Thanks to Jeff for pointing this out.  If you have any idea let me 
> >> > > know.
> >> > >
> >> > > Log:
> >> > >
> >> > >     during RTL pass: ce1
> >> > >     dump file: libgcc2.c.286r.ce1
> >> > >     /home/shorne/work/gnu-toolchain/gcc/libgcc/libgcc2.c: In function 
> >> > > '__muldi3':
> >> > >     /home/shorne/work/gnu-toolchain/gcc/libgcc/libgcc2.c:538:1: 
> >> > > internal compiler error: in emit_move_multi_word, at expr.cc:4492
> >> > >       538 | }
> >> > >          | ^
> >> > >     0x1b094df internal_error(char const*, ...)
> >> > >            
> >> > > /home/shorne/work/gnu-toolchain/gcc/gcc/diagnostic-global-context.cc:517
> >> > >     0x6459c1 fancy_abort(char const*, int, char const*)
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/diagnostic.cc:1815
> >> > >     0x473a2e emit_move_multi_word
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/expr.cc:4492
> >> > >     0x93fd7d emit_move_insn(rtx_def*, rtx_def*)
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/expr.cc:4746
> >> > >     0x9175f1 copy_to_reg(rtx_def*)
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/explow.cc:630
> >> > >     0xd18977 gen_lowpart_general(machine_mode, rtx_def*)
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/rtlhooks.cc:56
> >> > >     0x9414c7 convert_mode_scalar
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/expr.cc:818
> >> > >     0x9421a1 convert_modes(machine_mode, machine_mode, rtx_def*, int)
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/expr.cc:961
> >> > >     0xc0afa0 prepare_operand(insn_code, rtx_def*, int, machine_mode, 
> >> > > machine_mode, int)
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/optabs.cc:4637
> >> > >     0xc0b33a prepare_cmp_insn
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/optabs.cc:4538
> >> > >     0xc0f0dd emit_conditional_move(rtx_def*, rtx_comparison, rtx_def*, 
> >> > > rtx_def*, machine_mode, int)
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/optabs.cc:5098
> >> > >     0x192cc7b noce_emit_cmove
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:1777
> >> > >     0x193365b try_emit_cmove_seq
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:3410
> >> > >     0x193365b noce_convert_multiple_sets_1
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:3705
> >> > >     0x1933c71 noce_convert_multiple_sets
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:3496
> >> > >     0x1938687 noce_process_if_block
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:4045
> >> > >     0x1938687 noce_find_if_block
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:4726
> >> > >     0x1938687 find_if_header
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:4931
> >> > >     0x1938687 if_convert
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:6078
> >> > >     0x1938d01 rest_of_handle_if_conversion
> >> > >            /home/shorne/work/gnu-toolchain/gcc/gcc/ifcvt.cc:6143
> >> > >
> >> > > -Stafford
> >> > 
> >> > Can you attach the .i?
> >> 
> >> Sure please find attached, I can reproduce with the or1k compiler using:
> >> 
> >>   $HOME/work/gnu-toolchain/build-gcc/./gcc/cc1 -O2  __muldi3.i
> >> 
> >> I am still debugging, but I notice when reverting the patch the compiler 
> >> never
> >> goes to emit_move_multi_word().  I am trying to work backwards as to where 
> >> it goes
> >> different, it's just taking a bit of time as I haven't debugged GCC ICE's 
> >> for a
> >> while.
> >
> > I made some progress on this.  In openRISC we generate cstoresi4 with 
> > special
> > register SR_F (condition flag) bit register.
> >
> > This is represented as (reg:BI 34 ?sr_f).
> >
> > The RTL produced for cstoresi4 becomes something like:
> >
> >      // The compare
> >      (insn 49 48 50 (set (reg:BI 34 ?sr_f)
> >           (leu:BI (reg/v:SI 68 [ __x2D.6783 ])
> >               (reg/v:SI 69 [ __x1D.6782 ]))) 
> > "/home/shorne/work/gnu-toolchain/gcc/libgcc/libgcc2.c":532:22 -1
> >        (nil)
> >      // The conditional branch
> >      (jump_insn 50 49 0 (set (pc)
> >          (if_then_else (ne (reg:BI 34 ?sr_f)
> >                  (const_int 0 [0]))
> >              (label_ref 0)
> >              (pc))) 
> > "/home/shorne/work/gnu-toolchain/gcc/libgcc/libgcc2.c":532:22 -1
> >       (int_list:REG_BR_PROB 536870916 (nil)))
> >
> > During ce1 the try_emit_cmove_seq would try to convert (reg:BI 34 ?sr_f) to 
> > SI.
> > Before this patch it was done in gen_lowpart_general by
> > simplify_context::simplify_gen_subreg.
> >
> > The simplity to subreg operation would convert:
> >   (reg:BI 34 ?sr_f)
> >
> > To:
> >   (subreg:SI (reg:BI 34 ?sr_f) 0)
> >
> > But now the call to validate_subreg is returning false and 
> > simplify_gen_subreg
> > returns NULL_RTX, this causes gen_lowpart_general to try to do copy_to_reg,
> > which fails.
> 
> I'm not sure how the current openRISC model is supposed to work.
> It seems that SR[F] only allows BImode, but there is no movbi,
> and thus no way of moving anything to or from the flags in BImode.
> Thus the only permitted accesses to SR[F] are the hard-coded uses
> in the .md patterns, all of which need to be :BI rather than :SI.
> I'm not sure in those circumstances how cstoresi4 (which expects
> everything in SImode) can apply to SR[F] results.  Or is the point
> that it's not supposed to?

Yes, that's right.  SR[F] is only BI mode, and it acts just as a intermediary
for the RTL to tie the comparison operations to the branch/cmove ops.  So, I
have doubts that my patch to re-allow subregs is correct.

The instrctuions that use SR[F] are, 'l.cmov rd,ra,rb' (rd = SR[F] ? ra : rb)
and conditional branch instructions (l.bf / l.bnf).

I will see if there is a way to steer the ce1 pass away from attempting to
subreg/move the SR[F] condition and do a possible 'l.cmov'.

-Stafford

Reply via email to