diff --git a/Makefile b/Makefile
index 260b15fce265e20f549304ac7e6c4c69fdeddc58..00300bc1a4dfd782f4e2ef3263f5dc542c630d4f 100644
--- a/Makefile
+++ b/Makefile
@@ -40,7 +40,8 @@ OBJS=$(addprefix $(OBJD)/, $(SRCS:cpp=o))
 all:
 	$(MAKE) plugin
 	$(MAKE) test
-	
+	$(MAKE) dots
+
 .PHONY: plugin
 plugin:
 	mkdir -p $(OBJD)
@@ -54,6 +55,11 @@ test:
 	$(MAKE) $(TESTD)/test2
 	$(MAKE) $(TESTD)/test3
 
+.PHONY: dots
+dots:
+	touch $(DOTD)/lock.dot
+	$(MAKE) $(shell find $(DOTD) -name "*.dot" | sed 's/\.dot/\.svg/')
+
 $(TESTD)/%: $(TESTSRCD)/%.c
 	$(CC) $(TEST_FLAGS) $(PLUGIN_FLAGS) $^ -o $@
 
@@ -65,8 +71,8 @@ $(LIBD)/libplugin.so: $(OBJD)/plugin.o $(OBJD)/pass_mpi_collective.o
 	# removing test scince plugin was rebuild
 	rm -rf $(TESTD)
 
-%.png: %.dot
-	  dot -Tpng $< -o $@
+%.svg: %.dot
+	  dot -Tsvg $< -o $@
 
 .PHONY: clean
 clean:
diff --git a/include/pass_mpi_collective.hpp b/include/pass_mpi_collective.hpp
index 976856638334b81a6659cf566c2f2df86d9e9c58..dd9b512dcc7b8cbd27c38fb9c8ef8eac10344fbc 100644
--- a/include/pass_mpi_collective.hpp
+++ b/include/pass_mpi_collective.hpp
@@ -2,6 +2,8 @@
 #include <gcc-plugin.h>
 // declare opt_pass
 #include <tree-pass.h>
+// vector
+#include <vector>
 
 /* Enum to represent the collective operations */
 #define DEFMPICOLLECTIVES(CODE, NAME) CODE,
@@ -20,6 +22,15 @@ const char *const mpi_collective_name[] =
 };
 #undef DEFMPICOLLECTIVES
 
+struct bb_data
+{
+	mpi_collective_code mpi_code;
+	std::vector<basic_block> dom;
+	std::vector<basic_block> post_dom;
+	std::vector<basic_block> dom_front;
+	std::vector<basic_block> post_dom_front;
+};
+
 class pass_mpi_collective : public opt_pass
 {
 
@@ -42,11 +53,13 @@ public:
 	void split_blocks(function *fun);
 
 	// gestions des aux
-	void label_bb(function *fun);
-	void clean_bb(function *fun);
+	void alloc_bb_aux(function *fun);
+	void label_collec(function *fun);
+	void free_bb_aux(function *fun);
 
 	// calculate dominances
-	void dominance(function *fun);
+	void label_dom(function *fun);
+	void free_dom_data();
 
 private:
 	// MPI function / collectives detections
diff --git a/src/pass_mpi_collective.cpp b/src/pass_mpi_collective.cpp
index 0cab788e6770d92c8ff8b1704caf59104194abe3..8088361cc7946dde326089ffd8c7fee50d0ab455 100644
--- a/src/pass_mpi_collective.cpp
+++ b/src/pass_mpi_collective.cpp
@@ -10,6 +10,8 @@
 #include <gimple-iterator.h>
 // basename
 #include <filesystem>
+// vector
+#include <vector>
 
 // our pass
 #include "pass_mpi_collective.hpp"
@@ -54,9 +56,13 @@ unsigned int pass_mpi_collective::execute(function *fun)
 	printf("\t--------------------------[split]---------------------------\n");
 	print_tree(fun);
 
-	label_bb(fun);
+	alloc_bb_aux(fun);
+	label_collec(fun);
+	label_dom(fun);
 	cfgviz_dump(fun, "_split");
-	clean_bb(fun);
+
+	free_dom_data();
+	free_bb_aux(fun);
 
 	return 0;
 }
@@ -175,78 +181,99 @@ void pass_mpi_collective::split_blocks(function *fun)
 	}
 }
 
-// gestions des aux
+void pass_mpi_collective::alloc_bb_aux(function *fun)
+{
+	basic_block bb;
+	FOR_ALL_BB_FN(bb, fun)
+	{
+		bb->aux = (bb_data *) new bb_data();
+	}
+}
 
-void pass_mpi_collective::label_bb(function *fun)
+// gestions des aux
+void pass_mpi_collective::label_collec(function *fun)
 {
 	basic_block bb;
 	gimple_stmt_iterator gsi;
 	gimple *stmt;
+	mpi_collective_code mpi_code;
 
-	FOR_EACH_BB_FN(bb, fun)
+	FOR_ALL_BB_FN(bb, fun)
 	{
+		((bb_data *) bb->aux)->mpi_code = LAST_AND_UNUSED_MPI_COLLECTIVE_CODE;
 		for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi))
 		{
 			stmt = gsi_stmt(gsi);
-			int mpi_code = is_mpi_collec(stmt);
-			if (mpi_code != LAST_AND_UNUSED_MPI_COLLECTIVE_CODE)
-			{
-				bb->aux = (void *) (new int(mpi_code));
-			}
+			mpi_code = is_mpi_collec(stmt);
+			((bb_data *) bb->aux)->mpi_code = mpi_code;
 		}
 	}
 }
 
