Line data Source code
1 : /* 2 : * SPDX-License-Identifier: MPL-2.0 3 : * 4 : * This Source Code Form is subject to the terms of the Mozilla Public 5 : * License, v. 2.0. If a copy of the MPL was not distributed with this 6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 : * 8 : * Copyright 2024 MonetDB Foundation; 9 : * Copyright August 2008 - 2023 MonetDB B.V.; 10 : * Copyright 1997 - July 2008 CWI. 11 : */ 12 : 13 : #include "monetdb_config.h" 14 : #include "mal_instruction.h" 15 : #include "opt_aliases.h" 16 : 17 : /* an alias is recognized by a simple assignment */ 18 : #define OPTisAlias(X) (X->argc == 2 && X->token == ASSIGNsymbol && X->barrier == 0 ) 19 : 20 : str 21 1485774 : OPTaliasesImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) 22 : { 23 1485774 : int i, j, k = 1, limit, actions = 0; 24 1485774 : int *alias = 0; 25 1485774 : str msg = MAL_SUCCEED; 26 1485774 : InstrPtr p; 27 : 28 1485774 : (void) stk; 29 1485774 : (void) cntxt; 30 : 31 1485774 : limit = mb->stop; 32 44338650 : for (i = 1; i < limit; i++) { 33 43382326 : p = getInstrPtr(mb, i); 34 43382326 : if (OPTisAlias(p)) 35 : break; 36 : } 37 1485774 : if (i == limit) { 38 : // we didn't found a simple assignment that warrants a rewrite 39 956324 : goto wrapup; 40 : } 41 529450 : k = i; 42 529450 : if (i < limit) { 43 529450 : alias = GDKzalloc(sizeof(int) * mb->vtop); 44 529449 : if (alias == NULL) 45 0 : throw(MAL, "optimizer.aliases", SQLSTATE(HY013) MAL_MALLOC_FAIL); 46 529449 : setVariableScope(mb); 47 48575071 : for (j = 1; j < mb->vtop; j++) 48 47516172 : alias[j] = j; 49 : } 50 28107569 : for (; i < limit; i++) { 51 27578075 : p = getInstrPtr(mb, i); 52 27578075 : mb->stmt[k++] = p; 53 27578075 : if (OPTisAlias(p) && getLastUpdate(mb, getArg(p, 0)) == i 54 3225089 : && getBeginScope(mb, getArg(p, 0)) == i 55 3223962 : && getLastUpdate(mb, getArg(p, 1)) <= i) { 56 3223550 : alias[getArg(p, 0)] = alias[getArg(p, 1)]; 57 3223550 : freeInstruction(p); 58 3223594 : actions++; 59 3223594 : k--; 60 3223594 : mb->stmt[k] = 0; 61 : } else { 62 83042391 : for (int i = 0; i < p->argc; i++) 63 58687866 : getArg(p, i) = alias[getArg(p, i)]; 64 : } 65 : } 66 : 67 3753037 : for (i = k; i < limit; i++) 68 3223543 : mb->stmt[i] = NULL; 69 : 70 529494 : mb->stop = k; 71 529494 : GDKfree(alias); 72 : 73 : /* Defense line against incorrect plans */ 74 : /* Plan is unaffected */ 75 : // msg = chkTypes(cntxt->usermodule, mb, FALSE); 76 : // if ( msg == MAL_SUCCEED) 77 : // msg = chkFlow(mb); 78 : // if ( msg == MAL_SUCCEED) 79 : // msg = chkDeclarations(mb); 80 1485770 : wrapup: 81 : /* keep actions taken as a fake argument */ 82 1485770 : (void) pushInt(mb, pci, actions); 83 1485770 : return msg; 84 : }