Skip to content

Commit cfcee97

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Remove range inference for booleans.
2 parents 2362722 + 6f42c07 commit cfcee97

File tree

3 files changed

+28
-163
lines changed

3 files changed

+28
-163
lines changed

Zend/Optimizer/zend_inference.c

+2-155
Original file line numberDiff line numberDiff line change
@@ -1041,8 +1041,6 @@ static int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ss
10411041

10421042
ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp)
10431043
{
1044-
zend_long op1_min, op2_min, op1_max, op2_max;
1045-
10461044
tmp->underflow = 0;
10471045
tmp->overflow = 0;
10481046
switch (opline->opcode) {
@@ -1070,8 +1068,8 @@ ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_
10701068
tmp->min = ZEND_LONG_MIN;
10711069
tmp->max = ZEND_LONG_MAX;
10721070
} else {
1073-
op1_min = OP1_MIN_RANGE();
1074-
op1_max = OP1_MAX_RANGE();
1071+
zend_long op1_min = OP1_MIN_RANGE();
1072+
zend_long op1_max = OP1_MAX_RANGE();
10751073
tmp->min = ~op1_max;
10761074
tmp->max = ~op1_min;
10771075
}
@@ -1104,144 +1102,6 @@ ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_
11041102
}
11051103
}
11061104
break;
1107-
case ZEND_BOOL:
1108-
case ZEND_JMPZ_EX:
1109-
case ZEND_JMPNZ_EX:
1110-
if (ssa_op->result_def == var) {
1111-
if (OP1_HAS_RANGE()) {
1112-
op1_min = OP1_MIN_RANGE();
1113-
op1_max = OP1_MAX_RANGE();
1114-
tmp->min = (op1_min > 0 || op1_max < 0);
1115-
tmp->max = (op1_min != 0 || op1_max != 0);
1116-
return 1;
1117-
} else {
1118-
tmp->min = 0;
1119-
tmp->max = 1;
1120-
return 1;
1121-
}
1122-
}
1123-
break;
1124-
case ZEND_BOOL_NOT:
1125-
if (ssa_op->result_def == var) {
1126-
if (OP1_HAS_RANGE()) {
1127-
op1_min = OP1_MIN_RANGE();
1128-
op1_max = OP1_MAX_RANGE();
1129-
tmp->min = (op1_min == 0 && op1_max == 0);
1130-
tmp->max = (op1_min <= 0 && op1_max >= 0);
1131-
return 1;
1132-
} else {
1133-
tmp->min = 0;
1134-
tmp->max = 1;
1135-
return 1;
1136-
}
1137-
}
1138-
break;
1139-
case ZEND_BOOL_XOR:
1140-
if (ssa_op->result_def == var) {
1141-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1142-
op1_min = OP1_MIN_RANGE();
1143-
op2_min = OP2_MIN_RANGE();
1144-
op1_max = OP1_MAX_RANGE();
1145-
op2_max = OP2_MAX_RANGE();
1146-
op1_min = (op1_min > 0 || op1_max < 0);
1147-
op1_max = (op1_min != 0 || op1_max != 0);
1148-
op2_min = (op2_min > 0 || op2_max < 0);
1149-
op2_max = (op2_min != 0 || op2_max != 0);
1150-
tmp->min = 0;
1151-
tmp->max = 1;
1152-
if (op1_min == op1_max && op2_min == op2_max) {
1153-
if (op1_min == op2_min) {
1154-
tmp->max = 0;
1155-
} else {
1156-
tmp->min = 1;
1157-
}
1158-
}
1159-
return 1;
1160-
} else {
1161-
tmp->min = 0;
1162-
tmp->max = 1;
1163-
return 1;
1164-
}
1165-
}
1166-
break;
1167-
case ZEND_IS_IDENTICAL:
1168-
case ZEND_IS_EQUAL:
1169-
if (ssa_op->result_def == var) {
1170-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1171-
op1_min = OP1_MIN_RANGE();
1172-
op2_min = OP2_MIN_RANGE();
1173-
op1_max = OP1_MAX_RANGE();
1174-
op2_max = OP2_MAX_RANGE();
1175-
1176-
tmp->min = (op1_min == op1_max &&
1177-
op2_min == op2_max &&
1178-
op1_min == op2_max);
1179-
tmp->max = (op1_min <= op2_max && op1_max >= op2_min);
1180-
return 1;
1181-
} else {
1182-
tmp->min = 0;
1183-
tmp->max = 1;
1184-
return 1;
1185-
}
1186-
}
1187-
break;
1188-
case ZEND_IS_NOT_IDENTICAL:
1189-
case ZEND_IS_NOT_EQUAL:
1190-
if (ssa_op->result_def == var) {
1191-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1192-
op1_min = OP1_MIN_RANGE();
1193-
op2_min = OP2_MIN_RANGE();
1194-
op1_max = OP1_MAX_RANGE();
1195-
op2_max = OP2_MAX_RANGE();
1196-
1197-
tmp->min = (op1_min > op2_max || op1_max < op2_min);
1198-
tmp->max = (op1_min != op1_max ||
1199-
op2_min != op2_max ||
1200-
op1_min != op2_max);
1201-
return 1;
1202-
} else {
1203-
tmp->min = 0;
1204-
tmp->max = 1;
1205-
return 1;
1206-
}
1207-
}
1208-
break;
1209-
case ZEND_IS_SMALLER:
1210-
if (ssa_op->result_def == var) {
1211-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1212-
op1_min = OP1_MIN_RANGE();
1213-
op2_min = OP2_MIN_RANGE();
1214-
op1_max = OP1_MAX_RANGE();
1215-
op2_max = OP2_MAX_RANGE();
1216-
1217-
tmp->min = op1_max < op2_min;
1218-
tmp->max = op1_min < op2_max;
1219-
return 1;
1220-
} else {
1221-
tmp->min = 0;
1222-
tmp->max = 1;
1223-
return 1;
1224-
}
1225-
}
1226-
break;
1227-
case ZEND_IS_SMALLER_OR_EQUAL:
1228-
if (ssa_op->result_def == var) {
1229-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1230-
op1_min = OP1_MIN_RANGE();
1231-
op2_min = OP2_MIN_RANGE();
1232-
op1_max = OP1_MAX_RANGE();
1233-
op2_max = OP2_MAX_RANGE();
1234-
1235-
tmp->min = op1_max <= op2_min;
1236-
tmp->max = op1_min <= op2_max;
1237-
return 1;
1238-
} else {
1239-
tmp->min = 0;
1240-
tmp->max = 1;
1241-
return 1;
1242-
}
1243-
}
1244-
break;
12451105
case ZEND_QM_ASSIGN:
12461106
case ZEND_JMP_SET:
12471107
case ZEND_COALESCE:
@@ -1267,13 +1127,6 @@ ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_
12671127
}
12681128
}
12691129
break;
1270-
case ZEND_ASSERT_CHECK:
1271-
if (ssa_op->result_def == var) {
1272-
tmp->min = 0;
1273-
tmp->max = 1;
1274-
return 1;
1275-
}
1276-
break;
12771130
case ZEND_SEND_VAR:
12781131
if (ssa_op->op1_def == var) {
12791132
if (ssa_op->op1_def >= 0) {
@@ -1454,12 +1307,6 @@ ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_
14541307
tmp->max = ZEND_LONG_MAX;
14551308
tmp->overflow = 0;
14561309
return 1;
1457-
} else if (mask == MAY_BE_BOOL) {
1458-
tmp->underflow = 0;
1459-
tmp->min = 0;
1460-
tmp->max = 1;
1461-
tmp->overflow = 0;
1462-
return 1;
14631310
}
14641311
}
14651312
}

