diff --git a/src/block_allocator.c b/src/block_allocator.c
index 90d11cc857f426f1c0566ca0fe21cf5956186d84..320218a36324ec4cca7cb7dc746c7276f30841bc 100644
--- a/src/block_allocator.c
+++ b/src/block_allocator.c
@@ -46,15 +46,6 @@ struct ba_block_header {
     struct ba_block_header * next;
 };
 
-#ifdef HAVE_VALGRIND_MACROS
-# ifndef VALGRIND_CREATE_MEMPOOL
-#  define VALGRIND_CREATE_MEMPOOL(a, b, c)
-#  define VALGRIND_MEMPOOL_ALLOC(a, p, l)    VALGRIND_MAKE_MEM_UNDEFINED((p), (l))
-#  define VALGRIND_MEMPOOL_FREE(a, p)	    VALGRIND_MAKE_MEM_NOACCESS((p), (a)->l.block_size)
-# endif
-#endif
-
-
 static struct ba_page * ba_alloc_page(struct block_allocator * a, int i) {
     struct ba_layout l = ba_get_layout(a, i);
     size_t n = l.offset + l.block_size + l.doffset;
@@ -78,9 +69,7 @@ static struct ba_page * ba_alloc_page(struct block_allocator * a, int i) {
     p->h.first = BA_BLOCKN(a->l, p, 0);
     p->h.first->next = BA_ONE;
     p->h.used = 0;
-#ifdef HAVE_VALGRIND_MACROS
-    VALGRIND_MAKE_MEM_NOACCESS((char*)p + l.doffset, n - l.doffset);
-#endif
+    PIKE_MEM_NA_RANGE((char*)p + l.doffset, n - l.doffset);
     return p;
 }
 
@@ -107,9 +96,7 @@ PMOD_EXPORT void ba_init_aligned(struct block_allocator * a, unsigned INT32 bloc
     a->l.alignment = alignment;
     memset(a->pages, 0, sizeof(a->pages));
     a->pages[0] = ba_alloc_page(a, 0);
-#ifdef HAVE_VALGRIND_MACROS
-    VALGRIND_CREATE_MEMPOOL(a, 0, 0);
-#endif
+    PIKE_MEMPOOL_CREATE(a);
 }
 
 PMOD_EXPORT void ba_destroy(struct block_allocator * a) {
@@ -183,10 +170,8 @@ PMOD_EXPORT void * ba_alloc(struct block_allocator * a) {
     }
 
     ptr = p->h.first;
-#ifdef HAVE_VALGRIND_MACROS
-    VALGRIND_MEMPOOL_ALLOC(a, ptr, a->l.block_size);
-    VALGRIND_MAKE_MEM_DEFINED(ptr, sizeof(struct ba_block_header));
-#endif
+    PIKE_MEMPOOL_ALLOC(a, ptr, a->l.block_size);
+    PIKE_MEM_RW_RANGE(ptr, sizeof(struct ba_block_header));
 
     p->h.used++;
 
@@ -203,19 +188,13 @@ PMOD_EXPORT void * ba_alloc(struct block_allocator * a) {
     if (ptr->next == BA_ONE) {
 	struct ba_layout l = ba_get_layout(a, a->alloc);
 	p->h.first = (struct ba_block_header*)((char*)ptr + a->l.block_size);
-#ifdef HAVE_VALGRIND_MACROS
-	VALGRIND_MEMPOOL_ALLOC(a, p->h.first, a->l.block_size);
-#endif
+	PIKE_MEMPOOL_ALLOC(a, p->h.first, a->l.block_size);
 	p->h.first->next = (struct ba_block_header*)(ptrdiff_t)!(p->h.first == BA_LASTBLOCK(l, p));
-#ifdef HAVE_VALGRIND_MACROS
-	VALGRIND_MEMPOOL_FREE(a, p->h.first);
-#endif
+	PIKE_MEMPOOL_FREE(a, p->h.first, a->l.block_size);
     } else {
 	p->h.first = ptr->next;
     }
-#ifdef HAVE_VALGRIND_MACROS
-    VALGRIND_MAKE_MEM_UNDEFINED(ptr, sizeof(struct ba_block_header));
-#endif
+    PIKE_MEM_WO_RANGE(ptr, sizeof(struct ba_block_header));
 
 #if PIKE_DEBUG
     if (a->l.alignment && (size_t)ptr & (a->l.alignment - 1)) {
@@ -288,9 +267,7 @@ found:
 	Pike_fatal("ptr %p not in any page.\n", ptr);
     }
 #endif
-#ifdef HAVE_VALGRIND_MACROS
-    VALGRIND_MEMPOOL_FREE(a, ptr);
-#endif
+    PIKE_MEMPOOL_FREE(a, ptr, a->l.block_size);
 }
 
 static void print_allocator(const struct block_allocator * a) {
diff --git a/src/interpret.c b/src/interpret.c
index 9dc2f2924798d0d843ac5257595e11ea9761f954..807353f434bb4b4e9c5ca03a47192379c1c5a1c5 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -298,13 +298,11 @@ use_malloc:
   return 0;	/* OK. */
 }
 
-static struct pike_frame *free_pike_frame = NULL;
+static struct pike_frame *free_pike_frame;
 
 PMOD_EXPORT void init_interpreter(void)
 {
-#ifdef HAVE_VALGRIND_MACROS
-  VALGRIND_CREATE_MEMPOOL(&free_pike_frame, 0, 0);
-#endif
+  PIKE_MEMPOOL_CREATE(&free_pike_frame);
   if (low_init_interpreter(Pike_interpreter_pointer)) {
     Pike_fatal("Out of memory initializing the interpreter stack.\n");
   }
@@ -1969,9 +1967,7 @@ PMOD_EXPORT void really_free_pike_frame( struct pike_frame *X )
     DO_IF_SECURITY( X->current_creds=0; )
   );
   X->next = free_pike_frame;
-#ifdef HAVE_VALGRIND_MACROS
-  VALGRIND_MEMPOOL_FREE(&free_pike_frame, X);
-#endif
+  PIKE_MEMPOOL_FREE(&free_pike_frame, X, sizeof(struct pike_frame));
   free_pike_frame = X;
 }
 
@@ -1981,14 +1977,10 @@ struct pike_frame *alloc_pike_frame(void)
     if( free_pike_frame )
     {
       res = free_pike_frame;
-#ifdef HAVE_VALGRIND_MACROS
-      VALGRIND_MEMPOOL_ALLOC(&free_pike_frame, res, sizeof(struct pike_frame));
-      VALGRIND_MAKE_MEM_DEFINED(&res->next, sizeof(void*));
-#endif
+      PIKE_MEMPOOL_ALLOC(&free_pike_frame, res, sizeof(struct pike_frame));
+      PIKE_MEM_RW_RANGE(&res->next, sizeof(void*));
       free_pike_frame = res->next;
-#ifdef HAVE_VALGRIND_MACROS
-      VALGRIND_MAKE_MEM_UNDEFINED(&res->next, sizeof(void*));
-#endif
+      PIKE_MEM_WO_RANGE(&res->next, sizeof(void*));
       res->refs=0;
       add_ref(res);	/* For DMALLOC... */
       res->flags=0;
diff --git a/src/pike_memory.h b/src/pike_memory.h
index 4b514d859c97f82b41c5e48fb5d555da34a03407..8cf0fb1ffe7e5e07e0259ecdee322be88f1cc071 100644
--- a/src/pike_memory.h
+++ b/src/pike_memory.h
@@ -85,6 +85,17 @@
 #define PIKE_MEM_NOT_DEF_RANGE(addr, bytes)				\
   VALGRIND_CHECK_MEM_IS_DEFINED(addr, bytes)
 
+#ifdef VALGRIND_CREATE_MEMPOOL
+# define PIKE_MEMPOOL_CREATE(a)		VALGRIND_CREATE_MEMPOOL(a, 0, 0)
+# define PIKE_MEMPOOL_ALLOC(a, p, l)	VALGRIND_MEMPOOL_ALLOC(a, p, l)
+# define PIKE_MEMPOOL_FREE(a, p, l)	VALGRIND_MEMPOOL_FREE(a, p)
+#else
+/* somewhat functional alternatives to mempool macros */
+# define PIKE_MEMPOOL_CREATE(a)
+# define PIKE_MEMPOOL_ALLOC(a, p, l)    PIKE_MEM_WO_RANGE(p, l)
+# define PIKE_MEMPOOL_FREE(a, p, l)	PIKE_MEM_NA_RANGE(p, l)
+#endif
+
 #else  /* !HAVE_VALGRIND_MACROS */
 
 #define PIKE_MEM_NA(lvalue)		do {} while (0)
@@ -100,6 +111,9 @@
 #define PIKE_MEM_NOT_ADDR_RANGE(addr, bytes) 0
 #define PIKE_MEM_NOT_DEF(lvalue)	0
 #define PIKE_MEM_NOT_DEF_RANGE(addr, bytes) 0
+#define PIKE_MEMPOOL_CREATE(a)
+#define PIKE_MEMPOOL_ALLOC(a, p, l)
+#define PIKE_MEMPOOL_FREE(a, p, l)
 
 #endif	/* !HAVE_VALGRIND_MACROS */