Index: /trunk/optimizer.c
===================================================================
--- /trunk/optimizer.c	(revision 334)
+++ /trunk/optimizer.c	(revision 335)
@@ -19,4 +19,5 @@
 #	define XCACHE_IS_CV 16
 #endif
+#define optimized_flag done_pass_two
 
 typedef int bbid_t;
@@ -511,5 +512,11 @@
 		return 0;
 	}
-	xc_undo_pass_two(op_array TSRMLS_CC);
+
+	/* don't optimize twice */
+	if (op_array->optimized_flag) {
+		return 0;
+	}
+	op_array->optimized_flag = 1;
+
 #ifdef DEBUG
 #	if 0
@@ -543,6 +550,10 @@
 #	endif
 #endif
-	xc_redo_pass_two(op_array TSRMLS_CC);
 	return 0;
+}
+/* }}} */
+int xc_clear_flag_optimized(zend_op_array *op_array TSRMLS_DC) /* {{{ */
+{
+	op_array->done_pass_two = 0;
 }
 /* }}} */
@@ -558,5 +569,7 @@
 
 	xc_apply_op_array(&cr, (apply_func_t) xc_undo_pass_two TSRMLS_CC);
+	/* op_array->done_pass_two is now used as if it's op_array->flag_optimized */
 	xc_apply_op_array(&cr, (apply_func_t) xc_optimize_op_array TSRMLS_CC);
+	xc_apply_op_array(&cr, (apply_func_t) xc_clear_flag_optimized TSRMLS_CC);
 	xc_apply_op_array(&cr, (apply_func_t) xc_redo_pass_two TSRMLS_CC);
 
