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.