if (tree->gtFlags & GTF_IND_INVARIANT)
{
assert(!isVolatile); // We don't expect both volatile and invariant
- tree->gtVNPair =
- ValueNumPair(vnStore->VNForMapSelect(VNK_Liberal, TYP_REF, ValueNumStore::VNForROH(),
- addrNvnp.GetLiberal()),
- vnStore->VNForMapSelect(VNK_Conservative, TYP_REF, ValueNumStore::VNForROH(),
- addrNvnp.GetConservative()));
- tree->gtVNPair = vnStore->VNPWithExc(tree->gtVNPair, addrXvnp);
+
+ // Is it a string literal? (it's always non-null)
+ if (addr->IsCnsIntOrI() && addr->IsIconHandle(GTF_ICON_STR_HDL))
+ {
+ tree->gtVNPair = vnStore->VNPairForFunc(tree->TypeGet(), VNF_StrCns, addrNvnp);
+ assert(addrXvnp.BothEqual() && (addrXvnp.GetLiberal() == ValueNumStore::VNForEmptyExcSet()));
+ }
+ else
+ {
+ tree->gtVNPair =
+ ValueNumPair(vnStore->VNForMapSelect(VNK_Liberal, TYP_REF, ValueNumStore::VNForROH(),
+ addrNvnp.GetLiberal()),
+ vnStore->VNForMapSelect(VNK_Conservative, TYP_REF, ValueNumStore::VNForROH(),
+ addrNvnp.GetConservative()));
+ tree->gtVNPair = vnStore->VNPWithExc(tree->gtVNPair, addrXvnp);
+ }
}
else if (isVolatile)
{
break;
case CORINFO_HELP_STRCNS:
- vnf = VNF_StrCns;
+ vnf = VNF_LazyStrCns;
break;
case CORINFO_HELP_CHKCASTCLASS:
ValueNumFuncDef(Box, 3, false, false, false)
ValueNumFuncDef(BoxNullable, 3, false, false, false)
-ValueNumFuncDef(StrCns, 2, false, true, false)
+ValueNumFuncDef(LazyStrCns, 2, false, true, false) // lazy-initialized string literal (helper)
+ValueNumFuncDef(StrCns, 1, false, true, false) // indirect for a string literal
ValueNumFuncDef(Unbox, 2, false, true, false)
ValueNumFuncDef(LT_UN, 2, false, false, false) // unsigned or unordered comparisons