Changeset: fb6c0ed3f776 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fb6c0ed3f776
Modified Files:
        monetdb5/optimizer/Tests/inlineFunction.malC
        monetdb5/optimizer/Tests/inlineFunction.stable.out
        monetdb5/optimizer/Tests/inlineFunction1.malC
        monetdb5/optimizer/Tests/inlineFunction1.stable.out
        monetdb5/optimizer/Tests/inlineFunction4.malC
        monetdb5/optimizer/Tests/inlineFunction4.stable.out
        monetdb5/optimizer/opt_coercion.c
        monetdb5/optimizer/opt_pipes.c
        monetdb5/optimizer/opt_remap.c
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        sql/test/Tests/setoptimizer.stable.out
Branch: Apr2019
Log Message:

Remove a linear traversal in opt_coercion, which is very expensive for huge MAL 
plans.
Instead rely on a separate call to the alias removal.


diffs (truncated from 305 to 300 lines):

diff --git a/monetdb5/optimizer/Tests/inlineFunction.malC 
b/monetdb5/optimizer/Tests/inlineFunction.malC
--- a/monetdb5/optimizer/Tests/inlineFunction.malC
+++ b/monetdb5/optimizer/Tests/inlineFunction.malC
@@ -28,5 +28,6 @@ io.printf("#result of inline\n");
 optimizer.remap("user","tst");
 optimizer.costModel("user","tst");
 optimizer.coercions("user","tst");
+optimizer.aliases("user","tst");
 optimizer.evaluate("user","tst");
 mdb.list("user","tst");
diff --git a/monetdb5/optimizer/Tests/inlineFunction.stable.out 
b/monetdb5/optimizer/Tests/inlineFunction.stable.out
--- a/monetdb5/optimizer/Tests/inlineFunction.stable.out
+++ b/monetdb5/optimizer/Tests/inlineFunction.stable.out
@@ -32,7 +32,6 @@ function user.tst():void;
     true:bit;
     X_4:int := 0:int;
     X_4:int := 100:int;
-    z := X_4;
 end user.tst;
 
 # 01:05:28 >  
diff --git a/monetdb5/optimizer/Tests/inlineFunction1.malC 
b/monetdb5/optimizer/Tests/inlineFunction1.malC
--- a/monetdb5/optimizer/Tests/inlineFunction1.malC
+++ b/monetdb5/optimizer/Tests/inlineFunction1.malC
@@ -19,5 +19,6 @@ mdb.list("user","tst");
 optimizer.remap("user","tst");
 optimizer.costModel("user","tst");
 optimizer.coercions("user","tst");
+optimizer.aliases("user","tst");
 optimizer.evaluate("user","tst");
 mdb.list("user","tst");
diff --git a/monetdb5/optimizer/Tests/inlineFunction1.stable.out 
b/monetdb5/optimizer/Tests/inlineFunction1.stable.out
--- a/monetdb5/optimizer/Tests/inlineFunction1.stable.out
+++ b/monetdb5/optimizer/Tests/inlineFunction1.stable.out
@@ -31,12 +31,10 @@ Ready.
 #mdb.list("user","tst");
 function user.tst():void;
     true:bit;
-    z := 0:int;
 end user.tst;
 #mdb.list("user","tst");
 function user.tst():void;
     true:bit;
-    z := 0:int;
 end user.tst;
 
 # 05:26:58 >  
diff --git a/monetdb5/optimizer/Tests/inlineFunction4.malC 
b/monetdb5/optimizer/Tests/inlineFunction4.malC
--- a/monetdb5/optimizer/Tests/inlineFunction4.malC
+++ b/monetdb5/optimizer/Tests/inlineFunction4.malC
@@ -28,5 +28,6 @@ io.printf("#result of inline\n");
 optimizer.remap("user","tst");
 optimizer.costModel("user","tst");
 optimizer.coercions("user","tst");
+optimizer.aliases("user","tst");
 optimizer.evaluate("user","tst");
 mdb.list("user","tst");
diff --git a/monetdb5/optimizer/Tests/inlineFunction4.stable.out 
b/monetdb5/optimizer/Tests/inlineFunction4.stable.out
--- a/monetdb5/optimizer/Tests/inlineFunction4.stable.out
+++ b/monetdb5/optimizer/Tests/inlineFunction4.stable.out
@@ -34,7 +34,6 @@ function user.tst():void;
     false:bit;
     -1:int;
     X_5:int := -1:int;
