]> granicus.if.org Git - php/commitdiff
Optimize int === int/double === double
authorTyson Andre <tysonandre775@hotmail.com>
Wed, 13 Nov 2019 06:12:49 +0000 (01:12 -0500)
committerDmitry Stogov <dmitry@zend.com>
Fri, 15 Nov 2019 14:37:01 +0000 (17:37 +0300)
Do this by reusing the implementation used for `==`
when both arguments are ints (IS_LONG) or both are floats (IS_DOUBLE)

```php
// Before: nestedloop_ni took 0.442 seconds
// After: nestedloop_ni takes 0.401 seconds (same as nestedloop_ne)
function nestedloop_ni(int $k) {
  $x = 0;
  for ($i=0; $i < 50000000; $i++) {
    if ($i === $k) {
      $x++;
    }
  }
  print "$x\n";
}
function nestedloop_ne(int $k) {
  $x = 0;
  for ($i=0; $i < 50000000; $i++) {
    if ($i == $k) {
        $x++;
    }
  }
  print "$x\n";
}
```

Zend/zend_vm_execute.h
Zend/zend_vm_gen.php

index 5da5452b69bebdb257ae93719257eba9f2035ff4..fec62d8dc06adfbb53e7e94e965bd07fb2b145c1 100644 (file)
@@ -59194,6 +59194,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                        }
                        break;
                case ZEND_IS_EQUAL:
+               case ZEND_IS_IDENTICAL:
                        if (op->op1_type < op->op2_type) {
                                zend_swap_operands(op);
                        }
@@ -59210,6 +59211,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                        }
                        break;
                case ZEND_IS_NOT_EQUAL:
+               case ZEND_IS_NOT_IDENTICAL:
                        if (op->op1_type < op->op2_type) {
                                zend_swap_operands(op);
                        }
@@ -59330,8 +59332,6 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                case ZEND_BW_AND:
                case ZEND_BW_XOR:
                case ZEND_BOOL_XOR:
-               case ZEND_IS_IDENTICAL:
-               case ZEND_IS_NOT_IDENTICAL:
                        if (op->op1_type < op->op2_type) {
                                zend_swap_operands(op);
                        }
index d263f542c50b9bfda86125f40eeea6195379d10d..47975b39404ed78d36aa50ef93b81501c16b298a 100755 (executable)
@@ -2818,6 +2818,13 @@ function gen_vm($def, $skel) {
                                if (isset($dsc['type_spec'])) {
                                        $orig_op = $dsc['op'];
                                        out($f, "\t\tcase $orig_op:\n");
+                                       // XXX: Copy the specializations for LONG == LONG and DOUBLE != DOUBLE to work for ===/!== as well.
+                                       // (Those are currently the only specializations)
+                                       if ($orig_op === 'ZEND_IS_EQUAL') {
+                                               out($f, "\t\tcase ZEND_IS_IDENTICAL:\n");
+                                       } elseif ($orig_op === 'ZEND_IS_NOT_EQUAL') {
+                                               out($f, "\t\tcase ZEND_IS_NOT_IDENTICAL:\n");
+                                       }
                                        if (isset($dsc["spec"]["COMMUTATIVE"])) {
                                                out($f, "\t\t\tif (op->op1_type < op->op2_type) {\n");
                                                out($f, "\t\t\t\tzend_swap_operands(op);\n");
@@ -2857,8 +2864,10 @@ function gen_vm($def, $skel) {
                                    !isset($dsc['type_spec']) &&
                                    isset($dsc["spec"]["COMMUTATIVE"])) {
                                        $orig_op = $dsc['op'];
-                                       out($f, "\t\tcase $orig_op:\n");
-                                       $has_commutative = true;
+                                       if (!in_array($orig_op, ['ZEND_IS_IDENTICAL', 'ZEND_IS_NOT_IDENTICAL'])) {
+                                               out($f, "\t\tcase $orig_op:\n");
+                                               $has_commutative = true;
+                                       }
                                }
                        }
                        if ($has_commutative) {