[PATCH] D134377: [SLP]Try to emit canonical shuffle with undef operand.

Alexey Bataev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 28 09:38:23 PDT 2022


ABataev added inline comments.


================
Comment at: llvm/test/Transforms/SLPVectorizer/X86/PR35865.ll:15
+; CHECK-NEXT:    [[VECINS_I_5_I1:%.*]] = shufflevector <8 x i32> [[TMP6]], <8 x i32> poison, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef>
+; CHECK-NEXT:    [[TMP7:%.*]] = freeze <8 x i32> [[VECINS_I_5_I1]]
 ; CHECK-NEXT:    ret void
----------------
vdmitrie wrote:
> I'm not sure I understand well why freeze is generated here. I likely missed something but the LangRef says:
> "If the shuffle mask is undefined, the result vector is undefined. If the shuffle mask selects an undefined element from one of the input vectors, the resulting element is undefined. An undefined element in the mask vector specifies that the resulting element is undefined. An undefined element in the mask vector prevents a poisoned vector element from propagating."
> So here the first two lanes of VECINS_I_5_I1 are taken from TMP6, all the rest is undef. The for TMP6 the first two lanes taken from TMP5, all the rest of TM5 is undef, TMP5 is a bitcast of TMP4, both lines of which are normal values. It means that all lanes of VECINS_I_5_I1 are either normal values or undef. So why freeze is here?
> 
> It would be nice if you extend patch description with some information about what is deemed to be a canonical form of a shuffle.
It is going to be changed soon to be poisoned instead of undefined.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D134377/new/

https://reviews.llvm.org/D134377



More information about the llvm-commits mailing list