diff --git a/lightmotif/src/dense.rs b/lightmotif/src/dense.rs
index edae74d8f7f363184face8f394a2cfeac2e71079..9ec9c98f0bb9c671c6781f6617a48eaf3961babf 100644
--- a/lightmotif/src/dense.rs
+++ b/lightmotif/src/dense.rs
@@ -87,7 +87,7 @@ impl<T: Default + Copy, C: Unsigned, A: Unsigned + PowerOfTwo> DenseMatrix<T, C,
 
         // compute offset to aligned memory
         m.offset = 0;
-        while m.data[m.offset..].as_ptr() as usize % c > 0 {
+        while m.data[m.offset..].as_ptr() as usize & (A::USIZE - 1) > 0 {
             m.offset += 1
         }
 
@@ -168,7 +168,7 @@ impl<T: Default + Copy, C: Unsigned, A: Unsigned + PowerOfTwo> DenseMatrix<T, C,
             self.data.resize_with((rows + 1) * c, T::default);
             // Compute offset to aligned memory
             self.offset = 0;
-            while self.data[self.offset..].as_ptr() as usize % c > 0 {
+            while self.data[self.offset..].as_ptr() as usize & (A::USIZE - 1) > 0 {
                 self.offset += 1
             }
             // Copy data in case alignment offset changed
@@ -232,7 +232,9 @@ impl<T: Default + Copy, C: Unsigned, A: Unsigned + PowerOfTwo> Index<usize>
         let c = self.stride();
         let row = self.offset + c * index;
         debug_assert!(row + C::USIZE <= self.data.len());
-        &self.data[row..row + C::USIZE]
+        let row = &self.data[row..row + C::USIZE];
+        debug_assert_eq!(row.as_ptr() as usize & (A::USIZE - 1), 0);
+        row
     }
 }
 
@@ -244,7 +246,9 @@ impl<T: Default + Copy, C: Unsigned, A: Unsigned + PowerOfTwo> IndexMut<usize>
         let c = self.stride();
         let row = self.offset + c * index;
         debug_assert!(row + C::USIZE <= self.data.len());
-        &mut self.data[row..row + C::USIZE]
+        let row = &mut self.data[row..row + C::USIZE];
+        debug_assert_eq!(row.as_ptr() as usize & (A::USIZE - 1), 0);
+        row
     }
 }