浏览代码

Merge pull request #9711 from ghalliday/issue17235

HPCC-17235 Short circuit graph traversal in constant propagation

Reviewed-By: Shamser Ahmed <shamser.ahmed@lexisnexis.co.uk>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 8 年之前
父节点
当前提交
dd9ae163b7
共有 3 个文件被更改,包括 29 次插入8 次删除
  1. 8 8
      ecl/hql/hqlfold.cpp
  2. 15 0
      ecl/hql/hqltrans.cpp
  3. 6 0
      ecl/hql/hqltrans.ipp

+ 8 - 8
ecl/hql/hqlfold.cpp

@@ -4928,14 +4928,14 @@ public:
                 }
                 break;
             }
-#if 0
-            //MORE: These should be constant folded , otherwise it can mess up the graph commoning. (see outmod.xhql)
-        case no_crc:
-        case no_hash:
-        case no_hash32:
-        case no_hash64:
-            return LINK(expr);
-#endif
+        case no_selectnth:
+        case NO_AGGREGATE:
+        case no_createset:
+            //Selectively check to see if this subtree needs to be transformed - only transform if it contains
+            //the selector being substituted, or if it needs transforming to update selectors that have changed
+            if (!expr->usesSelector(selector) && !needToUpdateSelectors(expr))
+                return LINK(expr);
+            break;
         }
         if (expr->isConstant())
             return LINK(expr);

+ 15 - 0
ecl/hql/hqltrans.cpp

@@ -1974,6 +1974,21 @@ void NewHqlTransformer::setMapping(IHqlExpression * oldValue, IHqlExpression * n
     setMappingOnly(oldValue, newValue);
 }
 
+bool NewHqlTransformer::needToUpdateSelectors(IHqlExpression * expr)
+{
+    HqlExprCopyArray scopesUsed;
+    expr->gatherTablesUsed(nullptr, &scopesUsed);
+    ForEachItemIn(i, scopesUsed)
+    {
+        IHqlExpression * cur = &scopesUsed.item(i);
+        IHqlExpression * transformed = transformSelector(cur);
+        if (cur != transformed)
+            return true;
+    }
+    return false;
+}
+
+
 void NewHqlTransformer::setMappingOnly(IHqlExpression * oldValue, IHqlExpression * newValue)
 {
     for (;;)

+ 6 - 0
ecl/hql/hqltrans.ipp

@@ -498,6 +498,12 @@ protected:
 
 protected:
     void setMappingOnly(IHqlExpression * oldValue, IHqlExpression * newValue);
+    /*
+     * Returns true if the expression needs to be transformed because selectors it depends on have been transformed.
+     * Used to avoiding walking sections of the expression graph that will not be changed.  It isn't free, so should be
+     * used selectively.
+     */
+    bool needToUpdateSelectors(IHqlExpression * expr);
 
 protected:
     unsigned            pass;