浏览代码

HPCC-19946 Fix various problems optimizing LOOPs

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 7 年之前
父节点
当前提交
8243865f09
共有 8 个文件被更改,包括 12 次插入7 次删除
  1. 2 0
      ecl/hql/hqlatoms.cpp
  2. 1 0
      ecl/hql/hqlatoms.hpp
  3. 4 0
      ecl/hql/hqlopt.cpp
  4. 1 1
      ecl/hql/hqlthql.cpp
  5. 0 2
      ecl/hqlcpp/hqlcatom.cpp
  6. 0 1
      ecl/hqlcpp/hqlcatom.hpp
  7. 3 2
      ecl/hqlcpp/hqlhtcpp.cpp
  8. 1 1
      ecl/hqlcpp/hqlttcpp.cpp

+ 2 - 0
ecl/hql/hqlatoms.cpp

@@ -260,6 +260,7 @@ IAtom * _location_Atom;
 IAtom * logAtom;
 IAtom * logicalFilenameAtom;
 IAtom * lookupAtom;
+IAtom * loopFirstAtom;
 IAtom * lzwAtom;
 IAtom * macroAtom;
 IAtom * manyAtom;
@@ -724,6 +725,7 @@ MODULE_INIT(INIT_PRIORITY_HQLATOM)
     MAKEATOM(log);
     MAKEATOM(logicalFilename);
     MAKEATOM(lookup);
+    MAKEATOM(loopFirst);
     MAKEATOM(lzw);
     MAKEATOM(macro);
     MAKEATOM(many);

+ 1 - 0
ecl/hql/hqlatoms.hpp

@@ -264,6 +264,7 @@ extern HQL_API IAtom * _location_Atom;
 extern HQL_API IAtom * logAtom;
 extern HQL_API IAtom * logicalFilenameAtom;
 extern HQL_API IAtom * lookupAtom;
+extern HQL_API IAtom * loopFirstAtom;
 extern HQL_API IAtom * lzwAtom;
 extern HQL_API IAtom * macroAtom;
 extern HQL_API IAtom * manyAtom;

+ 4 - 0
ecl/hql/hqlopt.cpp

@@ -1644,6 +1644,10 @@ void CTreeOptimizer::analyseExpr(IHqlExpression * expr)
         //only look at the filename - not the parent files.
         analyseExpr(expr->queryChild(0));
         return;
+    case no_attr_expr:
+        if (!isInternalAttributeName(expr->queryName()))
+            analyseChildren(expr);
+        return;
     }
 
     PARENT::analyseExpr(expr);

+ 1 - 1
ecl/hql/hqlthql.cpp

@@ -150,7 +150,7 @@ private:
                 return true;
             if (tryToRegenerate)
             {
-                if (name == jobTempAtom)
+                if (name == jobTempAtom || name == loopFirstAtom)
                     return true;
             }
         }

+ 0 - 2
ecl/hqlcpp/hqlcatom.cpp

@@ -64,7 +64,6 @@ IAtom * insideOnCreateAtom;
 IAtom * insideOnStartAtom;
 IAtom * instanceAtom;
 IAtom * _loop_Atom;
-IAtom * _loopFirst_Atom;
 IAtom * mainprototypesAtom;
 IAtom * multiInstanceAtom;
 IAtom * _noAccess_Atom;
@@ -1504,7 +1503,6 @@ MODULE_INIT(INIT_PRIORITY_HQLATOM-1)
     MAKESYSATOM(accessedFromChild);
     MAKESYSATOM(conditionalRowMarker);
     MAKESYSATOM(loop);
-    MAKESYSATOM(loopFirst);
     MAKESYSATOM(noAccess);
     MAKESYSATOM(noReplicate);
     MAKESYSATOM(noVirtual);

+ 0 - 1
ecl/hqlcpp/hqlcatom.hpp

@@ -62,7 +62,6 @@ extern IAtom * insideOnCreateAtom;
 extern IAtom * insideOnStartAtom;
 extern IAtom * instanceAtom;
 extern IAtom * _loop_Atom;
-extern IAtom * _loopFirst_Atom;
 extern IAtom * mainprototypesAtom;
 extern IAtom * multiInstanceAtom;
 extern IAtom * _noAccess_Atom;

+ 3 - 2
ecl/hqlcpp/hqlhtcpp.cpp

@@ -8757,7 +8757,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityLoop(BuildCtx & ctx, IHqlExpre
         buildReturn(func.ctx, loopCond);
     }
 
-    IHqlExpression * loopFirst = queryAttributeChild(expr, _loopFirst_Atom, 0);
+    IHqlExpression * loopFirst = queryAttributeChild(expr, loopFirstAtom, 0);
     if (loopFirst)
         doBuildBoolFunction(instance->startctx, "loopFirstTime", loopFirst);
 
@@ -9588,7 +9588,8 @@ IHqlExpression * HqlCppTranslator::getResourcedGraph(IHqlExpression * expr, IHql
     //expressions prevents child expressions from preventing fields from being removed.
     //Perform before the optimizeHqlExpression() so decisions about reducing row sizes are accurate
     traceExpression("BeforeImplicitProjectGraph", resourced);
-    resourced.setown(insertImplicitProjects(*this, resourced, false));
+    if (options.optimizeResourcedProjects)
+        resourced.setown(insertImplicitProjects(*this, resourced, false));
 
     // Call optimizer before resourcing so items get moved over conditions, and remove other items
     // which would otherwise cause extra spills.

+ 1 - 1
ecl/hqlcpp/hqlttcpp.cpp

@@ -13437,7 +13437,7 @@ IHqlExpression * HqlTreeNormalizer::createTransformedBody(IHqlExpression * expr)
                     OwnedHqlExpr one = createConstant(createIntValue(1, counter->getType()));
                     firstCond.setown(quickFullReplaceExpression(firstCond, counter, one));
                 }
-                return appendOwnedOperand(transformed, createExprAttribute(_loopFirst_Atom, firstCond.getClear()));
+                return appendOwnedOperand(transformed, createExprAttribute(loopFirstAtom, firstCond.getClear()));
             }
             return transformed.getClear();
         }