Don't remove CONST CAST in CONCAT operand

CONCAT assumes that CONST operands are strings, so we cannot
blindly remove CAST operands.
This commit is contained in:
Nikita Popov 2019-02-28 16:35:35 +01:00
parent 1b998bb9cb
commit 105a04aaac

View File

@ -719,7 +719,8 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
src = VAR_SOURCE(opline->op1);
if (src &&
src->opcode == ZEND_CAST &&
src->extended_value == IS_STRING) {
src->extended_value == IS_STRING &&
src->op1_type != IS_CONST) {
/* convert T1 = CAST(STRING, X), T2 = CONCAT(T1, Y) to T2 = CONCAT(X,Y) */
VAR_SOURCE(opline->op1) = NULL;
COPY_NODE(opline->op1, src->op1);
@ -731,7 +732,8 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
src = VAR_SOURCE(opline->op2);
if (src &&
src->opcode == ZEND_CAST &&
src->extended_value == IS_STRING) {
src->extended_value == IS_STRING &&
src->op1_type != IS_CONST) {
/* convert T1 = CAST(STRING, X), T2 = CONCAT(Y, T1) to T2 = CONCAT(Y,X) */
zend_op *src = VAR_SOURCE(opline->op2);
VAR_SOURCE(opline->op2) = NULL;