-    z := X_5;
 end user.tst;
 
 # 05:29:17 >  
diff --git a/monetdb5/optimizer/opt_coercion.c 
b/monetdb5/optimizer/opt_coercion.c
--- a/monetdb5/optimizer/opt_coercion.c
+++ b/monetdb5/optimizer/opt_coercion.c
@@ -12,6 +12,7 @@
 
 #include "monetdb_config.h"
 #include "opt_coercion.h"
+#include "opt_aliases.h"
 
 typedef struct{
        int pc;
@@ -20,29 +21,6 @@ typedef struct{
        int src;
 } Coercion;
 
-static int
-coercionOptimizerStep(MalBlkPtr mb, int i, InstrPtr p)
-{
-       int t, k, a, b;
-
-       a = getArg(p, 0);
-       b = getArg(p, 1);
-       t = getVarType(mb, b);
-       if (getVarType(mb, a) != t)
-               return 0;
-       if (strcmp(getFunctionId(p), ATOMname(t)) == 0) {
-               removeInstruction(mb, p); /* dead code */
-               for (; i < mb->stop; i++) {
-                       p = getInstrPtr(mb, i);
-                       for (k = p->retc; k < p->argc; k++)
-                               if (p->argv[k] == a)
-                                       p->argv[k] = b;
-               }
-               return 1;
-       }
-       return 0;
-}
-
 /* Check coercions for numeric types towards :hge that can be handled with 
smaller ones.
  * For now, limit to +,-,/,*,% hge expressions
  * Not every combination may be available in the MAL layer, which calls
@@ -120,7 +98,7 @@ coercionOptimizerAggrStep(Client cntxt, 
 str
 OPTcoercionImplementation(Client cntxt,MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci)
 {
-       int i, k;
+       int i, k, t;
        InstrPtr p;
        int actions = 0;
        str calcRef= putName("calc");
@@ -179,9 +157,12 @@ OPTcoercionImplementation(Client cntxt,M
                coercionOptimizerAggrStep(cntxt,mb, i, coerce);
                coercionOptimizerCalcStep(cntxt,mb, i, coerce);
                if (getModuleId(p)==calcRef && p->argc == 2) {
-                       k= coercionOptimizerStep(mb, i, p);
-                       actions += k;
-                       if( k) i--;
+                       t = getVarType(mb, getArg(p,1));
+                       if (getVarType(mb, getArg(p,0)) == t && 
strcmp(getFunctionId(p), ATOMname(t)) == 0) {
+                               /* turn it into an assignment */
+                               clrFunction(p);
+                               actions ++;
+                       }
                }
        }
        /*
@@ -195,13 +176,14 @@ OPTcoercionImplementation(Client cntxt,M
         chkTypes(cntxt->usermodule, mb, FALSE);
         chkFlow(mb);
         chkDeclarations(mb);
-    }
+    } 
     /* keep all actions taken as a post block comment */
        usec = GDKusec()- usec;
     snprintf(buf,256,"%-20s actions=%2d time=" LLFMT " 
usec","coercion",actions, usec);
     newComment(mb,buf);
        if( actions >= 0)
                addtoMalBlkHistory(mb);
+       /* else we can also remove the request to apply the next alias 
optimizer */
 
        return msg;
 }
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -68,6 +68,7 @@ static struct PIPELINES {
         "optimizer.remap();"
         "optimizer.costModel();"
         "optimizer.coercions();"
+        "optimizer.aliases();"
         "optimizer.evaluate();"
         "optimizer.emptybind();"
         "optimizer.pushselect();"
@@ -104,6 +105,7 @@ static struct PIPELINES {
         "optimizer.remap();"
         "optimizer.costModel();"
         "optimizer.coercions();"
+        "optimizer.aliases();"
         "optimizer.evaluate();"
         "optimizer.emptybind();"
         "optimizer.pushselect();"
@@ -148,6 +150,7 @@ static struct PIPELINES {
         "optimizer.remap();"
         "optimizer.costModel();"
         "optimizer.coercions();"
+        "optimizer.aliases();"
         "optimizer.evaluate();"
         "optimizer.emptybind();"
         "optimizer.pushselect();"
diff --git a/monetdb5/optimizer/opt_remap.c b/monetdb5/optimizer/opt_remap.c
--- a/monetdb5/optimizer/opt_remap.c
+++ b/monetdb5/optimizer/opt_remap.c
@@ -7,7 +7,7 @@
  */
 
 /*
- * The first attempt of the multiple optimizer is to locate
+ * The first attempt of the multiplex optimizer is to locate
  * a properly typed multi-plexed implementation.
  * The policy is to search for bat<mod>.<fcn> before going
  * into the iterator code generation.
@@ -245,11 +245,11 @@ OPTmultiplexInline(Client cntxt, MalBlkP
                                        setModuleId(q,putName(buf));
                                        q->typechk = TYPE_UNKNOWN;
 
-                                       actions++;
                                        /* now see if we can resolve the 
instruction */
                                        
typeChecker(cntxt->usermodule,mq,q,TRUE);
                                        if( q->typechk== TYPE_UNKNOWN)
                                                goto terminateMX;
+                                       actions++;
                                        break;
                                }
                                /* handle simple upgraded assignments as well */
@@ -261,11 +261,11 @@ OPTmultiplexInline(Client cntxt, MalBlkP
                                        q= pushArgument(mq,q, getArg(q,1));
                                        getArg(q,1)= refbat;
                                
-                                       actions++;
                                        q->typechk = TYPE_UNKNOWN;
                                        
typeChecker(cntxt->usermodule,mq,q,TRUE);
                                        if( q->typechk== TYPE_UNKNOWN)
                                                goto terminateMX;
+                                       actions++;
                                        break;
                                }
                }
diff --git 
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
 
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
--- 
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
+++ 
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
@@ -40,12 +40,12 @@ function user.s4_1():void;
     X_5:int := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str, 
0:int);
     C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
