break;
case GT_NULLCHECK:
+ {
// Explicit null check.
- tree->gtVNPair =
- vnStore->VNPWithExc(ValueNumPair(ValueNumStore::VNForVoid(), ValueNumStore::VNForVoid()),
- vnStore->VNPExcSetSingleton(
- vnStore->VNPairForFunc(TYP_REF, VNF_NullPtrExc,
- tree->gtOp.gtOp1->gtVNPair)));
- break;
+ // Handle case where operand tree also may cause exceptions.
+ ValueNumPair excSet = vnStore->VNPExcSetSingleton(
+ vnStore->VNPairForFunc(TYP_REF, VNF_NullPtrExc,
+ vnStore->VNPNormVal(tree->gtOp.gtOp1->gtVNPair)));
+ ValueNumPair excSetBoth =
+ vnStore->VNPExcSetUnion(excSet, vnStore->VNPExcVal(tree->gtOp.gtOp1->gtVNPair));
+
+ tree->gtVNPair = vnStore->VNPWithExc(vnStore->VNPForVoid(), excSetBoth);
+ }
+ break;
case GT_LOCKADD: // Binop
case GT_XADD: // Binop