Skip to content

Commit 9fae29d

Browse files
Fix GT_ADD trees with mismatched operands (#62177)
Fixes issue observed in dotnet/runtimelab#1128 (comment) - the trees generate additions of `TYP_I_IMPL` with `TYP_INT` and that confuses things down the line.
1 parent ee3b77d commit 9fae29d

2 files changed

Lines changed: 7 additions & 6 deletions

File tree

src/coreclr/jit/importer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8226,7 +8226,7 @@ GenTree* Compiler::impImportStaticFieldAccess(CORINFO_RESOLVED_TOKEN* pResolvedT
82268226
{
82278227
FieldSeqNode* fs = GetFieldSeqStore()->CreateSingleton(pResolvedToken->hField);
82288228
op1 = gtNewOperNode(GT_ADD, op1->TypeGet(), op1,
8229-
new (this, GT_CNS_INT) GenTreeIntCon(TYP_INT, pFieldInfo->offset, fs));
8229+
new (this, GT_CNS_INT) GenTreeIntCon(TYP_I_IMPL, pFieldInfo->offset, fs));
82308230
}
82318231
break;
82328232
}

src/coreclr/jit/morph.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9412,14 +9412,15 @@ GenTree* Compiler::fgExpandVirtualVtableCallTarget(GenTreeCall* call)
94129412

94139413
// [tmp + vtabOffsOfIndirection]
94149414
GenTree* tmpTree1 = gtNewOperNode(GT_ADD, TYP_I_IMPL, gtNewLclvNode(varNum1, TYP_I_IMPL),
9415-
gtNewIconNode(vtabOffsOfIndirection, TYP_INT));
9415+
gtNewIconNode(vtabOffsOfIndirection, TYP_I_IMPL));
94169416
tmpTree1 = gtNewOperNode(GT_IND, TYP_I_IMPL, tmpTree1, false);
94179417
tmpTree1->gtFlags |= GTF_IND_NONFAULTING;
94189418
tmpTree1->gtFlags |= GTF_IND_INVARIANT;
94199419

94209420
// var1 + vtabOffsOfIndirection + vtabOffsAfterIndirection
9421-
GenTree* tmpTree2 = gtNewOperNode(GT_ADD, TYP_I_IMPL, gtNewLclvNode(varNum1, TYP_I_IMPL),
9422-
gtNewIconNode(vtabOffsOfIndirection + vtabOffsAfterIndirection, TYP_INT));
9421+
GenTree* tmpTree2 =
9422+
gtNewOperNode(GT_ADD, TYP_I_IMPL, gtNewLclvNode(varNum1, TYP_I_IMPL),
9423+
gtNewIconNode(vtabOffsOfIndirection + vtabOffsAfterIndirection, TYP_I_IMPL));
94239424

94249425
// var1 + vtabOffsOfIndirection + vtabOffsAfterIndirection + [var1 + vtabOffsOfIndirection]
94259426
tmpTree2 = gtNewOperNode(GT_ADD, TYP_I_IMPL, tmpTree2, tmpTree1);
@@ -9438,7 +9439,7 @@ GenTree* Compiler::fgExpandVirtualVtableCallTarget(GenTreeCall* call)
94389439
else
94399440
{
94409441
// result = [vtab + vtabOffsOfIndirection]
9441-
result = gtNewOperNode(GT_ADD, TYP_I_IMPL, vtab, gtNewIconNode(vtabOffsOfIndirection, TYP_INT));
9442+
result = gtNewOperNode(GT_ADD, TYP_I_IMPL, vtab, gtNewIconNode(vtabOffsOfIndirection, TYP_I_IMPL));
94429443
result = gtNewOperNode(GT_IND, TYP_I_IMPL, result, false);
94439444
result->gtFlags |= GTF_IND_NONFAULTING;
94449445
result->gtFlags |= GTF_IND_INVARIANT;
@@ -9454,7 +9455,7 @@ GenTree* Compiler::fgExpandVirtualVtableCallTarget(GenTreeCall* call)
94549455
{
94559456
// Load the function address
94569457
// result = [result + vtabOffsAfterIndirection]
9457-
result = gtNewOperNode(GT_ADD, TYP_I_IMPL, result, gtNewIconNode(vtabOffsAfterIndirection, TYP_INT));
9458+
result = gtNewOperNode(GT_ADD, TYP_I_IMPL, result, gtNewIconNode(vtabOffsAfterIndirection, TYP_I_IMPL));
94589459
// This last indirection is not invariant, but is non-faulting
94599460
result = gtNewOperNode(GT_IND, TYP_I_IMPL, result, false);
94609461
result->gtFlags |= GTF_IND_NONFAULTING;

0 commit comments

Comments
 (0)