140 if (!is_defined_by_op(ssa, var->
definition, i)) {
153 int second_use = use;
154 while (use >= 0 && second_use >= 0) {
155 use = zend_ssa_next_use(ssa->
ops, var - ssa->
vars, use);
156 second_use = zend_ssa_next_use(ssa->
ops, var - ssa->
vars, second_use);
157 if (second_use < 0) {
160 second_use = zend_ssa_next_use(ssa->
ops, var - ssa->
vars, second_use);
161 if (use == second_use) {
168 if (!is_used_by_op(ssa, use, i)) {
176 while (phi && second_phi) {
177 phi = zend_ssa_next_use_phi(ssa, var - ssa->
vars, phi);
178 second_phi = zend_ssa_next_use_phi(ssa, var - ssa->
vars, second_phi);
182 second_phi = zend_ssa_next_use_phi(ssa, var - ssa->
vars, second_phi);
183 if (phi == second_phi) {
190 if (!is_in_phi_sources(ssa, phi, i)) {
196 FAIL(
"var " VARFMT " has array key type but not value type\n",
VAR(i));
199 FAIL(
"var " VARFMT " has array value type but not key type\n",
VAR(i));
210 if (is_var_type(opline->
op1_type)) {
219 if (is_var_type(opline->
op2_type)) {
240 FAIL(
"op1 use %d out of range\n", ssa_op->
op1_use);
242 if (!is_defined(ssa, op_array, ssa_op->
op1_use)) {
246 if (!is_in_use_chain(ssa, ssa_op->
op1_use, i)) {
257 FAIL(
"op2 use %d out of range\n", ssa_op->
op2_use);
259 if (!is_defined(ssa, op_array, ssa_op->
op2_use)) {
263 if (!is_in_use_chain(ssa, ssa_op->
op2_use, i)) {
276 if (!is_defined(ssa, op_array, ssa_op->
result_use)) {
280 if (!is_in_use_chain(ssa, ssa_op->
result_use, i)) {
291 FAIL(
"op1 def %d out of range\n", ssa_op->
op1_def);
304 FAIL(
"op2 def %d out of range\n", ssa_op->
op2_def);
333 for (i = 0; i < num_sources; i++) {
338 if (!is_in_phi_use_chain(ssa, source, phi)) {
346 for (
j = i + 1;
j < num_sources;
j++) {
349 " at %d despite earlier use\n",
VAR(source),
VAR(phi->
ssa_var),
j);
362 int *predecessors = &cfg->
predecessors[block->predecessor_offset];
365 if (i != 0 && block->start < (block-1)->start + (block-1)->len) {
366 FAIL(
"Block %d start %d smaller previous end %d\n",
367 i, block->start, (block-1)->start + (block-1)->len);
369 if (i != cfg->
blocks_count-1 && block->start + block->len > (block+1)->start) {
370 FAIL(
"Block %d end %d greater next start %d\n",
371 i, block->start + block->len, (block+1)->start);
375 if (cfg->
map[
j] != i) {
382 FAIL(
"Unreachable block %d has phis\n", i);
387 for (
s = 0;
s < block->successors_count;
s++) {
389 if (block->successors[
s] < 0) {
390 FAIL(
"Successor number %d of %d negative",
s, i);
392 next_block = &cfg->
blocks[block->successors[
s]];
394 FAIL(
"Successor %d of %d not reachable\n", block->successors[
s], i);
396 if (!is_in_predecessors(cfg, next_block, i)) {
397 FAIL(
"Block %d predecessors missing %d\n", block->successors[
s], i);
401 for (
j = 0;
j < block->predecessors_count;
j++) {
402 if (predecessors[
j] >= 0) {
406 FAIL(
"Predecessor %d of %d not reachable\n", predecessors[
j], i);
408 if (!is_in_successors(prev_block, i)) {
409 FAIL(
"Block %d successors missing %d\n", predecessors[
j], i);
411 for (k = 0; k < block->predecessors_count; k++) {
412 if (k !=
j && predecessors[k] == predecessors[
j]) {
413 FAIL(
"Block %d has duplicate predecessor %d\n", i, predecessors[
j]);
423 ZEND_ASSERT(0 &&
"SSA integrity verification failed");