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); src = VAR_SOURCE(opline->op1);
if (src && if (src &&
src->opcode == ZEND_CAST && 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) */ /* convert T1 = CAST(STRING, X), T2 = CONCAT(T1, Y) to T2 = CONCAT(X,Y) */
VAR_SOURCE(opline->op1) = NULL; VAR_SOURCE(opline->op1) = NULL;
COPY_NODE(opline->op1, src->op1); 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); src = VAR_SOURCE(opline->op2);
if (src && if (src &&
src->opcode == ZEND_CAST && 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) */ /* convert T1 = CAST(STRING, X), T2 = CONCAT(Y, T1) to T2 = CONCAT(Y,X) */
zend_op *src = VAR_SOURCE(opline->op2); zend_op *src = VAR_SOURCE(opline->op2);
VAR_SOURCE(opline->op2) = NULL; VAR_SOURCE(opline->op2) = NULL;