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?
CheckImmedAndMakeContainedcalls intoIsContainableImmedwhich on arm doesn't handle shifts and returns false so thatshiftConstdoesn't get contained even though it could.The weird thing is that the higher level function
ContainCheckNodehandles it. That's because it doesn't actually call intoCheckImmedAndMakeContained. Meanwhile for other nodes like add the higher level function does call into lower levelCheckImmedAndMakeContained:Add:
ContainCheckNode -> ContainCheckBinary -> CheckImmedAndMakeContained -> IsContainableImmed -> MakeSrcContained
Rsh:
ContainCheckNode -> ContainCheckShiftRotate -> shiftBy->IsCnsIntOrI -> MakeSrcContained
Maybe
ContainCheckShiftRotateshould callCheckImmedAndMakeContainedwhich should handle shifts?