diff --git a/control/descriptor.h b/control/descriptor.h
index 6bf6d9a81ad9cb57458207b500b45b8fdc0bdc3d..dda8fa71906169a3dde202e670e27c6c1c70467b 100644
--- a/control/descriptor.h
+++ b/control/descriptor.h
@@ -233,33 +233,41 @@ inline static int chameleon_desc_islocal( const CHAM_desc_t *A, int m, int n )
  * CHAMELEON_ACCESS_RW(C, Cm, Cn)
  * CHAMELEON_END_ACCESS_DECLARATION
  */
-#define CHAMELEON_BEGIN_ACCESS_DECLARATION { \
-    unsigned __chameleon_need_submit = 0; \
+#define CHAMELEON_BEGIN_ACCESS_DECLARATION {    \
+    unsigned __chameleon_need_exec = 0;         \
+    unsigned __chameleon_need_submit = 0;       \
     RUNTIME_BEGIN_ACCESS_DECLARATION
 
-#define CHAMELEON_ACCESS_R(A, Am, An) do { \
-    if (chameleon_desc_islocal(A, Am, An)) __chameleon_need_submit = 1; \
-    RUNTIME_ACCESS_R(A, Am, An); \
-} while(0)
-
-#define CHAMELEON_ACCESS_W(A, Am, An) do { \
-    if (chameleon_desc_islocal(A, Am, An)) __chameleon_need_submit = 1; \
-    RUNTIME_ACCESS_W(A, Am, An); \
-} while(0)
-
-#define CHAMELEON_ACCESS_RW(A, Am, An) do { \
-    if (chameleon_desc_islocal(A, Am, An)) __chameleon_need_submit = 1; \
-    RUNTIME_ACCESS_RW(A, Am, An); \
-} while(0)
-
-#define CHAMELEON_RANK_CHANGED(rank) do {\
-    __chameleon_need_submit = 1; \
-    RUNTIME_RANK_CHANGED(rank); \
-} while (0)
-
-#define CHAMELEON_END_ACCESS_DECLARATION \
-    RUNTIME_END_ACCESS_DECLARATION; \
-    if (!__chameleon_need_submit) return; \
+#define CHAMELEON_ACCESS_R(A, Am, An) do {                              \
+        if (chameleon_desc_islocal(A, Am, An)) __chameleon_need_submit = 1; \
+        RUNTIME_ACCESS_R(A, Am, An);                                    \
+    } while(0)
+
+#define CHAMELEON_ACCESS_W(A, Am, An) do {              \
+        if (chameleon_desc_islocal(A, Am, An)) {        \
+            __chameleon_need_exec = 1;                  \
+            __chameleon_need_submit = 1;                \
+        }                                               \
+        RUNTIME_ACCESS_W(A, Am, An);                    \
+    } while(0)
+
+#define CHAMELEON_ACCESS_RW(A, Am, An) do {             \
+        if (chameleon_desc_islocal(A, Am, An)) {        \
+            __chameleon_need_exec = 1;                  \
+            __chameleon_need_submit = 1;                \
+        }                                               \
+        RUNTIME_ACCESS_RW(A, Am, An);                   \
+    } while(0)
+
+#define CHAMELEON_RANK_CHANGED(rank) do {       \
+        __chameleon_need_submit = 1;            \
+        RUNTIME_RANK_CHANGED(rank);             \
+    } while (0)
+
+#define CHAMELEON_END_ACCESS_DECLARATION        \
+    RUNTIME_END_ACCESS_DECLARATION;             \
+    if (!__chameleon_need_submit) return;       \
+    (void)__chameleon_need_exec;                \
 }
 
 #ifdef __cplusplus