Include long shifts in OperIsShiftOrRotate
authorCarol Eidt <carol.eidt@microsoft.com>
Thu, 26 Jul 2018 20:44:47 +0000 (13:44 -0700)
committerCarol Eidt <carol.eidt@microsoft.com>
Thu, 26 Jul 2018 20:54:32 +0000 (13:54 -0700)
The register allocator uses `OperIsShiftOrRotate` as the assertion for the method that gets the kills for the class of instructions that use RCX as the shift amount register. Expand it to include `RSH_LO` and `LSH_HI`.

Fix #19081

src/jit/codegenxarch.cpp
src/jit/gentree.h
src/jit/lowerarmarch.cpp
src/jit/lowerxarch.cpp

index 1ceb928..ea37fb6 100644 (file)
@@ -4131,7 +4131,7 @@ void CodeGen::genCodeForShiftRMW(GenTreeStoreInd* storeInd)
     GenTree* data = storeInd->Data();
     GenTree* addr = storeInd->Addr();
 
-    assert(data->OperIsShiftOrRotate());
+    assert(data->OperIsShift() || data->OperIsRotate());
 
     // This function only handles the RMW case.
     assert(data->gtOp.gtOp1->isUsedFromMemory());
index 83f07d3..4195bf4 100644 (file)
@@ -1281,6 +1281,20 @@ public:
         return OperIsShift(OperGet());
     }
 
+    static bool OperIsShiftLong(genTreeOps gtOper)
+    {
+#ifdef _TARGET_64BIT_
+        return false;
+#else
+        return (gtOper == GT_LSH_HI) || (gtOper == GT_RSH_LO);
+#endif
+    }
+
+    bool OperIsShiftLong() const
+    {
+        return OperIsShiftLong(OperGet());
+    }
+
     static bool OperIsRotate(genTreeOps gtOper)
     {
         return (gtOper == GT_ROL) || (gtOper == GT_ROR);
@@ -1293,7 +1307,7 @@ public:
 
     static bool OperIsShiftOrRotate(genTreeOps gtOper)
     {
-        return OperIsShift(gtOper) || OperIsRotate(gtOper);
+        return OperIsShift(gtOper) || OperIsRotate(gtOper) || OperIsShiftLong(gtOper);
     }
 
     bool OperIsShiftOrRotate() const
index c46809f..f4e3bfc 100644 (file)
@@ -694,6 +694,7 @@ void Lowering::ContainCheckMul(GenTreeOp* node)
 void Lowering::ContainCheckShiftRotate(GenTreeOp* node)
 {
     GenTree* shiftBy = node->gtOp2;
+    assert(node->OperIsShiftOrRotate());
 
 #ifdef _TARGET_ARM_
     GenTree* source = node->gtOp1;
@@ -702,9 +703,7 @@ void Lowering::ContainCheckShiftRotate(GenTreeOp* node)
         assert(source->OperGet() == GT_LONG);
         MakeSrcContained(node, source);
     }
-#else  // !_TARGET_ARM_
-    assert(node->OperIsShiftOrRotate());
-#endif // !_TARGET_ARM_
+#endif // _TARGET_ARM_
 
     if (shiftBy->IsCnsIntOrI())
     {
index 327eb2b..6aa2951 100644 (file)
@@ -1693,18 +1693,15 @@ void Lowering::ContainCheckMul(GenTreeOp* node)
 //
 void Lowering::ContainCheckShiftRotate(GenTreeOp* node)
 {
+    assert(node->OperIsShiftOrRotate());
 #ifdef _TARGET_X86_
     GenTree* source = node->gtOp1;
-    if (node->OperIs(GT_LSH_HI, GT_RSH_LO))
+    if (node->OperIsShiftLong())
     {
         assert(source->OperGet() == GT_LONG);
         MakeSrcContained(node, source);
     }
-    else
 #endif // !_TARGET_X86_
-    {
-        assert(node->OperIsShiftOrRotate());
-    }
 
     GenTree* shiftBy = node->gtOp2;
     if (IsContainableImmed(node, shiftBy) && (shiftBy->gtIntConCommon.IconValue() <= 255) &&