gschlossnagle           Sun Jun 22 21:10:58 2003 EDT

  Modified files:              
    /pecl/apc   apc_optimizer.c 
  Log:
  fixed NOP removal
  
  
Index: pecl/apc/apc_optimizer.c
diff -u pecl/apc/apc_optimizer.c:3.3 pecl/apc/apc_optimizer.c:3.4
--- pecl/apc/apc_optimizer.c:3.3        Sun Jun 22 12:49:00 2003
+++ pecl/apc/apc_optimizer.c    Sun Jun 22 21:10:57 2003
@@ -70,7 +70,9 @@
       case ZEND_JMPZ:
       case ZEND_JMPNZ:
       case ZEND_JMPZ_EX:
+      case ZEND_JMPNZ_EX:
       case ZEND_JMP_NO_CTOR:
+      case ZEND_FE_FETCH:
         assert(op->op2.u.opline_num == old);
         op->op2.u.opline_num = new;
         break;
@@ -98,7 +100,9 @@
       case ZEND_JMPZ:
       case ZEND_JMPNZ:
       case ZEND_JMPZ_EX:
+      case ZEND_JMPNZ_EX:
       case ZEND_JMP_NO_CTOR:
+      case ZEND_FE_FETCH:
       case ZEND_JMPZNZ:
         return 1;
     }
@@ -247,6 +251,61 @@
     return i;
 }
 
+/* convert switch statement to use JMPs.  this is easier than handling them 
separately. */  
+
+static void convert_switch(zend_op_array *op_array) 
+{
+    int i, nest_levels = 0;
+    int array_offset = 0;
+    for (i = 0; i < op_array->last; i++) {
+        zend_op *opline = &op_array->opcodes[i];
+        zend_brk_cont_element *jmp_to;
+        if(opline->opcode != ZEND_BRK && opline->opcode != ZEND_CONT) {
+            continue;
+        }
+        if(opline->op2.op_type == IS_CONST && opline->op2.u.constant.type == IS_LONG) 
{
+            nest_levels = opline->op2.u.constant.value.lval;
+        } else {
+            assert(0);
+        }
+        array_offset = opline->op1.u.opline_num;
+        do {
+            if (array_offset < 0) {
+                 assert(0);
+                // fail
+            }
+            jmp_to = &op_array->brk_cont_array[array_offset];
+            if (nest_levels>1) {
+                zend_op *brk_opline = &op_array->opcodes[jmp_to->brk];
+                switch (brk_opline->opcode) {
+                  case ZEND_SWITCH_FREE:
+                    // fail
+                    assert(0);
+                    break;
+                  case ZEND_FREE:
+                    // fail
+                    assert(0);
+                    break;
+                }
+            }
+            array_offset = jmp_to->parent;
+        } while (--nest_levels > 0);
+
+        switch(opline->opcode) {
+          case ZEND_BRK:
+            opline->op1.u.opline_num = jmp_to->brk;
+            break;
+          case ZEND_CONT:
+            opline->op1.u.opline_num = jmp_to->cont;
+            break;
+        }
+        opline->op2.op_type = IS_UNUSED;
+        opline->opcode = ZEND_JMP;
+        fprintf(stderr, "Rewriting op\n");
+    }
+}
+
+
 /* returns list of potential branch targets for this op */
 static Pair* extract_branch_targets(zend_op* op)
 {
@@ -256,10 +315,13 @@
       case ZEND_JMPZ:
       case ZEND_JMPNZ:
       case ZEND_JMPZ_EX:
+      case ZEND_JMPNZ_EX:
       case ZEND_JMP_NO_CTOR:
+      case ZEND_FE_FETCH:
         return cons(op->op2.u.opline_num, 0);
       case ZEND_JMPZNZ:
         return cons(op->op2.u.opline_num, cons(op->extended_value, 0));
+        
     }
     return 0;
 }
@@ -272,7 +334,6 @@
 
     jumps = (Pair**) malloc(num_ops * sizeof(Pair*));
     memset(jumps, 0, num_ops * sizeof(Pair*));
-
     for (i = 0; i < num_ops; i++) {
         Pair* targets = extract_branch_targets(&ops[i]);
         while (targets) {
@@ -486,9 +547,9 @@
         return op_array;
     }
 
+    convert_switch(op_array);
     jump_array_size = op_array->last;
     jumps = build_jump_array(op_array->opcodes, jump_array_size);
-
     for (i = 0; i < op_array->last; i++) {
         Pair* p;
         if ((p = peephole_inc(op_array->opcodes, i, op_array->last))) {
@@ -504,9 +565,7 @@
             RESTART_PEEPHOLE_LOOP;
         }
     }
-#if 0
     op_array->last = compress_ops(op_array->opcodes, jumps, op_array->last);
-#endif
     destroy_jump_array(jumps, jump_array_size);
 
     return op_array;



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to