@@ -2928,62 +2928,59 @@ void VPInterleaveRecipe::execute(VPTransformState &State) {
2928
2928
assert (isPowerOf2_32 (InterleaveFactor) &&
2929
2929
" Unsupported deinterleave factor for scalable vectors" );
2930
2930
2931
- // Scalable vectors cannot use arbitrary shufflevectors (only splats),
2932
- // so must use intrinsics to deinterleave.
2933
-
2934
- SmallVector<Value *> DeinterleavedValues (InterleaveFactor);
2935
- DeinterleavedValues[0 ] = NewLoad;
2936
- // For the case of InterleaveFactor > 2, we will have to do recursive
2937
- // deinterleaving, because the current available deinterleave intrinsic
2938
- // supports only Factor of 2, otherwise it will bailout after first
2939
- // iteration.
2940
- // As we are deinterleaving, the values will be doubled until reachingt
2941
- // to the InterleaveFactor.
2942
- for (int NumVectors = 1 ; NumVectors < InterleaveFactor;
2943
- NumVectors *= 2 ) {
2944
- // deinterleave the elements within the vector
2945
- std::vector<Value *> TempDeinterleavedValues (NumVectors);
2946
- for (int I = 0 ; I < NumVectors; ++I) {
2947
- auto *DiTy = DeinterleavedValues[I]->getType ();
2948
- TempDeinterleavedValues[I] = State.Builder .CreateIntrinsic (
2949
- Intrinsic::vector_deinterleave2, DiTy, DeinterleavedValues[I],
2950
- /* FMFSource=*/ nullptr , " strided.vec" );
2951
- }
2952
- // Extract the deinterleaved values:
2953
- for (int I = 0 ; I < 2 ; ++I)
2954
- for (int J = 0 ; J < NumVectors; ++J)
2955
- DeinterleavedValues[NumVectors * I + J] =
2956
- State.Builder .CreateExtractValue (TempDeinterleavedValues[J],
2957
- I);
2931
+ // Scalable vectors cannot use arbitrary shufflevectors (only splats),
2932
+ // so must use intrinsics to deinterleave.
2933
+
2934
+ SmallVector<Value *> DeinterleavedValues (InterleaveFactor);
2935
+ DeinterleavedValues[0 ] = NewLoad;
2936
+ // For the case of InterleaveFactor > 2, we will have to do recursive
2937
+ // deinterleaving, because the current available deinterleave intrinsic
2938
+ // supports only Factor of 2, otherwise it will bailout after first
2939
+ // iteration.
2940
+ // As we are deinterleaving, the values will be doubled until reachingt
2941
+ // to the InterleaveFactor.
2942
+ for (int NumVectors = 1 ; NumVectors < InterleaveFactor; NumVectors *= 2 ) {
2943
+ // deinterleave the elements within the vector
2944
+ std::vector<Value *> TempDeinterleavedValues (NumVectors);
2945
+ for (int I = 0 ; I < NumVectors; ++I) {
2946
+ auto *DiTy = DeinterleavedValues[I]->getType ();
2947
+ TempDeinterleavedValues[I] = State.Builder .CreateIntrinsic (
2948
+ Intrinsic::vector_deinterleave2, DiTy, DeinterleavedValues[I],
2949
+ /* FMFSource=*/ nullptr , " strided.vec" );
2958
2950
}
2951
+ // Extract the deinterleaved values:
2952
+ for (int I = 0 ; I < 2 ; ++I)
2953
+ for (int J = 0 ; J < NumVectors; ++J)
2954
+ DeinterleavedValues[NumVectors * I + J] =
2955
+ State.Builder .CreateExtractValue (TempDeinterleavedValues[J], I);
2956
+ }
2959
2957
2960
2958
#ifndef NDEBUG
2961
- for (Value *Val : DeinterleavedValues)
2962
- assert (Val && " NULL Deinterleaved Value" );
2959
+ for (Value *Val : DeinterleavedValues)
2960
+ assert (Val && " NULL Deinterleaved Value" );
2963
2961
#endif
2964
- for (unsigned I = 0 , J = 0 ; I < InterleaveFactor; ++I) {
2965
- Instruction *Member = Group->getMember (I);
2966
- Value *StridedVec = DeinterleavedValues[I];
2967
- if (!Member) {
2968
- // This value is not needed as it's not used
2969
- static_cast <Instruction *>(StridedVec)->eraseFromParent ();
2970
- continue ;
2971
- }
2972
- // If this member has different type, cast the result type.
2973
- if (Member->getType () != ScalarTy) {
2974
- VectorType *OtherVTy = VectorType::get (Member->getType (), State.VF );
2975
- StridedVec =
2976
- createBitOrPointerCast (State.Builder , StridedVec, OtherVTy, DL);
2977
- }
2978
-
2979
- if (Group->isReverse ())
2980
- StridedVec =
2981
- State.Builder .CreateVectorReverse (StridedVec, " reverse" );
2982
-
2983
- State.set (VPDefs[J], StridedVec);
2984
- ++J;
2962
+ for (unsigned I = 0 , J = 0 ; I < InterleaveFactor; ++I) {
2963
+ Instruction *Member = Group->getMember (I);
2964
+ Value *StridedVec = DeinterleavedValues[I];
2965
+ if (!Member) {
2966
+ // This value is not needed as it's not used
2967
+ static_cast <Instruction *>(StridedVec)->eraseFromParent ();
2968
+ continue ;
2969
+ }
2970
+ // If this member has different type, cast the result type.
2971
+ if (Member->getType () != ScalarTy) {
2972
+ VectorType *OtherVTy = VectorType::get (Member->getType (), State.VF );
2973
+ StridedVec =
2974
+ createBitOrPointerCast (State.Builder , StridedVec, OtherVTy, DL);
2985
2975
}
2986
2976
2977
+ if (Group->isReverse ())
2978
+ StridedVec = State.Builder .CreateVectorReverse (StridedVec, " reverse" );
2979
+
2980
+ State.set (VPDefs[J], StridedVec);
2981
+ ++J;
2982
+ }
2983
+
2987
2984
return ;
2988
2985
}
2989
2986
0 commit comments