diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1d292a9084f0749f5f778cbbfa447ba4b957dd32..c7d6eef21ee1892a7a0976681b3fa775956f4cbe 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -232,6 +232,13 @@ if(CHAMELEON_SCHED_STARPU)
         message("-- ${BoldGreen}CHAMELEON_SIMULATION is set to OFF, turn it ON to use"
             " SIMULATION mode (only with StarPU compiled with SimGrid)${ColourReset}")
     endif()
+    option(CHAMELEON_ENABLE_PRUNING_STATS "Enable pruning statistics" OFF)
+    if (NOT CHAMELEON_ENABLE_PRUNING_STATS)
+        message("-- ${BoldGreen}CHAMELEON_ENABLE_PRUNING_STATS is set to OFF, turn it ON to build pruning statistics${ColourReset}")
+    endif()
+    if(CHAMELEON_ENABLE_PRUNING_STATS)
+        add_definitions(-DCHAMELEON_ENABLE_PRUNING_STATS)
+    endif(CHAMELEON_ENABLE_PRUNING_STATS)
 endif()
 
 # Initially we need to generate files for different precisions
diff --git a/include/runtime.h b/include/runtime.h
index 70b18645ce8ba288c562ded4ef4677dfb5d1b6c0..ff6728d68628b9846cdbf411a7dd66e7a5348c2e 100644
--- a/include/runtime.h
+++ b/include/runtime.h
@@ -126,6 +126,9 @@ double RUNTIME_get_time();
 void RUNTIME_start_profiling();
 void RUNTIME_stop_profiling();
 
+void RUNTIME_start_stats();
+void RUNTIME_stop_stats();
+
 #if defined(PRECISION_z)
 void RUNTIME_zdisplay_allprofile ();
 void RUNTIME_zdisplay_oneprofile (MORSE_kernel_t);
diff --git a/runtime/parsec/control/runtime_profiling.c b/runtime/parsec/control/runtime_profiling.c
index ae25f517efec8f2edc923e2ab687bb5313d4dfb1..1062462ce8a79b7352efe7aa342890033b9c3d49 100644
--- a/runtime/parsec/control/runtime_profiling.c
+++ b/runtime/parsec/control/runtime_profiling.c
@@ -88,6 +88,16 @@ void RUNTIME_stop_profiling()
     morse_warning("RUNTIME_stop_profiling()", "FxT profiling is not available with PaRSEC\n");
 }
 
+void RUNTIME_start_stats()
+{
+    morse_warning("RUNTIME_start_stats()", "pruning stats are not available with PaRSEC\n");
+}
+
+void RUNTIME_stop_stats()
+{
+    morse_warning("RUNTIME_stop_stats()", "pruning stats are not available with PaRSEC\n");
+}
+
 void RUNTIME_schedprofile_display(void)
 {
     morse_warning("RUNTIME_schedprofile_display(parsec)", "Scheduler profiling is not available with PaRSEC\n");
diff --git a/runtime/quark/control/runtime_profiling.c b/runtime/quark/control/runtime_profiling.c
index 76afcc2671faa9172673931eb8eda80df0ad95b4..0db7e55137b161719747d2d3f4866a4288167256 100644
--- a/runtime/quark/control/runtime_profiling.c
+++ b/runtime/quark/control/runtime_profiling.c
@@ -103,6 +103,16 @@ void RUNTIME_stop_profiling()
     morse_warning("RUNTIME_stop_profiling()", "FxT profiling is not available with Quark\n");
 }
 
