dotnet/runtime

JIT: Arm `IsContainableImmed` doesnt handle shifts

Open

#125 578 ouverte le 15 mars 2026

Voir sur GitHub
 (2 commentaires) (0 réactions) (0 assignés)C# (5 445 forks)batch import
area-CodeGen-coreclrhelp wantedoptimization

Métriques du dépôt

Stars
 (17 886 stars)
Métriques de merge PR
 (Merge moyen 12j 11h) (661 PRs mergées en 30 j)

Description

GenTree* shiftConst = m_compiler->gtNewIconNode(31, TYP_INT);
GenTree* sar        = m_compiler->gtNewOperNode(GT_RSH, select->TypeGet(), relopOp1, shiftConst);
CheckImmedAndMakeContained(sar, shiftConst); // false

CheckImmedAndMakeContained calls into IsContainableImmed which on arm doesn't handle shifts and returns false so that shiftConst doesn't get contained even though it could.

The weird thing is that the higher level function ContainCheckNode handles it. That's because it doesn't actually call into CheckImmedAndMakeContained. Meanwhile for other nodes like add the higher level function does call into lower level CheckImmedAndMakeContained:

Add: ContainCheckNode -> ContainCheckBinary -> CheckImmedAndMakeContained -> IsContainableImmed -> MakeSrcContained

Rsh: ContainCheckNode -> ContainCheckShiftRotate -> shiftBy->IsCnsIntOrI -> MakeSrcContained

Maybe ContainCheckShiftRotate should call CheckImmedAndMakeContained which should handle shifts?

Guide contributeur