On Wed, 23 Nov 2016, Thomas Preudhomme wrote:

> Hi,
> 
> In its current form, when the bswap optimization pass recognizes a load in a
> specific endianness it assumes that all smaller loads in the original
> expression are part of a linear chain of basic block (ie they are either in
> the same basic block or there is no conditional branching in the blocks
> involved). The assumptions is used when replacing the original set of loads by
> a new wider load: that load is always placed just before the original load
> with the smallest address. This can mean accessing passed the end of an object
> when the other loads of the original expression are executed conditionally
> because the code would be changed to a wider load unconditionally. Please see
> initial comment in PR77673 for the problem in action.
> 
> This patch changes the pass to always select the load in the original
> expression in the most postdominated basic block of all loads as the location
> where to insert the new load. It also checks that this location postdominates
> the final statement of the load computation in the original expression. These
> two checks together with the fact that there is necessarily a flow path that
> includes all the loads and the computing expression (otherwise the
> expression's value would be undefined) ensure that (1) the new load is made if
> all original loads would have been made and (ii) the load is always made when
> the computing expression would be executed.
> 
> ChangeLog entry is as follows:
> 
> *** gcc/ChangeLog ***
> 
> 2016-11-22  Thomas Preud'homme  <thomas.preudho...@arm.com>
> 
>         PR tree-optimization/77673
>         * tree-ssa-math-opts.c (struct symbolic_number): Add new src field.
>         (init_symbolic_number): Initialize src field from src parameter.
>         (perform_symbolic_merge): Select most dominated statement as the
>         source statement.  Set src field of resulting n structure from the
>         input src with the lowest address.
>         (find_bswap_or_nop): Rename source_stmt into ins_stmt.
>         (bswap_replace): Rename src_stmt into ins_stmt.  Initially get source
>         of load from src field rather than insertion statement.  Cancel
>         optimization if statement analyzed is not dominated by the insertion
>         statement.
>         (pass_optimize_bswap::execute): Rename src_stmt to ins_stmt.  Compute
>         dominance information.
> 
> 
> *** gcc/testsuite/ChangeLog ***
> 
> 2016-11-22  Thomas Preud'homme  <thomas.preudho...@arm.com>
> 
>         PR tree-optimization/77673
>         * gcc.dg/pr77673.c: New test.
> 
> 
> Bootstrapped on arm-linux-gnueabihf and x86_64-linux-gnu with regression
> testsuite coming back clean in both case.
> 
> 
> Is this ok for trunk?

Ok.

Thanks,
Richard.

Reply via email to