+void RUNTIME_start_stats()
+{
+    morse_warning("RUNTIME_start_stats()", "pruning stats are not available with Quark\n");
+}
+
+void RUNTIME_stop_stats()
+{
+    morse_warning("RUNTIME_stop_stats()", "pruning stats are not available with Quark\n");
+}
+
 void RUNTIME_schedprofile_display(void)
 {
     morse_warning("RUNTIME_schedprofile_display(quark)", "Scheduler profiling is not available with Quark\n");
diff --git a/runtime/starpu/control/runtime_profiling.c b/runtime/starpu/control/runtime_profiling.c
index 4c7d2e1b3809ddfa412ff09d6b0c3e426d31ca9f..33bbb4021690aa53ef39db1409aa85b0a6d93f27 100644
--- a/runtime/starpu/control/runtime_profiling.c
+++ b/runtime/starpu/control/runtime_profiling.c
@@ -29,6 +29,12 @@
 #include <starpu_fxt.h>
 #endif
 
+#ifdef CHAMELEON_ENABLE_PRUNING_STATS
+unsigned long RUNTIME_total_tasks;
+unsigned long RUNTIME_exec_tasks;
+unsigned long RUNTIME_comm_tasks;
+unsigned long RUNTIME_changed_tasks;
+#endif
 
 double RUNTIME_get_time(){
     return starpu_timing_now()*1e-6;
@@ -50,6 +56,21 @@ void RUNTIME_stop_profiling(){
 #endif
 }
 
+void RUNTIME_start_stats(){
+#ifdef CHAMELEON_ENABLE_PRUNING_STATS
+    RUNTIME_total_tasks = 0;
+    RUNTIME_exec_tasks = 0;
+    RUNTIME_comm_tasks = 0;
+    RUNTIME_changed_tasks = 0;
+#endif
+}
+
+void RUNTIME_stop_stats(){
+#ifdef CHAMELEON_ENABLE_PRUNING_STATS
+    fprintf(stderr, "\ntasks: %u = exec: %u + comm: %u + changed: %u\n", RUNTIME_total_tasks, RUNTIME_exec_tasks, RUNTIME_comm_tasks, RUNTIME_changed_tasks);
+#endif
+}
+
 void RUNTIME_profiling_display_info(const char *kernel_name, measure_t perf[STARPU_NMAXWORKERS])
 {
     int header = 1;
diff --git a/runtime/starpu/include/morse_starpu.h b/runtime/starpu/include/morse_starpu.h
index 473e68aa8c3691cef051b45573f66ef615f4c446..987d179f0abd8f93927e3a72e406b27cbccdb3d2 100644
--- a/runtime/starpu/include/morse_starpu.h
+++ b/runtime/starpu/include/morse_starpu.h
@@ -86,16 +86,53 @@ typedef struct starpu_conf starpu_conf_t;
 
 void RUNTIME_set_reduction_methods(starpu_data_handle_t handle, MORSE_enum dtyp);
 
-#define RUNTIME_BEGIN_ACCESS_DECLARATION
+#ifdef CHAMELEON_ENABLE_PRUNING_STATS
+
+#define RUNTIME_PRUNING_STATS_BEGIN_ACCESS_DECLARATION \
+    int __morse_exec = 0; \
+    int __morse_changed = 0;
+
+#define RUNTIME_PRUNING_STATS_ACCESS_W(A, Am, An) \
+    if (morse_desc_islocal(A, Am, An)) \
+        __morse_exec = 1;
+
+#define RUNTIME_PRUNING_STATS_END_ACCESS_DECLARATION \
+    RUNTIME_total_tasks++; \
+    if (__morse_exec) \
+        RUNTIME_exec_tasks++; \
+    else if (__morse_need_submit) \
+        RUNTIME_comm_tasks++; \
+    else if (__morse_changed) \
+        RUNTIME_changed_tasks++;
+
+#define RUNTIME_PRUNING_STATS_RANK_CHANGED(rank) \
+    int __morse_myrank; \
+    RUNTIME_comm_rank(&__morse_myrank); \
+    __morse_exec = (rank) == __morse_myrank; \
+    __morse_changed = 1; \
 
-#define RUNTIME_ACCESS_R(A, Am, An)
+#else
+#define RUNTIME_PRUNING_STATS_BEGIN_ACCESS_DECLARATION
+#define RUNTIME_PRUNING_STATS_ACCESS_W(A, Am, An)
+#define RUNTIME_PRUNING_STATS_END_ACCESS_DECLARATION
+#define RUNTIME_PRUNING_STATS_RANK_CHANGED(rank)
+#endif
+
+#define RUNTIME_BEGIN_ACCESS_DECLARATION \
+    RUNTIME_PRUNING_STATS_BEGIN_ACCESS_DECLARATION
+
+#define RUNTIME_ACCESS_R(A, Am, An) \
 
-#define RUNTIME_ACCESS_W(A, Am, An)
+#define RUNTIME_ACCESS_W(A, Am, An) \
+    RUNTIME_PRUNING_STATS_ACCESS_W(A, Am, An)
 
-#define RUNTIME_ACCESS_RW(A, Am, An)
+#define RUNTIME_ACCESS_RW(A, Am, An) \
+    RUNTIME_PRUNING_STATS_ACCESS_W(A, Am, An)
 
-#define RUNTIME_RANK_CHANGED(rank)
+#define RUNTIME_RANK_CHANGED(rank) \
+    RUNTIME_PRUNING_STATS_RANK_CHANGED(rank)
 
-#define RUNTIME_END_ACCESS_DECLARATION
+#define RUNTIME_END_ACCESS_DECLARATION \
+    RUNTIME_PRUNING_STATS_END_ACCESS_DECLARATION;
 
 #endif /* _MORSE_STARPU_H_ */
diff --git a/runtime/starpu/include/runtime_profiling.h b/runtime/starpu/include/runtime_profiling.h
index 4e712053d15cdd0054a3ef798e1034681e7daaf8..0d25ee23f858a3191c7d4fdee28a8e718b69e61e 100644
--- a/runtime/starpu/include/runtime_profiling.h
+++ b/runtime/starpu/include/runtime_profiling.h
@@ -26,6 +26,13 @@
 #ifndef _PROFILING_H_
 #define _PROFILING_H_
 
+#ifdef CHAMELEON_ENABLE_PRUNING_STATS
+extern unsigned long RUNTIME_total_tasks;
+extern unsigned long RUNTIME_exec_tasks;
+extern unsigned long RUNTIME_comm_tasks;
+extern unsigned long RUNTIME_changed_tasks;
+#endif
+
 typedef struct measure_s {
     double sum;
     double sum2;
diff --git a/timing/timing.h b/timing/timing.h
index 08190507adf01d37c36d7edbf4d874fd5d70e560..3d33748a61ec65e73fc2f4e5e5410d9e5e15a04e 100644
--- a/timing/timing.h
+++ b/timing/timing.h
@@ -159,6 +159,7 @@ enum dparam_timing {
  *
  */
 #define START_TRACING()                        \
+    RUNTIME_start_stats();                     \
     if(iparam[IPARAM_TRACE] == 2) {            \
     	RUNTIME_start_profiling();             \
     }                                          \
@@ -167,6 +168,7 @@ enum dparam_timing {
     }
 
 #define STOP_TRACING()                         \
+    RUNTIME_stop_stats();                      \
     if(iparam[IPARAM_TRACE] == 2) {            \
     	RUNTIME_stop_profiling();              \
     }                                          \