Skip to content

Commit bdcef24

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Remove range inference for booleans.
2 parents 4013ebe + cfcee97 commit bdcef24

File tree

3 files changed

+28
-163
lines changed

3 files changed

+28
-163
lines changed

Zend/Optimizer/zend_inference.c

Lines changed: 2 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,8 +1037,6 @@ static bool zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *s
10371037

10381038
ZEND_API bool 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)
10391039
{
1040-
zend_long op1_min, op2_min, op1_max, op2_max;
1041-
10421040
tmp->underflow = 0;
10431041
tmp->overflow = 0;
10441042
switch (opline->opcode) {
@@ -1066,8 +1064,8 @@ ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, zend
10661064
tmp->min = ZEND_LONG_MIN;
10671065
tmp->max = ZEND_LONG_MAX;
10681066
} else {
1069-
op1_min = OP1_MIN_RANGE();
1070-
op1_max = OP1_MAX_RANGE();
1067+
zend_long op1_min = OP1_MIN_RANGE();
1068+
zend_long op1_max = OP1_MAX_RANGE();
10711069
tmp->min = ~op1_max;
10721070
tmp->max = ~op1_min;
10731071
}
@@ -1100,144 +1098,6 @@ ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, zend
11001098
}
11011099
}
11021100
break;
1103-
case ZEND_BOOL:
1104-
case ZEND_JMPZ_EX:
1105-
case ZEND_JMPNZ_EX:
1106-
if (ssa_op->result_def == var) {
1107-
if (OP1_HAS_RANGE()) {
1108-
op1_min = OP1_MIN_RANGE();
1109-
op1_max = OP1_MAX_RANGE();
1110-
tmp->min = (op1_min > 0 || op1_max < 0);
1111-
tmp->max = (op1_min != 0 || op1_max != 0);
1112-
return 1;
1113-
} else {
1114-
tmp->min = 0;
1115-
tmp->max = 1;
1116-
return 1;
1117-
}
1118-
}
1119-
break;
1120-
case ZEND_BOOL_NOT:
1121-
if (ssa_op->result_def == var) {
1122-
if (OP1_HAS_RANGE()) {
1123-
op1_min = OP1_MIN_RANGE();
1124-
op1_max = OP1_MAX_RANGE();
1125-
tmp->min = (op1_min == 0 && op1_max == 0);
1126-
tmp->max = (op1_min <= 0 && op1_max >= 0);
1127-
return 1;
1128-
} else {
1129-
tmp->min = 0;
1130-
tmp->max = 1;
1131-
return 1;
1132-
}
1133-
}
1134-
break;
1135-
case ZEND_BOOL_XOR:
1136-
if (ssa_op->result_def == var) {
1137-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1138-
op1_min = OP1_MIN_RANGE();
1139-
op2_min = OP2_MIN_RANGE();
1140-
op1_max = OP1_MAX_RANGE();
1141-
op2_max = OP2_MAX_RANGE();
1142-
op1_min = (op1_min > 0 || op1_max < 0);
1143-
op1_max = (op1_min != 0 || op1_max != 0);
1144-
op2_min = (op2_min > 0 || op2_max < 0);
1145-
op2_max = (op2_min != 0 || op2_max != 0);
1146-
tmp->min = 0;
1147-
tmp->max = 1;
1148-
if (op1_min == op1_max && op2_min == op2_max) {
1149-
if (op1_min == op2_min) {
1150-
tmp->max = 0;
1151-
} else {
1152-
tmp->min = 1;
1153-
}
1154-
}
1155-
return 1;
1156-
} else {
1157-
tmp->min = 0;
1158-
tmp->max = 1;
1159-
return 1;
1160-
}
1161-
}
1162-
break;
1163-
case ZEND_IS_IDENTICAL:
1164-
case ZEND_IS_EQUAL:
1165-
if (ssa_op->result_def == var) {
1166-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1167-
op1_min = OP1_MIN_RANGE();
1168-
op2_min = OP2_MIN_RANGE();
1169-
op1_max = OP1_MAX_RANGE();
1170-
op2_max = OP2_MAX_RANGE();
1171-
1172-
tmp->min = (op1_min == op1_max &&
1173-
op2_min == op2_max &&
1174-
op1_min == op2_max);
1175-
tmp->max = (op1_min <= op2_max && op1_max >= op2_min);
1176-
return 1;
1177-
} else {
1178-
tmp->min = 0;
1179-
tmp->max = 1;
1180-
return 1;
1181-
}
1182-
}
1183-
break;
1184-
case ZEND_IS_NOT_IDENTICAL:
1185-
case ZEND_IS_NOT_EQUAL:
1186-
if (ssa_op->result_def == var) {
1187-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1188-
op1_min = OP1_MIN_RANGE();
1189-
op2_min = OP2_MIN_RANGE();
1190-
op1_max = OP1_MAX_RANGE();
1191-
op2_max = OP2_MAX_RANGE();
1192-
1193-
tmp->min = (op1_min > op2_max || op1_max < op2_min);
1194-
tmp->max = (op1_min != op1_max ||
1195-
op2_min != op2_max ||
1196-
op1_min != op2_max);
1197-
return 1;
1198-
} else {
1199-
tmp->min = 0;
1200-
tmp->max = 1;
1201-
return 1;
1202-
}
1203-
}
1204-
break;
1205-
case ZEND_IS_SMALLER:
1206-
if (ssa_op->result_def == var) {
1207-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1208-
op1_min = OP1_MIN_RANGE();
1209-
op2_min = OP2_MIN_RANGE();
1210-
op1_max = OP1_MAX_RANGE();
1211-
op2_max = OP2_MAX_RANGE();
1212-
1213-
tmp->min = op1_max < op2_min;
1214-
tmp->max = op1_min < op2_max;
1215-
return 1;
1216-
} else {
1217-
tmp->min = 0;
1218-
tmp->max = 1;
1219-
return 1;
1220-
}
1221-
}
1222-
break;
1223-
case ZEND_IS_SMALLER_OR_EQUAL:
1224-
if (ssa_op->result_def == var) {
1225-
if (OP1_HAS_RANGE() && OP2_HAS_RANGE()) {
1226-
op1_min = OP1_MIN_RANGE();
1227-
op2_min = OP2_MIN_RANGE();
1228-
op1_max = OP1_MAX_RANGE();
1229-
op2_max = OP2_MAX_RANGE();
1230-
1231-
tmp->min = op1_max <= op2_min;
1232-
tmp->max = op1_min <= op2_max;
1233-
return 1;
1234-
} else {
1235-
tmp->min = 0;
1236-
tmp->max = 1;
1237-
return 1;
1238-
}
1239-
}
1240-
break;
12411101
case ZEND_QM_ASSIGN:
12421102
case ZEND_JMP_SET:
12431103
case ZEND_COALESCE:
@@ -1263,13 +1123,6 @@ ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, zend
12631123
}
12641124
}
12651125
break;
1266-
case ZEND_ASSERT_CHECK:
1267-
if (ssa_op->result_def == var) {
1268-
tmp->min = 0;
1269-
tmp->max = 1;
1270-
return 1;
1271-
}
1272-
break;
12731126
case ZEND_SEND_VAR:
12741127
if (ssa_op->op1_def == var) {
12751128
if (ssa_op->op1_def >= 0) {
@@ -1450,12 +1303,6 @@ ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, zend
14501303
tmp->max = ZEND_LONG_MAX;
14511304
tmp->overflow = 0;
14521305
return 1;
1453-
} else if (mask == MAY_BE_BOOL) {
1454-
tmp->underflow = 0;
1455-
tmp->min = 0;
1456-
tmp->max = 1;
1457-
tmp->overflow = 0;
1458-
return 1;
14591306
}
14601307
}
14611308
}

Zend/Optimizer/zend_ssa.c

Lines changed: 0 additions & 8 deletions
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

Lines changed: 26 additions & 0 deletions
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)