Obey GTF_REVERSE_OPS in fgWalkTreePost.
authorPat Gavlin <pagavlin@microsoft.com>
Tue, 21 Jun 2016 17:58:43 +0000 (10:58 -0700)
committerPat Gavlin <pagavlin@microsoft.com>
Tue, 21 Jun 2016 17:58:43 +0000 (10:58 -0700)
This particular sort of tree walk should correspond to the
tree execution order.

src/jit/gentree.cpp

index e5c1c66..dec3497 100644 (file)
@@ -690,18 +690,38 @@ Compiler::fgWalkResult Compiler::fgWalkTreePostRec(GenTreePtr *pTree, fgWalkData
 
     fgWalkData->parent = tree;
 
-    if  (kind & GTK_SMPOP)
+    if (kind & GTK_SMPOP)
     {
-        if  (tree->gtOp.gtOp1)
+        GenTree** op1Slot = &tree->gtOp.gtOp1;
+
+        GenTree** op2Slot;
+        if (tree->OperIsBinary())
         {
-            result = fgWalkTreePostRec<computeStack>(&tree->gtOp.gtOp1, fgWalkData);
+            if ((tree->gtFlags & GTF_REVERSE_OPS) == 0)
+            {
+                op2Slot = &tree->gtOp.gtOp2;
+            }
+            else
+            {
+                op2Slot = op1Slot;
+                op1Slot = &tree->gtOp.gtOp2;
+            }
+        }
+        else
+        {
+            op2Slot = nullptr;
+        }
+
+        if (*op1Slot != nullptr)
+        {
+            result = fgWalkTreePostRec<computeStack>(op1Slot, fgWalkData);
             if  (result == WALK_ABORT)
                 return result;
         }
 
-        if  (tree->gtGetOp2())
+        if (op2Slot != nullptr && *op2Slot != nullptr)
         {
-            result = fgWalkTreePostRec<computeStack>(&tree->gtOp.gtOp2, fgWalkData);
+            result = fgWalkTreePostRec<computeStack>(op2Slot, fgWalkData);
             if  (result == WALK_ABORT)
                 return result;
         }