| 1 | /* |
| 2 | * This Source Code Form is subject to the terms of the Mozilla Public |
| 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 5 | * |
| 6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
| 7 | */ |
| 8 | |
| 9 | /* |
| 10 | * This simple module unrolls the mat.pack into an incremental sequence. |
| 11 | * This could speedup parallel processing and releases resources faster. |
| 12 | */ |
| 13 | #include "monetdb_config.h" |
| 14 | #include "opt_matpack.h" |
| 15 | |
| 16 | str |
| 17 | OPTmatpackImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) |
| 18 | { |
| 19 | int v, i, j, limit, slimit; |
| 20 | InstrPtr p,q; |
| 21 | int actions = 0; |
| 22 | InstrPtr *old; |
| 23 | char buf[256]; |
| 24 | lng usec = GDKusec(); |
| 25 | |
| 26 | //if ( !optimizerIsApplied(mb,"multiplex") ) |
| 27 | //return 0; |
| 28 | (void) pci; |
| 29 | (void) cntxt; |
| 30 | (void) stk; /* to fool compilers */ |
| 31 | for( i = 1; i < mb->stop; i++) |
| 32 | if( getModuleId(getInstrPtr(mb,i)) == matRef && getFunctionId(getInstrPtr(mb,i)) == packRef && isaBatType(getArgType(mb,getInstrPtr(mb,i),1))) |
| 33 | break; |
| 34 | if( i == mb->stop) |
| 35 | goto wrapup; |
| 36 | |
| 37 | old= mb->stmt; |
| 38 | limit= mb->stop; |
| 39 | slimit = mb->ssize; |
| 40 | if ( newMalBlkStmt(mb,mb->stop) < 0) |
| 41 | throw(MAL,"optimizer.matpack" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
| 42 | for (i = 0; i < limit; i++) { |
| 43 | p = old[i]; |
| 44 | if( getModuleId(p) == matRef && getFunctionId(p) == packRef && isaBatType(getArgType(mb,p,1))) { |
| 45 | q = newInstruction(0, matRef, packIncrementRef); |
| 46 | setDestVar(q, newTmpVariable(mb, getArgType(mb,p,1)));\ |
| 47 | q = pushArgument(mb, q, getArg(p,1)); |
| 48 | v = getArg(q,0); |
| 49 | q = pushInt(mb,q, p->argc - p->retc); |
| 50 | pushInstruction(mb,q); |
| 51 | typeChecker(cntxt->usermodule,mb,q,TRUE); |
| 52 | |
| 53 | for ( j = 2; j < p->argc; j++) { |
| 54 | q = newInstruction(0, matRef, packIncrementRef); |
| 55 | q = pushArgument(mb, q, v); |
| 56 | q = pushArgument(mb, q, getArg(p,j)); |
| 57 | setDestVar(q, newTmpVariable(mb, getVarType(mb,v))); |
| 58 | v = getArg(q,0); |
| 59 | pushInstruction(mb,q); |
| 60 | typeChecker(cntxt->usermodule,mb,q,TRUE); |
| 61 | } |
| 62 | getArg(q,0) = getArg(p,0); |
| 63 | freeInstruction(p); |
| 64 | actions++; |
| 65 | continue; |
| 66 | } |
| 67 | pushInstruction(mb,p); |
| 68 | } |
| 69 | for(; i<slimit; i++) |
| 70 | if (old[i]) |
| 71 | freeInstruction(old[i]); |
| 72 | GDKfree(old); |
| 73 | |
| 74 | /* Defense line against incorrect plans */ |
| 75 | if( actions > 0){ |
| 76 | //chkTypes(cntxt->usermodule, mb, FALSE); |
| 77 | //chkFlow(mb); |
| 78 | //chkDeclarations(mb); |
| 79 | } |
| 80 | /* keep all actions taken as a post block comment */ |
| 81 | wrapup: |
| 82 | usec = GDKusec()- usec; |
| 83 | snprintf(buf,256,"%-20s actions=%2d time=" LLFMT " usec" ,"matpack" ,actions, usec); |
| 84 | newComment(mb,buf); |
| 85 | if( actions >= 0) |
| 86 | addtoMalBlkHistory(mb); |
| 87 | |
| 88 | if( OPTdebug & OPTmatpack){ |
| 89 | fprintf(stderr, "#MATPACK optimizer exit\n" ); |
| 90 | fprintFunction(stderr, mb, 0, LIST_MAL_ALL); |
| 91 | } |
| 92 | return MAL_SUCCEED; |
| 93 | } |
| 94 | |