[llvm-dev] LoopVectorizer: shufflevectors

Jonas Paulsson via llvm-dev llvm-dev at lists.llvm.org
Tue Sep 4 05:14:46 PDT 2018


Hi,

I have been discussing a bit with Sanjay on how to handle the poor 
sequences of shufflevector instructions produced by the loop vectorizer 
and he suggested we bring this up on llvm-dev.

I have run into this in the past also and it surprised me to again see 
(on SystemZ) that the vectorized loop did many seemingly unnecessary 
shuffles. In this case (see 
https://bugs.llvm.org/show_bug.cgi?id=38792), one group of interleaved 
loads got shuffled into vector operands, to then be used by an 
interleaved group of stores, which in turn did its shuffling. The loop 
vectorizer did not attempt to combine these shuffles, and unfortunately 
no later pass did so either.

This seems to be an issue which is due to keeping instcombine simple and 
fast, as well as a conservativeness to not produce any new shuffles not 
already in the input program (see comment in 
InstCombiner::visitShuffleVectorInst). For some reason a bit unclear to 
me the backend will get into trouble then.

Should improved optimization of shufflevector instructions handle all of 
them globally, or just the new ones produced by the vectorizers? At 
least in the code produced by the vectorizers, it seems fair to combine 
the shuffles to minimize them. If we want to limit this to just 
auto-vectorized code, then maybe this could be done with some common 
utility called by a vectorizer on its result? If we on the other hand 
want to optimize everything, a new separate IR pass for vector ops could 
be made to run after the vectorizers just once. Such a new pass could 
handle vector instructions in general more extensively than instcombine. 
Would it then be possible to avoid the current problems the backend is 
having?

Or does this really have to be done on the DAG by each backend? Or 
perhaps this is really just a local issue with the loop vectorizer?

Please fill in on how to best proceed with improving the loop 
vectorizers code.

Jonas



More information about the llvm-dev mailing list