t1 = OP1_INFO();
t2 = OP2_INFO();
+ /* If one of the operands cannot have any type, this means the operand derives from
+ * unreachable code. Propagate the empty result early, so that that the following
+ * code may assume that operands have at least one type. */
+ if (!(t1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS|MAY_BE_ERROR))
+ || !(t2 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS|MAY_BE_ERROR))) {
+ tmp = 0;
+ if (ssa_ops[i].result_def >= 0) {
+ UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def);
+ }
+ if (ssa_ops[i].op1_def >= 0) {
+ UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
+ }
+ if (ssa_ops[i].op2_def >= 0) {
+ UPDATE_SSA_TYPE(tmp, ssa_ops[i].op2_def);
+ }
+ return 1;
+ }
+
switch (opline->opcode) {
case ZEND_ADD:
case ZEND_SUB:
/* Ignore the constraint (either ce instanceof constraint->ce or
* they are unrelated, as far as we can statically determine) */
}
- } else if ((tmp & MAY_BE_ANY) == 0) {
- /* FIXME: usage in unreachable block */
- tmp |= MAY_BE_UNDEF;
}
}