Changeset: 963728015958 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=963728015958
Modified Files:
        monetdb5/optimizer/opt_dataflow.c
        monetdb5/optimizer/opt_dataflow.h
Branch: Feb2013
Log Message:

Separate removal part of dataflow
When performing repetative optimizer pipelines, you may want
to get rid of the dataflow injected instructions.


diffs (100 lines):

diff --git a/monetdb5/optimizer/opt_dataflow.c 
b/monetdb5/optimizer/opt_dataflow.c
--- a/monetdb5/optimizer/opt_dataflow.c
+++ b/monetdb5/optimizer/opt_dataflow.c
@@ -63,13 +63,19 @@ simpleFlow(InstrPtr *old, int start, int
 }
 
 /* optimizers may remove the dataflow hints first */
-void removeDataflow(MalBlkPtr mb, InstrPtr *old, int limit)
+void removeDataflow( Client cntxt, MalBlkPtr mb)
 {
-       int i, j, k, flowblock=0;
-       InstrPtr p;
+       int i, k, flowblock=0, limit;
+       InstrPtr p, *old;
        int *init= GDKzalloc(mb->vtop * sizeof(int)), skip = 0;
+       char *delete= (char*) GDKzalloc(mb->stop);
+       char *used= (char*) GDKzalloc(mb->vtop);
 
-       if ( init == 0)
+       if ( delete == 0 || init == 0 || used == 0)
+               return;
+       old = mb->stmt;
+       limit = mb->stop;
+       if ( newMalBlkStmt(mb, mb->ssize) <0 )
                return;
        /* remove the inlined dataflow barriers */
        for (i = 1; i<limit; i++) {
@@ -79,39 +85,34 @@ void removeDataflow(MalBlkPtr mb, InstrP
                    getModuleId(p) == languageRef &&
                    getFunctionId(p) == dataflowRef){
                        flowblock = getArg(p,0);
-                       freeInstruction(p);
-                       old[i] = NULL;
-               } else if (flowblock && blockExit(p) && getArg(p,0) == 
flowblock) {
+                       delete[i] = 1;
+               } else if (blockExit(p) && getArg(p,0) == flowblock) {
                        flowblock = 0;
-                       freeInstruction(p);
-                       old[i] = NULL;
-               } else {
+                       delete[i] = 1;
+               } else if ( blockStart(p) )
+                               skip++;
+               else {
                        /* remember first initialization */
-                       if ( p->argc == 2 && isVarConstant(mb,getArg(p,1))  && 
init[getArg(p,0)] == 0)
-                               init[getArg(p,0)] = i;
-                       if( blockStart(p) && !skip)
-                               skip++;
+                       for ( k = p->retc; k < p->argc; k++)
+                               used[getArg(p,k)] = 1;
+                       if ( init[getArg(p,0)]  && ! used[getArg(p,0)]) 
+                               /* remove the old initialization */
+                               delete[ init[getArg(p,0)]] = 1;
+                       init[getArg(p,0)] = i;
                }
        }
        /* remove the superflous variable initializations */
        /* when there are no auxillary barrier blocks */
-       if ( !skip)
-       for (i = 1; i<limit; i++) {
-               p = old[i];
-               if ( p && init[ j = getArg(p,0)]  != i  &&  j && old[init[j]] 
== 0){
-                       /* check for self-use in second assignment */
-                       for ( k = p->retc; k < p->argc; k++)
-                               if ( getArg(p,k) == getArg(p,0) )
-                                       break;
-                       if ( k == p->argc) {
-                               freeInstruction( old[init[j]]);
-                               old[j] = NULL;
-                       }
-                       /* ignore further */
-                       init[j] = 0;
-               } 
-       }
+       for (i = 0; i<limit; i++) 
+               if ( delete[i] == 0 || !skip )
+                       pushInstruction(mb,old[i]);
+               else freeInstruction(old[i]);
+       mnstr_printf(cntxt->fdout, "Remove dataflow\n");
+       printFunction(cntxt->fdout, mb, 0, LIST_MAL_STMT);
        GDKfree(init);
+       GDKfree(old);
+       GDKfree(used);
+       GDKfree(delete);
 }
 
 static int
diff --git a/monetdb5/optimizer/opt_dataflow.h 
b/monetdb5/optimizer/opt_dataflow.h
--- a/monetdb5/optimizer/opt_dataflow.h
+++ b/monetdb5/optimizer/opt_dataflow.h
@@ -24,7 +24,7 @@
 #include "opt_support.h"
 
 #define OPTDEBUGdataflow  if ( optDebug & (1 <<DEBUG_OPT_DATAFLOW) )
-opt_export void removeDataflow(MalBlkPtr mb, InstrPtr *old, int limit);
+opt_export void removeDataflow(Client cntxt, MalBlkPtr mb);
 opt_export int OPTdataflowImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr p);
 
 #endif
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to