]> granicus.if.org Git - php/commitdiff
Improve register allocator (give preference to loop variables).
authorDmitry Stogov <dmitry@zend.com>
Tue, 20 Oct 2020 09:19:44 +0000 (12:19 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 20 Oct 2020 09:19:44 +0000 (12:19 +0300)
ext/opcache/jit/zend_jit.c
ext/opcache/jit/zend_jit_trace.c

index 4794a1c0d774e0194e4620b7733569696b39c39b..6b16f83d51a6f1340b482b2a234d3811606faedd 100644 (file)
@@ -964,7 +964,7 @@ static zend_lifetime_interval *zend_jit_sort_intervals(zend_lifetime_interval **
                if (ival) {
                        if ((ival->range.start > last->range.start) ||
                            (ival->range.start == last->range.start &&
-                            ((!ival->hint && last->hint) ||
+                            ((!ival->hint && last->hint && last->hint != ival) ||
                              ival->range.end > last->range.end))) {
                                last->list_next = ival;
                                last = ival;
@@ -979,7 +979,7 @@ static zend_lifetime_interval *zend_jit_sort_intervals(zend_lifetime_interval **
                                                break;
                                        } else if ((ival->range.start < (*p)->range.start) ||
                                                   (ival->range.start == (*p)->range.start &&
-                                                   ((ival->hint && !(*p)->hint) ||
+                                                   ((ival->hint && !(*p)->hint && ival->hint != *p) ||
                                                     ival->range.end < (*p)->range.end))) {
                                                ival->list_next = *p;
                                                *p = ival;
index a6d27caece02923e60100e48fcef1dd9cc7c6db0..2353ec0a93351636ddf425949989dfc240fd027e 100644 (file)
@@ -2641,12 +2641,26 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
                                                            intervals[ssa->ops[line].op1_use] &&
                                                            ssa->ops[line].op1_use_chain < 0 &&
                                                            !ssa->vars[ssa->ops[line].op1_use].phi_use_chain) {
+
+                                                               zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op1_use].definition_phi;
+                                                               if (phi &&
+                                                                   intervals[phi->sources[1]] &&
+                                                                   intervals[phi->sources[1]]->hint == intervals[ssa->ops[line].op1_use]) {
+                                                                       break;
+                                                               }
                                                                zend_jit_add_hint(intervals, i, ssa->ops[line].op1_use);
                                                        } else if (opline->opcode != ZEND_SUB &&
                                                            ssa->ops[line].op2_use >= 0 &&
                                                            intervals[ssa->ops[line].op2_use] &&
                                                            ssa->ops[line].op2_use_chain < 0 &&
                                                            !ssa->vars[ssa->ops[line].op2_use].phi_use_chain) {
+
+                                                               zend_ssa_phi *phi = ssa->vars[ssa->ops[line].op2_use].definition_phi;
+                                                               if (phi &&
+                                                                   intervals[phi->sources[1]] &&
+                                                                   intervals[phi->sources[1]]->hint == intervals[ssa->ops[line].op2_use]) {
+                                                                       break;
+                                                               }
                                                                zend_jit_add_hint(intervals, i, ssa->ops[line].op2_use);
                                                        }
                                                }