Index: libcfa/src/heap.cfa
===================================================================
--- libcfa/src/heap.cfa	(revision 47dd0d2c75578359efd1ebb654a94a61e5cc8a3d)
+++ libcfa/src/heap.cfa	(revision a3ade94ddb746f47182c794855a010a21a22fe48)
@@ -1233,34 +1233,22 @@
 	// Attempt to reuse existing storage.
 	HeapManager.Storage.Header * header = headerAddr( oaddr );
-	if ( header->kind.fake.alignment & 1 == 1 ) {		// old fake header ?
-		if ( unlikely( (uintptr_t)oaddr % nalign == 0) && // lucky match ?
-			 header->kind.fake.alignment <= nalign &&	// ok to leave LSB at 1
-			 nalign <= 128 ) {							// not too much alignment storage wasted ?
-
-			HeapManager.FreeHeader * freeElem;
-			size_t bsize, oalign;
-			headers( "resize", oaddr, header, freeElem, bsize, oalign );
-			size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
-
-			if ( size <= odsize && odsize <= size * 2 ) { // allow 50% wasted data storage
-				headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same)
-
-				header->kind.real.blockSize &= -2;		// turn off 0 fill
-				header->kind.real.size = size;			// reset allocation size
-				return oaddr;
-			} // if
-		} // if
-	} else {											// no old fake header
-		if ( nalign == libAlign() ) {					// no new fake header needed => try to reuse storage
-			HeapManager.FreeHeader * freeElem;
-			size_t bsize, oalign;
-			headers( "resize", oaddr, header, freeElem, bsize, oalign );
-			size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
-
-			if ( size <= odsize && odsize <= size * 2 ) { // allow 50% wasted data storage
-				header->kind.real.blockSize &= -2;		// turn off 0 fill
-				header->kind.real.size = size;			// reset allocation size
-				return oaddr;
-			} // if
+	if ( unlikely ( ( header->kind.fake.alignment & 1 == 1 &&	// old fake header ?
+				 (uintptr_t)oaddr % nalign == 0 && 				// lucky match ?
+				 header->kind.fake.alignment <= nalign &&		// ok to leave LSB at 1
+			 	 nalign <= 128 )								// not too much alignment storage wasted ?
+			||   ( header->kind.fake.alignment & 1 != 1 &&		// old real header ( aligned on libAlign ) ?
+				 nalign == libAlign() ) ) ) {					// new alignment also on libAlign
+
+		HeapManager.FreeHeader * freeElem;
+		size_t bsize, oalign;
+		headers( "resize", oaddr, header, freeElem, bsize, oalign );
+		size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
+
+		if ( size <= odsize && odsize <= size * 2 ) { // allow 50% wasted data storage
+			headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same)
+
+			header->kind.real.blockSize &= -2;		// turn off 0 fill
+			header->kind.real.size = size;			// reset allocation size
+			return oaddr;
 		} // if
 	} // if
@@ -1298,10 +1286,15 @@
 	headers( "realloc", oaddr, header, freeElem, bsize, oalign );
 
-	if ( oalign == nalign ) { // <= alignment and new alignment are same
-		return realloc( oaddr, size );
-	} // if
-	if ( oalign < nalign && (uintptr_t)oaddr % nalign == 0 && oalign > libAlign() ) { // <= alignment and new alignment happens to match, and oaddr has a fake header
+	// Attempt to reuse existing storage.
+	if ( unlikely ( ( header->kind.fake.alignment & 1 == 1 &&	// old fake header ?
+				 (uintptr_t)oaddr % nalign == 0 && 				// lucky match ?
+				 header->kind.fake.alignment <= nalign &&		// ok to leave LSB at 1
+			 	 nalign <= 128 )								// not too much alignment storage wasted ?
+			||   ( header->kind.fake.alignment & 1 != 1 &&		// old real header ( aligned on libAlign ) ?
+				 nalign == libAlign() ) ) ) {					// new alignment also on libAlign
+
 		headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same)
 		return realloc( oaddr, size );
+
 	} // if
 
