add ei_posix_memalign_realloc
diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h
index 5739f7e..b9c879e 100644
--- a/Eigen/src/Core/util/Memory.h
+++ b/Eigen/src/Core/util/Memory.h
@@ -99,27 +99,26 @@
 #if EIGEN_HAS_MM_MALLOC
 inline void* ei_mm_realloc(void *ptr, size_t size, size_t old_size)
 {
-  // 0. Check if size==0 and act according to the standard.
-  if (ptr!=0 && size==0)
+  // 0. Check if size==0 and act according to the standard, which says that
+  // for size==0, the object pointer (i.e. ptr) should be freed.
+  if (size==0)
   {
     _mm_free(ptr);
-    return NULL;
+    return 0;
   }
 
   // 1. Allocate new memory
   void* newptr = _mm_malloc(size,16);
 
   // 2. Verify the allocation success
-  // Testing for size!=0 is important since the standard says that 
-  // for size==0, the object pointer (i.e. ptr) should be freed.
-  if (newptr == NULL) 
+  if (newptr == 0) 
   { 
     /*errno = ENOMEM;*/ // according to the standard we should set errno = ENOMEM
-    return NULL; 
+    return 0; 
   }
 
   // 3. Copy the overlapping data and free the old data
-  if (ptr != NULL) 
+  if (ptr != 0) 
   {
     std::memcpy(newptr, ptr, std::min(size,old_size));
     _mm_free(ptr);
@@ -127,7 +126,37 @@
 
   return newptr;
 }
-#endif
+#endif // EIGEN_HAS_MM_MALLOC
+
+#if EIGEN_HAS_POSIX_MEMALIGN
+inline void* ei_posix_memalign_realloc(void *ptr, size_t size, size_t old_size)
+{
+  // 0. Check if size==0 and act according to the standard, which says that
+  // for size==0, the object pointer (i.e. ptr) should be freed.
+  if (size==0)
+  {
+    free(ptr);
+    return 0;
+  }
+
+  // 1. Allocate new memory and verify the allocation success
+  void *newptr;
+  if(posix_memalign(&newptr, 16, size))
+  {
+    /*errno = ENOMEM;*/ // according to the standard we should set errno = ENOMEM
+    return 0;
+  }
+
+  // 2. Copy the overlapping data and free the old data
+  if (ptr != 0)
+  {
+    std::memcpy(newptr, ptr, std::min(size,old_size));
+    free(ptr);
+  }
+
+  return newptr;
+}
+#endif // EIGEN_HAS_POSIX_MEMALIGN
 
 /** \internal allocates \a size bytes. The returned pointer is guaranteed to have 16 bytes alignment.
   * On allocation error, the returned pointer is null, and if exceptions are enabled then a std::bad_alloc is thrown.
@@ -245,15 +274,15 @@
 #if !EIGEN_ALIGN
   result = realloc(ptr,new_size);
 #elif EIGEN_MALLOC_ALREADY_ALIGNED
-  result =realloc(ptr,new_size);
+  result = realloc(ptr,new_size);
 #elif EIGEN_HAS_POSIX_MEMALIGN
-  realloc(ptr,new_size);
+  result = ei_posix_memalign_realloc(ptr,new_size,old_size);
 #elif EIGEN_HAS_MM_MALLOC
-#if defined(_MSC_VER) && defined(_mm_free)
-  result = _aligned_realloc(ptr,new_size,16);
-#else
-  result = ei_mm_realloc(ptr,new_size,old_size);
-#endif
+  #if defined(_MSC_VER) && defined(_mm_free)
+    result = _aligned_realloc(ptr,new_size,16);
+  #else
+    result = ei_mm_realloc(ptr,new_size,old_size);
+  #endif
 #elif defined(_MSC_VER)
   result = _aligned_realloc(ptr,new_size,16);
 #else