Skip to content

Commit 88860b7

Browse files
authored
JIT: Fix various HW intrinsic lowerings for unused values (#91213)
In the test case we disable CSE but then hoisting hoists out a HWINTRINSIC node that ends up not CSE'd. This results in a top level unused HWINTRINSIC node that lowering didn't handle in a transformation. There's a bunch of transformations that do not handle this correctly, so fix it in all of them. I couldn't find a test case that does not require disabling CSE (and I didn't include the existing one since it never finishes with the bug fixed), but I wouldn't bet on that one doesn't exist, so I think we should backport this anyway. Fix #91173
1 parent dff23ec commit 88860b7

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

src/coreclr/jit/lowerarmarch.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,10 @@ GenTree* Lowering::LowerHWIntrinsicDot(GenTreeHWIntrinsic* node)
19001900
{
19011901
use.ReplaceWith(tmp2);
19021902
}
1903+
else
1904+
{
1905+
tmp2->SetUnusedValue();
1906+
}
19031907

19041908
BlockRange().Remove(node);
19051909
return tmp2->gtNext;

src/coreclr/jit/lowerxarch.cpp

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3868,6 +3868,10 @@ GenTree* Lowering::LowerHWIntrinsicGetElement(GenTreeHWIntrinsic* node)
38683868
{
38693869
use.ReplaceWith(newIndir);
38703870
}
3871+
else
3872+
{
3873+
newIndir->SetUnusedValue();
3874+
}
38713875

38723876
BlockRange().Remove(op1);
38733877
BlockRange().Remove(node);
@@ -3916,6 +3920,10 @@ GenTree* Lowering::LowerHWIntrinsicGetElement(GenTreeHWIntrinsic* node)
39163920
{
39173921
use.ReplaceWith(lclFld);
39183922
}
3923+
else
3924+
{
3925+
lclFld->SetUnusedValue();
3926+
}
39193927

39203928
BlockRange().Remove(op1);
39213929
BlockRange().Remove(op2);
@@ -4158,6 +4166,11 @@ GenTree* Lowering::LowerHWIntrinsicGetElement(GenTreeHWIntrinsic* node)
41584166
{
41594167
use.ReplaceWith(cast);
41604168
}
4169+
else
4170+
{
4171+
node->ClearUnusedValue();
4172+
cast->SetUnusedValue();
4173+
}
41614174
next = LowerNode(cast);
41624175
}
41634176

@@ -4737,6 +4750,10 @@ GenTree* Lowering::LowerHWIntrinsicDot(GenTreeHWIntrinsic* node)
47374750
{
47384751
use.ReplaceWith(tmp1);
47394752
}
4753+
else
4754+
{
4755+
tmp1->SetUnusedValue();
4756+
}
47404757

47414758
BlockRange().Remove(node);
47424759
return LowerNode(tmp1);
@@ -5267,6 +5284,10 @@ GenTree* Lowering::LowerHWIntrinsicDot(GenTreeHWIntrinsic* node)
52675284
{
52685285
use.ReplaceWith(tmp1);
52695286
}
5287+
else
5288+
{
5289+
tmp1->SetUnusedValue();
5290+
}
52705291

52715292
BlockRange().Remove(node);
52725293
return tmp1->gtNext;
@@ -5314,6 +5335,10 @@ GenTree* Lowering::LowerHWIntrinsicToScalar(GenTreeHWIntrinsic* node)
53145335
{
53155336
use.ReplaceWith(newIndir);
53165337
}
5338+
else
5339+
{
5340+
newIndir->SetUnusedValue();
5341+
}
53175342

53185343
BlockRange().Remove(op1);
53195344
BlockRange().Remove(node);
@@ -5342,6 +5367,10 @@ GenTree* Lowering::LowerHWIntrinsicToScalar(GenTreeHWIntrinsic* node)
53425367
{
53435368
use.ReplaceWith(lclFld);
53445369
}
5370+
else
5371+
{
5372+
lclFld->SetUnusedValue();
5373+
}
53455374

53465375
BlockRange().Remove(op1);
53475376
BlockRange().Remove(node);
@@ -5426,6 +5455,11 @@ GenTree* Lowering::LowerHWIntrinsicToScalar(GenTreeHWIntrinsic* node)
54265455
{
54275456
use.ReplaceWith(cast);
54285457
}
5458+
else
5459+
{
5460+
node->ClearUnusedValue();
5461+
cast->SetUnusedValue();
5462+
}
54295463
next = LowerNode(cast);
54305464
}
54315465

@@ -8332,8 +8366,15 @@ void Lowering::TryFoldCnsVecForEmbeddedBroadcast(GenTreeHWIntrinsic* parentNode,
83328366
BlockRange().InsertBefore(broadcastNode, createScalar);
83338367
BlockRange().InsertBefore(createScalar, constScalar);
83348368
LIR::Use use;
8335-
BlockRange().TryGetUse(childNode, &use);
8336-
use.ReplaceWith(broadcastNode);
8369+
if (BlockRange().TryGetUse(childNode, &use))
8370+
{
8371+
use.ReplaceWith(broadcastNode);
8372+
}
8373+
else
8374+
{
8375+
broadcastNode->SetUnusedValue();
8376+
}
8377+
83378378
BlockRange().Remove(childNode);
83388379
LowerNode(createScalar);
83398380
LowerNode(broadcastNode);

0 commit comments

Comments
 (0)