diff --git a/include/linux/measuremore.h b/include/linux/measuremore.h
index 9a88781070ae1a09fa6c3144f24c983a34ebfbac..7dff071fae1942e817764e8bb9a9bb6023635918 100644
--- a/include/linux/measuremore.h
+++ b/include/linux/measuremore.h
@@ -36,6 +36,8 @@ extern struct checkpoint_record *current_cpr;
 extern struct checkpoint_record *current_cpr_limit;
 
 static __always_inline void memo_checkpoint(const char *name) {
+	asm volatile("" ::: "memory");
+
 	/* The following catches both the case when no run hast been started
 	 * (both are NULL) and when we are attempting to record too many
 	 * checkpoints. */
@@ -43,7 +45,6 @@ static __always_inline void memo_checkpoint(const char *name) {
 		return;
 	}
 
-	asm volatile("" ::: "memory");
 #ifdef CONFIG_MEASUREMORE_TIMESTAMP_TYPE_PMCCNTR
 	pmccntr_read(current_cpr->pmccntr_ts.value);
 #endif
@@ -56,7 +57,6 @@ static __always_inline void memo_checkpoint(const char *name) {
 #ifdef CONFIG_MEASUREMORE_TIMESTAMP_TYPE_NSTIMEOFDAY
 	getnstimeofday(&current_cpr->nstimeofday);
 #endif
-	asm volatile("" ::: "memory");
 
 	current_cpr->name_blob.data = (void *) name;
 
@@ -66,6 +66,8 @@ static __always_inline void memo_checkpoint(const char *name) {
 	 * so we can simply drop the rows where a checkpoint is missing in our
 	 * scripts. */
 	current_cpr++;
+
+	asm volatile("" ::: "memory");
 }
 
 #endif /* MEASUREMORE_H */