stride is always added to p so if it is aligned the alignment of p will never be lost
`is_aligned(a) && is_aligned(b)` is the same as `is_aligned(a | b)` as we are only interested in the low bits which must all be zero for it to be true.
all alignment checks involving strides in numpy already work this way (e.g. _IsAligned)