Просмотр исходного кода

HPCC-10534 Add a debug option 'optimizeMax'

Gavin Halliday 11 лет назад
Родитель
Сommit
4ba652a56c
5 измененных файлов с 18 добавлено и 3 удалено
  1. 3 3
      ecl/hql/hqlopt.cpp
  2. 1 0
      ecl/hql/hqlopt.hpp
  3. 11 0
      ecl/hqlcpp/hqlcpp.cpp
  4. 1 0
      ecl/hqlcpp/hqlcpp.ipp
  5. 2 0
      ecl/hqlcpp/hqlttcpp.cpp

+ 3 - 3
ecl/hql/hqlopt.cpp

@@ -758,7 +758,7 @@ IHqlExpression * CTreeOptimizer::optimizeDatasetIf(IHqlExpression * transformed)
     return LINK(transformed);
 }
 
-static bool branchesMatch(IHqlExpression * left, IHqlExpression * right)
+static bool branchesMatch(unsigned options, IHqlExpression * left, IHqlExpression * right)
 {
     if (left->queryBody() == right->queryBody())
         return true;
@@ -789,7 +789,7 @@ static bool branchesMatch(IHqlExpression * left, IHqlExpression * right)
         {
             //The following code allows LEFT to be referred to within the transform, but I don't think it is worth enabling
             //because of the potential cost of replacing the selseq within the transform.
-            if (false)
+            if (options & HOOexpensive)
             {
                 if ((leftOp != no_hqlproject) || !curLeft->isTransform())
                     return false;
@@ -814,7 +814,7 @@ IHqlExpression * CTreeOptimizer::optimizeIf(IHqlExpression * expr)
     if (!falseExpr)
         return NULL;
 
-    if (branchesMatch(trueExpr, falseExpr))
+    if (branchesMatch(options, trueExpr, falseExpr))
     {
         noteUnused(trueExpr);       // inherit usage() will increase the usage again
         noteUnused(falseExpr);

+ 1 - 0
ecl/hql/hqlopt.hpp

@@ -31,6 +31,7 @@ enum
     HOOhascompoundaggregate     = 0x0040,
     HOOfoldconstantdatasets     = 0x0080,
     HOOalwayslocal              = 0x0100,
+    HOOexpensive                = 0x0200,   // include potentially expensive optimizations
 };
 
 extern HQL_API IHqlExpression * optimizeHqlExpression(IHqlExpression * expr, unsigned options);

+ 11 - 0
ecl/hqlcpp/hqlcpp.cpp

@@ -1728,6 +1728,7 @@ void HqlCppTranslator::cacheOptions()
         DebugOption(options.expandPersistInputDependencies,"expandPersistInputDependencies",true),
         DebugOption(options.multiplePersistInstances,"multiplePersistInstances",true),
         DebugOption(options.defaultNumPersistInstances,"defaultNumPersistInstances",-1),
+        DebugOption(options.optimizeMax,"optimizeMax",false),
     };
 
     //get options values from workunit
@@ -1800,6 +1801,14 @@ void HqlCppTranslator::cacheOptions()
 
 void HqlCppTranslator::postProcessOptions()
 {
+    if (options.optimizeMax)
+    {
+        //Enable any extra potentially expensive optimizations options here...
+        options.foldConstantDatasets = true;
+        options.percolateConstants = true;
+        options.percolateFilters = true;
+    }
+
 //Any post processing - e.g., dependent flags goes here...
     options.optimizeDiskFlag = 0;
     if (options.optimizeInlineSource) 
@@ -1850,6 +1859,8 @@ unsigned HqlCppTranslator::getOptimizeFlags() const
         optFlags |= HOOhascompoundaggregate;
     if (options.foldConstantDatasets)
         optFlags |= HOOfoldconstantdatasets;
+    if (options.optimizeMax)
+        optFlags |= HOOexpensive;
     return optFlags;
 }
 

+ 1 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -725,6 +725,7 @@ struct HqlCppOptions
     bool                expandPersistInputDependencies;
     bool                expirePersists;
     bool                actionLinkInNewGraph;
+    bool                optimizeMax;
 };
 
 //Any information gathered while processing the query should be moved into here, rather than cluttering up the translator class

+ 2 - 0
ecl/hqlcpp/hqlttcpp.cpp

@@ -12879,8 +12879,10 @@ bool HqlCppTranslator::transformGraphForGeneration(HqlQueryContext & query, Work
         if (options.foldConstantDatasets) foldOptions |= HFOconstantdatasets;
         if (options.percolateConstants) foldOptions |= HFOpercolateconstants;
         if (options.percolateFilters) foldOptions |= HFOpercolatefilters;
+        if (options.optimizeMax) foldOptions |= HFOx_op_not_x;
         if (options.globalFoldOptions != (unsigned)-1)
             foldOptions = options.globalFoldOptions;
+
         foldHqlExpression(folded, exprs, foldOptions);
         replaceArray(exprs, folded);
         updateTimer("workunit;tree transform: global fold", msTick()-startTime);