d687594 [X86][SSE] Attempt to match OP(SHUFFLE(X,Y),SHUFFLE(X,Y)) -> SHUFFLE(HOP(X,Y))

7 files Authored by Simon Pilgrim 3 years ago, Committed by Hans Wennborg 3 years ago,
    [X86][SSE] Attempt to match OP(SHUFFLE(X,Y),SHUFFLE(X,Y)) -> SHUFFLE(HOP(X,Y))
    
    An initial backend patch towards fixing the various poor HADD combines (PR34724, PR41813, PR45747 etc.).
    
    This extends isHorizontalBinOp to check if we have per-element horizontal ops (odd+even element pairs), but not in the expected serial order - in which case we build a "post shuffle mask" that we can apply to the HOP result, assuming we have fast-hops/optsize etc.
    
    The next step will be to extend the SHUFFLE(HOP(X,Y)) combines as suggested on PR41813 - accepting more post-shuffle masks even on slow-hop targets if we can fold it into another shuffle.
    
    Differential Revision: https://reviews.llvm.org/D83789
    
    (cherry picked from commit 182111777b4ec215eeebe8ab5cc2a324e2f055ff)