On Wednesday 05 September 2012 17:40:23 Steven Bosscher wrote:
> On Wed, Sep 5, 2012 at 3:18 PM, Matthew Gretton-Dann
> 
> <matthew.gretton-d...@linaro.org> wrote:
> > On 5 September 2012 13:45, Richard Earnshaw <rearn...@arm.com> wrote:
> >> On 05/09/12 13:02, Steven Bosscher wrote:
> >>> On Wed, Sep 5, 2012 at 1:42 PM, Matthew Gretton-Dann wrote:
> >>>> Whilst this fix works for this particular case I am not sure it is the
> >>>> best fix for the general issue, and so if others have a better idea how
> >>>> to fix this I would be very happy.
> >>> 
> >>> postreload-gcse.c is broken in "interesting" ways. Look at this gem for
> >>> example:
> >>> 
> >>> static bool
> >>> reg_changed_after_insn_p (rtx x, int cuid)
> >>> {
> >>> 
> >>>   unsigned int regno, end_regno;
> >>>   
> >>>   regno = REGNO (x);
> >>>   end_regno = END_HARD_REGNO (x);
> >>>   do
> >>>   
> >>>     if (reg_avail_info[regno] > cuid)
> >>>     
> >>>       return true;
> >>>   
> >>>   while (++regno < end_regno);
> >>>   return false;
> >>> 
> >>> }
> >>> 
> >>> So the more conservative the fix, the better :-)
> > 
> > I suppose removing the pass is too conservative :-)
> > 
> >>> The patch looks correct to me. But perhaps the pass should just punt
> >>> on blocks not ending in a simple jump in
> >>> bb_has_well_behaved_predecessors?
> > 
> > By 'simple jump' you mean any block with at most only EDGE_FALLTHRU on the
> > edge?
> No, I mean using the onlyjump_p predicate.

Again sorry for the delay.  Attached is an updated patch using the onlyjump_p 
predicate as suggested by Steven.

Tested cross arm-none-linux-gnueabi with QEmu.

OK for trunk?

Thanks,

Matt

gcc/ChangeLog:

2012-09-25  Matthew Gretton-Dann  <matthew.gretton-d...@arm.com>

        * postreload-gcse.c (bb_has_well_behaved_predecessors): Don't handle 
blocks
        that end in a non-simple jump.

-- 
Matthew Gretton-Dann
Linaro Toolchain Working Group
matthew.gretton-d...@linaro.org
diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c
index b9e9f25..412c8fc 100644
--- a/gcc/postreload-gcse.c
+++ b/gcc/postreload-gcse.c
@@ -925,6 +925,9 @@ bb_has_well_behaved_predecessors (basic_block bb)
 
       if (JUMP_TABLE_DATA_P (BB_END (pred->src)))
        return false;
+
+      if (onlyjump_p (BB_END (pred->src)))
+       return false;
     }
   return true;
 }

Reply via email to