Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 7e003011cac72e307c02d183bca9cbd4a982d69b)
+++ src/Common/PassVisitor.h	(revision 7b13aebfc733744b3708b521e282b56a20d2d982)
@@ -231,4 +231,5 @@
 	std::list< Statement* > * 	get_beforeStmts() { return stmtsToAddBefore_impl( pass, 0); }
 	std::list< Statement* > * 	get_afterStmts () { return stmtsToAddAfter_impl ( pass, 0); }
+	bool visit_children() { bool* skip = skip_children_impl(pass, 0); return ! (skip && *skip); }
 };
 
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 7e003011cac72e307c02d183bca9cbd4a982d69b)
+++ src/Common/PassVisitor.impl.h	(revision 7b13aebfc733744b3708b521e282b56a20d2d982)
@@ -3,12 +3,16 @@
 #define VISIT_START( node )  \
 	call_previsit( node ); \
-
-#define VISIT_END( node )                \
+	if( visit_children() ) { \
+
+#define VISIT_END( node )            \
+	}                              \
 	return call_postvisit( node ); \
 
 #define MUTATE_START( node )  \
 	call_premutate( node ); \
+	if( visit_children() ) { \
 
 #define MUTATE_END( type, node )                \
+	}                                         \
 	return call_postmutate< type * >( node ); \
 
Index: src/Common/PassVisitor.proto.h
===================================================================
--- src/Common/PassVisitor.proto.h	(revision 7e003011cac72e307c02d183bca9cbd4a982d69b)
+++ src/Common/PassVisitor.proto.h	(revision 7b13aebfc733744b3708b521e282b56a20d2d982)
@@ -81,2 +81,3 @@
 FIELD_PTR( std::list< Statement* >, stmtsToAddBefore )
 FIELD_PTR( std::list< Statement* >, stmtsToAddAfter  )
+FIELD_PTR( bool, skip_children )