-    C_95:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
+    C_96:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
     (X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "name":str, 2:int);
-    C_96:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
+    C_97:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
     X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"name":str, 1:int);
-    C_98:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
-    C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+    C_99:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
+    C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
     X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 0:int);
     (X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "func":str, 2:int);
     X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 1:int);
@@ -101,12 +101,12 @@ function user.s6_1():void;
     X_5:int := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str, 
0:int);
     C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
-    C_95:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
+    C_96:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
     (X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "name":str, 2:int);
-    C_96:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
+    C_97:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
     X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"name":str, 1:int);
-    C_98:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
-    C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+    C_99:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
+    C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
     X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 0:int);
     (X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "func":str, 2:int);
     X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 1:int);
@@ -163,12 +163,12 @@ function user.s8_1():void;
     X_5:int := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str, 
0:int);
     C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
-    C_95:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
+    C_96:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
     (X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "name":str, 2:int);
-    C_96:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
+    C_97:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
     X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"name":str, 1:int);
-    C_98:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
-    C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+    C_99:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, false:bit);
+    C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
     X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 0:int);
     (X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "func":str, 2:int);
     X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 1:int);
@@ -223,12 +223,12 @@ function user.s10_1():void;
     X_5:int := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str, 
0:int);
     C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
-    C_95:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
+    C_96:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
     (X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "name":str, 2:int);
-    C_96:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
+    C_97:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
     X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"name":str, 1:int);
-    C_98:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
-    C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+    C_99:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid], 
"%optimizers%":str, "":str, true:bit);
+    C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid], 
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
     X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 0:int);
     (X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str, 
"functions":str, "func":str, 2:int);
     X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, 
"func":str, 1:int);
diff --git a/sql/test/Tests/setoptimizer.stable.out 
b/sql/test/Tests/setoptimizer.stable.out
--- a/sql/test/Tests/setoptimizer.stable.out
+++ b/sql/test/Tests/setoptimizer.stable.out
@@ -64,11 +64,11 @@ Ready.
 % .L1, .L1,    .L1 # table_name
 % name,        def,    status # name
 % clob,        clob,   clob # type
-% 15,  621,    6 # length
+% 15,  641,    6 # length
 [ "minimal_pipe",      
"optimizer.inline();optimizer.remap();optimizer.deadcode();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.garbageCollector();",
      "stable"        ]
-[ "default_pipe",      
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
    "stable"        ]
-[ "volcano_pipe",      
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.volcano();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
        "stable"        ]
-[ "no_mitosis_pipe",   
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
        "stable"        ]
+[ "default_pipe",      
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
        "stable"        ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to