This series puts the statements that need to be vectorised into a "vec_basic_block" structure of linked stmt_vec_infos, and then puts pattern statements into this block rather than hanging them off the original scalar statement.
Partly this is clean-up, since making pattern statements more like first-class statements removes a lot of indirection. The diffstat for the series is: 7 files changed, 691 insertions(+), 978 deletions(-) It also makes it easier to do something approaching proper DCE on the scalar code (patch 10). However, the main motivation is to allow the result of an earlier pattern statement to be reused as the STMT_VINFO_RELATED_STMT for a later (non-pattern) statement. I have two current uses for this: (1) The way overwidening detection works means that we can sometimes be left with sequences of the form: type1 narrowed = ... + ...; // originally done in type2 type2 extended = (type2) narrowed; type3 truncated = (type3) extended; which cast_forwprop can simplify to: type1 narrowed = ... + ...; // originally done in type2 type3 truncated = (type3) narrowed; But if type3 == type1, we really want to replace truncated directly with narrowed. The current representation doesn't allow this. (2) For SVE extending loads, we want to look for: type1 narrow = *ptr; type2 extended = (type2) narrow; // only use of narrow replace narrow with: type2 tmp = .LOAD_EXT (ptr, ...); and replace extended directly with tmp. (Deleting narrow and replacing tmp with a .LOAD_EXT would move the location of the load and so wouldn't be safe in general.) The series doesn't do either of these things, it's just laying the groundwork. It applies on top of: https://gcc.gnu.org/ml/gcc-patches/2018-07/msg01308.html I tested each individual patch on aarch64-linux-gnu and the series as a whole on aarch64-linux-gnu with SVE, aarch64_be-elf and x86_64-linux-gnu. OK to install? Thanks, Richard