dotnet/runtime

JIT: Arm `IsContainableImmed` doesnt handle shifts

开放

#125,578 创建于 2026年3月15日

 (2 条评论) (0 个反应) (0 位负责人)C# (5,445 个派生)batch import
area-CodeGen-coreclrhelp wantedoptimization

仓库指标

星标
 (17,886 个星标)
PR 合并指标
 (PR 指标待抓取)

描述

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?

贡献者指南