Skip to content

Commit

Permalink
JIT: Skip strength reductions that are just widenings (#105075)
Browse files Browse the repository at this point in the history
The previous equality check does not catch the case where the SCEV is
just a widened version of the previous primary IV. We want to leave that
handling up to IV widening.
  • Loading branch information
jakobbotsch authored Jul 18, 2024
1 parent c7f5b71 commit c95095e
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions src/coreclr/jit/inductionvariableopts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1452,10 +1452,25 @@ bool StrengthReductionContext::TryStrengthReduce()
DBEXEC(VERBOSE, currentIV->Dump(m_comp));
JITDUMP("\n");

if (Scev::Equals(currentIV->Step, primaryIV->Step) && !StressProfitability())
if (!StressProfitability())
{
JITDUMP(" Skipping: candidate has same step as primary IV\n");
continue;
if (Scev::Equals(currentIV->Step, primaryIV->Step))
{
JITDUMP(" Skipping: Candidate has same step as primary IV\n");
continue;
}

// Leave widening up to widening.
int64_t newIVStep;
int64_t primaryIVStep;
if (currentIV->Step->TypeIs(TYP_LONG) && primaryIV->Step->TypeIs(TYP_INT) &&
currentIV->Step->GetConstantValue(m_comp, &newIVStep) &&
primaryIV->Step->GetConstantValue(m_comp, &primaryIVStep) &&
(int32_t)newIVStep == (int32_t)primaryIVStep)
{
JITDUMP(" Skipping: Candidate has same widened step as primary IV\n");
continue;
}
}

if (TryReplaceUsesWithNewPrimaryIV(cursors, currentIV))
Expand Down

0 comments on commit c95095e

Please sign in to comment.