Changeset: ffee2d699f5b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ffee2d699f5b
Modified Files:
monetdb5/optimizer/opt_evaluate.c
Branch: default
Log Message:
Simplify the evaluation optimizer
Eassier block administration and consequental skipping.
diffs (143 lines):
diff --git a/monetdb5/optimizer/opt_evaluate.c
b/monetdb5/optimizer/opt_evaluate.c
--- a/monetdb5/optimizer/opt_evaluate.c
+++ b/monetdb5/optimizer/opt_evaluate.c
@@ -38,77 +38,72 @@ OPTallConstant(Client cntxt, MalBlkPtr m
static int OPTsimpleflow(MalBlkPtr mb, int pc)
{
- int i, block =0, simple= TRUE;
- InstrPtr p;
+ int i, block =0, simple= TRUE;
+ InstrPtr p;
- for ( i= pc; i< mb->stop; i++){
- p =getInstrPtr(mb,i);
- if (blockStart(p))
- block++;
- if ( blockExit(p))
- block--;
- if ( blockCntrl(p))
- simple= FALSE;
- if ( block == 0){
- return simple;
- }
- }
- return FALSE;
+ for ( i= pc; i< mb->stop; i++){
+ p =getInstrPtr(mb,i);
+ if (blockStart(p))
+ block++;
+ if ( blockExit(p))
+ block--;
+ if ( blockCntrl(p))
+ simple= FALSE;
+ if ( block == 0){
+ return simple;
+ }
+ }
+ return FALSE;
}
+
/* barrier blocks can only be dropped when they are fully excluded. */
static int
OPTremoveUnusedBlocks(Client cntxt, MalBlkPtr mb)
{
/* catch and remove constant bounded blocks */
- int i, j = 0, action = 0, block = 0, skip = 0, top =0, skiplist[10];
+ int i, j = 0, action = 0, block = -1, skip = 0, multipass = 1;
InstrPtr p;
- for (i = 0; i < mb->stop; i++) {
- p = mb->stmt[i];
- if (blockStart(p)) {
- block++;
- if (p->argc == 2 && isVarConstant(mb, getArg(p, 1)) &&
- getArgType(mb, p, 1) == TYPE_bit &&
- getVarConstant(mb, getArg(p,
1)).val.btval == 0)
- {
- if (skip == 0)
- skip = block;
- action++;
+ while(multipass--){
+ block = -1;
+ skip = 0;
+ j = 0;
+ for (i = 0; i < mb->stop; i++) {
+ p = mb->stmt[i];
+ if (blockExit(p) && block == getArg(p,0) ){
+ block = -1;
+ skip = 0;
+ freeInstruction(p);
+ continue;
}
- // Try to remove the barrier statement itself (when
true).
- if (p->argc == 2 && isVarConstant(mb, getArg(p, 1)) &&
- getArgType(mb, p, 1) == TYPE_bit &&
- getVarConstant(mb, getArg(p,
1)).val.btval == 1 &&
- top <10 && OPTsimpleflow(mb,i))
- {
- skiplist[top++]= getArg(p,0);
- freeInstruction(p);
- continue;
- }
- }
- if (blockExit(p)) {
- if (top > 0 && skiplist[top-1] == getArg(p,0) ){
- top--;
- freeInstruction(p);
- continue;
- }
+ if (p->argc == 2 && blockStart(p) && block < 0 &&
isVarConstant(mb, getArg(p, 1)) && getArgType(mb, p, 1) == TYPE_bit ){
+ if( getVarConstant(mb, getArg(p, 1)).val.btval
== 0)
+ {
+ block = getArg(p,0);
+ skip ++;
+ action++;
+ }
+ // Try to remove the barrier statement itself
(when true).
+ if ( getVarConstant(mb, getArg(p, 1)).val.btval
== 1 && OPTsimpleflow(mb,i))
+ {
+ block = getArg(p,0);
+ skip = 0;
+ action++;
+ freeInstruction(p);
+ continue;
+ }
+ } else
+ if( p->argc == 2 && blockStart(p) && block >= 0 &&
skip == 0 && isVarConstant(mb, getArg(p, 1)) && getArgType(mb, p, 1) ==
TYPE_bit && multipass == 0)
+ multipass++;
if (skip)
freeInstruction(p);
else
mb->stmt[j++] = p;
- if (skip == block)
- skip = 0;
- block--;
- if (block == 0)
- skip = 0;
- } else if (skip)
- freeInstruction(p);
- else
- mb->stmt[j++] = p;
+ }
+ mb->stop = j;
+ for (; j < i; j++)
+ mb->stmt[j] = NULL;
}
- mb->stop = j;
- for (; j < i; j++)
- mb->stmt[j] = NULL;
if (action) {
chkTypes(cntxt->fdout, cntxt->nspace, mb, TRUE);
return mb->errors ? 0 : action;
@@ -223,9 +218,9 @@ OPTevaluateImplementation(Client cntxt,
mb->errors = 0;
}
}
- //constantblock += p->barrier > 0 && OPTallConstant(cntxt, mb,
p); /* Feb2013 */
constantblock += blockStart(p) && OPTallConstant(cntxt, mb,
p); /* default */
}
+ // produces errors in SQL when enabled
if ( constantblock)
actions += OPTremoveUnusedBlocks(cntxt, mb);
GDKfree(assigned);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list