Zend/Optimizer/zend_ssa.c

-8
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,6 @@ static void place_essa_pis(
334334

335335
if (Z_TYPE_P(zv) == IS_LONG) {
336336
add_val2 = Z_LVAL_P(zv);
337-
} else if (Z_TYPE_P(zv) == IS_FALSE) {
338-
add_val2 = 0;
339-
} else if (Z_TYPE_P(zv) == IS_TRUE) {
340-
add_val2 = 1;
341337
} else {
342338
var1 = -1;
343339
}
@@ -355,10 +351,6 @@ static void place_essa_pis(
355351
zval *zv = CRT_CONSTANT_EX(op_array, (opline-1), (opline-1)->op1);
356352
if (Z_TYPE_P(zv) == IS_LONG) {
357353
add_val1 = Z_LVAL_P(CRT_CONSTANT_EX(op_array, (opline-1), (opline-1)->op1));
358-
} else if (Z_TYPE_P(zv) == IS_FALSE) {
359-
add_val1 = 0;
360-
} else if (Z_TYPE_P(zv) == IS_TRUE) {
361-
add_val1 = 1;
362354
} else {
363355
var2 = -1;
364356
}

ext/opcache/tests/jit/cmp_008.phpt

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
JIT CMP: 008 Wrong range inference for comparison between IS_LONG and IS_FALSE/IS_TRUE
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
opcache.protect_memory=1
9+
--FILE--
10+
<?php
11+
function test() {
12+
for ($i = 0; $i < 10; $i %= -4 != -4 < ($a = $a + $a)) {
13+
}
14+
}
15+
test();
16+
?>
17+
--EXPECTF--
18+
Warning: Undefined variable $a in %scmp_008.php on line 3
19+
20+
Warning: Undefined variable $a in %scmp_008.php on line 3
21+
22+
Fatal error: Uncaught DivisionByZeroError: Modulo by zero in %scmp_008.php:3
23+
Stack trace:
24+
#0 %scmp_008.php(6): test()
25+
#1 {main}
26+
thrown in %scmp_008.php on line 3

0 commit comments

Comments
 (0)