From 65120cfc0969fe9ebd3d4d659b610a54a35ae026 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 Mar 2020 17:31:06 +0300 Subject: [PATCH] Fixed bug #79412 (Opcache chokes and uses 100% CPU on specific script). --- NEWS | 4 ++++ ext/opcache/Optimizer/zend_inference.c | 19 ++++++++++++++++--- ext/opcache/tests/bug79412.phpt | 25 +++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 ext/opcache/tests/bug79412.phpt diff --git a/NEWS b/NEWS index ddcebd14fc..edd69bb27a 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,10 @@ PHP NEWS - Iconv: . Fixed bug #79200 (Some iconv functions cut Windows-1258). (cmb) +- OPcache: + . Fixed bug #79412 (Opcache chokes and uses 100% CPU on specific script). + (Dmitry) + - SimpleXML: . Fixed bug #61597 (SXE properties may lack attributes and content). (cmb) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index a60ecef888..2579d3ff96 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -1807,12 +1807,25 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{ } } WHILE_WORKLIST_END(); - /* Add all SCC entry variables into worklist for narrowing */ + /* initialize missing ranges */ for (j = scc_var[scc]; j >= 0; j = next_scc_var[j]) { if (!ssa->var_info[j].has_range) { zend_inference_init_range(op_array, ssa, j, 1, ZEND_LONG_MIN, ZEND_LONG_MAX, 1); - } else if (ssa->vars[j].definition_phi && - ssa->vars[j].definition_phi->pi < 0) { + FOR_EACH_VAR_USAGE(j, ADD_SCC_VAR); + } + } + + /* widening (second round) */ + WHILE_WORKLIST(worklist, worklist_len, j) { + if (zend_ssa_range_widening(op_array, ssa, j, scc)) { + FOR_EACH_VAR_USAGE(j, ADD_SCC_VAR); + } + } WHILE_WORKLIST_END(); + + /* Add all SCC entry variables into worklist for narrowing */ + for (j = scc_var[scc]; j >= 0; j = next_scc_var[j]) { + if (ssa->vars[j].definition_phi + && ssa->vars[j].definition_phi->pi < 0) { /* narrowing Phi functions first */ zend_ssa_range_narrowing(op_array, ssa, j, scc); } diff --git a/ext/opcache/tests/bug79412.phpt b/ext/opcache/tests/bug79412.phpt new file mode 100644 index 0000000000..20fb0a5ba9 --- /dev/null +++ b/ext/opcache/tests/bug79412.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #79412 (Opcache chokes and uses 100% CPU on specific script) +--INI-- +opcache.enable=1 +opcache.optimization_level=-1 +--SKIPIF-- + +--FILE-- += $limitPerRun) { + break; + } + } + foo($limitPerRun); +} +?> +--EXPECTF-- +Notice: Undefined variable: foo in %s on line %d + +Warning: Invalid argument supplied for foreach() in %s on line %d -- 2.49.0