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 "opt_fastpath.h"
15 : #include "opt_aliases.h"
16 : #include "opt_coercion.h"
17 : #include "opt_commonTerms.h"
18 : #include "opt_candidates.h"
19 : #include "opt_constants.h"
20 : #include "opt_costModel.h"
21 : #include "opt_dataflow.h"
22 : #include "opt_deadcode.h"
23 : #include "opt_dict.h"
24 : #include "opt_for.h"
25 : #include "opt_emptybind.h"
26 : #include "opt_evaluate.h"
27 : #include "opt_garbageCollector.h"
28 : #include "opt_generator.h"
29 : #include "opt_inline.h"
30 : #include "opt_projectionpath.h"
31 : #include "opt_matpack.h"
32 : #include "opt_postfix.h"
33 : #include "opt_mergetable.h"
34 : #include "opt_mitosis.h"
35 : #include "opt_multiplex.h"
36 : #include "opt_profiler.h"
37 : #include "opt_pushselect.h"
38 : #include "opt_querylog.h"
39 : #include "opt_reduce.h"
40 : #include "opt_remap.h"
41 : #include "opt_remoteQueries.h"
42 : #include "opt_reorder.h"
43 : #include "opt_fastpath.h"
44 : #include "optimizer_private.h"
45 : #include "mal_interpreter.h"
46 : #include "opt_prelude.h"
47 :
48 : #define optcall(TEST, OPT) \
49 : do { \
50 : if (TEST) { \
51 : if ((msg = OPT(cntxt, mb, stk, pci)) != MAL_SUCCEED) \
52 : goto bailout; \
53 : actions += *(int*)getVarValue(mb, getArg(pci, pci->argc - 1)); \
54 : delArgument(pci, pci->argc - 1); /* keep number of argc low, so 'pci' is not reallocated */ \
55 : } \
56 : } while (0)
57 :
58 : str
59 66223 : OPTminimalfastImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
60 : InstrPtr pci)
61 : {
62 66223 : str msg = MAL_SUCCEED;
63 66223 : int generator = 0, multiplex = 0, actions = 0;
64 :
65 : /* perform a single scan through the plan to determine which optimizer steps to skip */
66 1417104 : for (int i = 0; i < mb->stop; i++) {
67 1350881 : InstrPtr q = getInstrPtr(mb, i);
68 1350881 : if (getModuleId(q) == generatorRef)
69 0 : generator = 1;
70 1350881 : if (getFunctionId(q) == multiplexRef)
71 0 : multiplex = 1;
72 : }
73 :
74 66223 : optcall(true, OPTinlineImplementation);
75 66554 : optcall(true, OPTremapImplementation);
76 67215 : optcall(true, OPTemptybindImplementation);
77 67169 : optcall(true, OPTdeadcodeImplementation);
78 67121 : optcall(true, OPTforImplementation);
79 67293 : optcall(true, OPTdictImplementation);
80 67185 : optcall(multiplex, OPTmultiplexImplementation);
81 67156 : optcall(generator, OPTgeneratorImplementation);
82 67201 : optcall(profilerStatus, OPTprofilerImplementation);
83 67208 : optcall(profilerStatus, OPTcandidatesImplementation);
84 67208 : optcall(true, OPTgarbageCollectorImplementation);
85 :
86 : /* Defense line against incorrect plans handled by optimizer steps */
87 : /* keep actions taken as a fake argument */
88 66938 : bailout:
89 66938 : (void) pushInt(mb, pci, actions);
90 67163 : return msg;
91 : }
92 :
93 : str
94 31918 : OPTdefaultfastImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
95 : InstrPtr pci)
96 : {
97 31918 : str msg = MAL_SUCCEED;
98 31918 : int generator = 0, multiplex = 0, actions = 0;
99 :
100 : /* perform a single scan through the plan to determine which optimizer steps to skip */
101 1002684 : for (int i = 0; i < mb->stop; i++) {
102 970766 : InstrPtr q = getInstrPtr(mb, i);
103 970766 : if (getModuleId(q) == generatorRef)
104 0 : generator = 1;
105 970766 : if (getFunctionId(q) == multiplexRef)
106 0 : multiplex = 1;
107 : }
108 :
109 31918 : optcall(true, OPTinlineImplementation);
110 31926 : optcall(true, OPTremapImplementation);
111 31983 : optcall(true, OPTcostModelImplementation);
112 31985 : optcall(true, OPTcoercionImplementation);
113 31992 : optcall(true, OPTaliasesImplementation);
114 31983 : optcall(true, OPTevaluateImplementation);
115 31977 : optcall(true, OPTemptybindImplementation);
116 31978 : optcall(true, OPTdeadcodeImplementation);
117 31990 : optcall(true, OPTpushselectImplementation);
118 31984 : optcall(true, OPTaliasesImplementation);
119 31989 : optcall(true, OPTforImplementation);
120 31993 : optcall(true, OPTdictImplementation);
121 31981 : optcall(true, OPTmitosisImplementation);
122 31982 : optcall(true, OPTmergetableImplementation);
123 31991 : optcall(true, OPTaliasesImplementation);
124 31992 : optcall(true, OPTconstantsImplementation);
125 31986 : optcall(true, OPTcommonTermsImplementation);
126 31993 : optcall(true, OPTprojectionpathImplementation);
127 31980 : optcall(true, OPTdeadcodeImplementation);
128 31990 : optcall(true, OPTreorderImplementation);
129 31990 : optcall(true, OPTmatpackImplementation);
130 31998 : optcall(true, OPTdataflowImplementation);
131 31955 : optcall(true, OPTquerylogImplementation);
132 31992 : optcall(multiplex, OPTmultiplexImplementation);
133 31973 : optcall(generator, OPTgeneratorImplementation);
134 31967 : optcall(profilerStatus, OPTprofilerImplementation);
135 31970 : optcall(profilerStatus, OPTcandidatesImplementation);
136 31970 : optcall(true, OPTdeadcodeImplementation);
137 31991 : optcall(true, OPTpostfixImplementation);
138 31983 : optcall(true, OPTgarbageCollectorImplementation);
139 :
140 : /* Defense line against incorrect plans handled by optimizer steps */
141 : /* keep actions taken as a fake argument */
142 31972 : bailout:
143 31972 : (void) pushInt(mb, pci, actions);
144 31960 : return msg;
145 : }
|