-void pass_mpi_collective::clean_bb(function *fun)
+void pass_mpi_collective::free_bb_aux(function *fun)
 {
 	basic_block bb;
 	FOR_ALL_BB_FN(bb, fun)
 	{
 		if (bb->aux != NULL)
 		{
-			delete (int *) bb->aux;
+			delete (bb_data *) bb->aux;
 			bb->aux = NULL;
 		}
 	}
 }
 
 // calculate dominance
-void pass_mpi_collective::dominance(function *fun)
+void pass_mpi_collective::label_dom(function *fun)
 {
 	basic_block bb;
-	auto_vec<basic_block> dominated;
-	auto_vec<basic_block> post_dominated;
+	auto_vec<basic_block> dom_gccvec;
+	auto_vec<basic_block> post_dom_gccvec;
 	size_t size_dom;
 	size_t size_post_dom;
 
-	calculate_dominance_info(CDI_POST_DOMINATORS);
 	calculate_dominance_info(CDI_DOMINATORS);
+	calculate_dominance_info(CDI_POST_DOMINATORS);
 
 	FOR_ALL_BB_FN(bb, fun)
 	{
-		dominated = get_all_dominated_blocks(CDI_DOMINATORS, bb);
-		size_dom = dominated.length();
+		bb_data *data = ((bb_data *) bb->aux);
+
+		dom_gccvec = get_all_dominated_blocks(CDI_DOMINATORS, bb);
+		size_dom = dom_gccvec.length();
 		for (size_t i = 0; i < size_dom; ++i)
 		{
-			if (dominated[i]->index != bb->index)
+			if (dom_gccvec[i]->index != bb->index)
 			{
-				printf("%d domine %d\n",
-				       bb->index, dominated[i]->index);
+				data->dom.push_back(dom_gccvec[i]);
 			}
 		}
 
-		post_dominated = get_all_dominated_blocks(CDI_POST_DOMINATORS, bb);
-		size_post_dom = post_dominated.length();
+		//for (basic_block bb2 : *dom)
+		//{
+		//	printf("%d dom %d\n", bb->index, bb2->index);
+		//}
+		//((bb_data *) bb->aux)->dom = dominated;
+
+		post_dom_gccvec = get_all_dominated_blocks(CDI_POST_DOMINATORS, bb);
+		size_post_dom = post_dom_gccvec.length();
 		for (size_t i = 0; i < size_post_dom; ++i)
 		{
-			if (post_dominated[i]->index != bb->index)
+			if (post_dom_gccvec[i]->index != bb->index)
 			{
-				printf("%d post domine %d\n",
-				       bb->index, post_dominated[i]->index);
+				data->post_dom.push_back(post_dom_gccvec[i]);
 			}
 		}
+		//for (basic_block bb2 : *post_dom)
+		//{
+		//	printf("%d post dom %d\n", bb->index, bb2->index);
+		//}
+		//((bb_data *) bb->aux)->post_dom = post_dominated;
 	}
+}
 
+void pass_mpi_collective::free_dom_data()
+{
 	free_dominance_info(CDI_DOMINATORS);
 	free_dominance_info(CDI_POST_DOMINATORS);
 }
@@ -280,23 +307,42 @@ char *pass_mpi_collective::cfgviz_generate_filename(function *fun,
 void pass_mpi_collective::cfgviz_internal_dump(function *fun, FILE *out)
 {
 	basic_block bb;
-	mpi_collective_code code;
 	edge_iterator eit;
 	edge e;
 
 	fprintf(out, "Digraph G{\n");
 	FOR_ALL_BB_FN(bb, fun)
 	{
-		code = LAST_AND_UNUSED_MPI_COLLECTIVE_CODE;
-		if (bb->aux != NULL)
+		bb_data *data = ((bb_data *) bb->aux);
+
+		fprintf(out, "%d [label=\"BB %d", bb->index, bb->index);
+		if (data->mpi_code != LAST_AND_UNUSED_MPI_COLLECTIVE_CODE)
+		{
+
+			fprintf(out, "|%s", mpi_collective_name[data->mpi_code]);
+		}
+
+		if (! data->dom.empty())
+		{
+			fprintf(out, "|dom(");
+			for (basic_block bb2 : data->dom)
+			{
+				fprintf(out, "%d,", bb2->index);
+			}
+			fprintf(out, ")");
+		}
+
+		if (! data->post_dom.empty())
 		{
-			code = *((mpi_collective_code *) bb->aux);
+			fprintf(out, "|post_dom(");
+			for (basic_block bb2 : data->post_dom)
+			{
+				fprintf(out, "%d,", bb2->index);
+			}
+			fprintf(out, ")");
 		}
 
-		fprintf(out, "%d [label=\"BB %d %s\" shape=ellipse]\n",
-		        bb->index, bb->index,
-		        (code == LAST_AND_UNUSED_MPI_COLLECTIVE_CODE ? "" :
-		         mpi_collective_name[code]));
+		fprintf(out, "\" shape=ellipse]\n");
 
 		FOR_EACH_EDGE(e, eit, bb->succs)
 		{