@@ -439,19 +439,26 @@ struct assign_impl<Derived1, Derived2, SliceVectorizedTraversal, NoUnrolling, Ve
439439 typedef typename Derived1::Index Index;
440440 static inline void run (Derived1 &dst, const Derived2 &src)
441441 {
442- typedef packet_traits<typename Derived1::Scalar> PacketTraits;
442+ typedef typename Derived1::Scalar Scalar;
443+ typedef packet_traits<Scalar> PacketTraits;
443444 enum {
444445 packetSize = PacketTraits::size,
445446 alignable = PacketTraits::AlignedOnScalar,
446- dstAlignment = alignable ? Aligned : int (assign_traits<Derived1,Derived2>::DstIsAligned) ,
447+ dstIsAligned = assign_traits<Derived1,Derived2>::DstIsAligned,
448+ dstAlignment = alignable ? Aligned : int (dstIsAligned),
447449 srcAlignment = assign_traits<Derived1,Derived2>::JointAlignment
448450 };
451+ const Scalar *dst_ptr = &dst.coeffRef (0 ,0 );
452+ if ((!bool (dstIsAligned)) && (Index (dst_ptr) % sizeof (Scalar))>0 )
453+ {
454+ // the pointer is not aligend-on scalar, so alignment is not possible
455+ return assign_impl<Derived1,Derived2,DefaultTraversal,NoUnrolling>::run (dst, src);
456+ }
449457 const Index packetAlignedMask = packetSize - 1 ;
450458 const Index innerSize = dst.innerSize ();
451459 const Index outerSize = dst.outerSize ();
452460 const Index alignedStep = alignable ? (packetSize - dst.outerStride () % packetSize) & packetAlignedMask : 0 ;
453- Index alignedStart = ((!alignable) || assign_traits<Derived1,Derived2>::DstIsAligned) ? 0
454- : internal::first_aligned (&dst.coeffRef (0 ,0 ), innerSize);
461+ Index alignedStart = ((!alignable) || bool (dstIsAligned)) ? 0 : internal::first_aligned (dst_ptr, innerSize);
455462
456463 for (Index outer = 0 ; outer < outerSize; ++outer)
457464 {
0 commit comments