diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index 1d03b7dd136e516fcca787246c6de913e7c411fe..170ef176cdcffbff48011c68a12dd9dca5fdcb83 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -1608,7 +1608,6 @@ slot_getallattrs(TupleTableSlot *slot) /* Quick out if we have 'em all already */ if (slot->tts_nvalid == tdesc_natts) return; - /* * otherwise we had better have a physical tuple (tts_nvalid should equal * natts in all virtual-tuple cases) diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index c594d3084e9d2eb1906e6a2fd38cb94f3a044385..e404d9f3db1dbcdcc506dda84744e3aeab372f1c 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2974,13 +2974,21 @@ ExecRunCompiledExpr(ExprState *state, ExprContext *econtext, bool *isNull) { CompiledExprState *cstate = state->evalfunc_private; ExprStateEvalFunc func; - + instr_time start, it, end; CheckExprStillValid(state, econtext); + INSTR_TIME_SET_CURRENT(start); + llvm_enter_fatal_on_oom(); func = (ExprStateEvalFunc) llvm_get_function(cstate->context, cstate->funcname); llvm_leave_fatal_on_oom(); + + INSTR_TIME_SET_CURRENT(end); + INSTR_TIME_ACCUM_DIFF(it, end, start); + + printf("compiled: %f\n", INSTR_TIME_GET_DOUBLE(it)); + Assert(func); /* remove indirection via this function for future calls */ diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp index d80b4b84c1d630b23a5643b6f5d8fdc9716b0ece..966a31f983ae916aae0824ff8378d360b96ac3ca 100644 --- a/src/backend/jit/llvm/llvmjit_inline.cpp +++ b/src/backend/jit/llvm/llvmjit_inline.cpp @@ -107,7 +107,7 @@ typedef llvm::StringMap<llvm::StringSet<> > ImportMapTy; const float inline_cost_decay_factor = 0.5; -const int inline_initial_cost = 0; +int inline_initial_cost = 0; /* * These are managed statics so LLVM knows to deallocate them during an @@ -376,6 +376,10 @@ Datum (*llvm_prepare_lambda_tablefunc(LLVMJitContext *context, } +void set_initial_cost(int cost) +{ + inline_initial_cost = cost; +} /* * JIT-compiles a simple lambda expression. diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index c8d95800f2cf09eae0dc15863c78a3279b84e0d7..5eb3ec3e205758a875244cb586b6500eb08c4d51 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -120,8 +120,6 @@ parse_analyze(RawStmt *parseTree, const char *sourceText, free_parsestate(pstate); - printf("Parsing done.\n"); - return query; } diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 4d9186abdbb99792af26af9c97a2b8241cea9ab0..1f7ba7393c0bebe805962acefeb47e6a50c55750 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -185,8 +185,6 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, char aggkind = 0; ParseCallbackState pcbstate; - printf("Parsing func\n"); - /* * If there's an aggregate filter, transform it using transformWhereClause */ diff --git a/src/ext/kmeans_ext.c b/src/ext/kmeans_ext.c index 49177d4dd97b4a5feed0b9d6a8e67a8e00705d99..e29ed4daf5451cec8676659cbbe76b21e4749334 100644 --- a/src/ext/kmeans_ext.c +++ b/src/ext/kmeans_ext.c @@ -101,7 +101,8 @@ void *kmeans_worker(void *arg) for(cluster = args->clusterStates; cluster < args->clusterStates + args->clusterCount; cluster++) { - args->lambdaArgs[0] = args->clusters + c * args->clusterDesc->natts; + args->lambdaArgs[0] = args->clusters + c * args->clusterDesc->natts; + /*float8 dist = DatumGetFloat8(castNode(ExprState, args->distFunc->exprstate)->evalfunc_simple(args->lambdaArgs));*/ //float8 dist = pow(node->x - cluster->x, 2) + pow(node->y - cluster->y, 2); diff --git a/src/ext/lambda_ext.c b/src/ext/lambda_ext.c index 3253b13ac1718ab1b1d68ef759bb0ef3b83fa879..3efe56c38d8f9281962c087ec625714a37f2ebf8 100644 --- a/src/ext/lambda_ext.c +++ b/src/ext/lambda_ext.c @@ -41,7 +41,7 @@ extern TupleDesc label_record_type(List *args) PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1_RECTYPE(label, label_record_type); PG_FUNCTION_INFO_V1_RECTYPE(label_fast, label_record_type); - +PG_FUNCTION_INFO_V1(set_inlining_cost); Datum label_internal(PG_FUNCTION_ARGS) @@ -102,10 +102,12 @@ label_internal(PG_FUNCTION_ARGS) for (slot = ExecProcNode(planState); !TupIsNull(slot); slot = ExecProcNode(planState)) { + bool isnull; Datum *val_ptr = oldVal; bool *null_ptr = oldIsNull; + HeapTuple t; HeapTupleHeader hdr; if (slot->tts_mintuple) @@ -114,12 +116,12 @@ label_internal(PG_FUNCTION_ARGS) heap_deform_tuple(slot->tts_tuple, inDesc, val_ptr, null_ptr); } else - { + { slot_getallattrs(slot); - + t = heap_form_tuple(inDesc, slot->tts_values, slot->tts_isnull); val_ptr = slot->tts_values; null_ptr = slot->tts_isnull; - hdr = slot->tts_tuple->t_data; + hdr = t->t_data; } PG_LAMBDA_SETARG(lambda, 0, HeapTupleHeaderGetDatum(hdr)); @@ -296,9 +298,21 @@ label(PG_FUNCTION_ARGS) llvm_leave_tmp_context(rsinfo->econtext->ecxt_estate); + if (fcinfo->nargs == 3) + { + int threshold = PG_GETARG_INT32(2); + } + return label_internal(fcinfo); } +Datum +set_inlining_cost(PG_FUNCTION_ARGS) +{ + set_initial_cost(PG_GETARG_INT32(0)); + return (Datum) 0; +} + Datum label_fast(PG_FUNCTION_ARGS) diff --git a/src/ext/pagerank_ext.c b/src/ext/pagerank_ext.c index 08b112002355e7d2f9dc4c5e6248d388009c5456..11a2bf2fa8a23f7f39ba98515c115cd4b03ca620 100644 --- a/src/ext/pagerank_ext.c +++ b/src/ext/pagerank_ext.c @@ -135,6 +135,7 @@ pagerank_internal(PG_FUNCTION_ARGS, int nthreads) int64 *csrOffsets; struct PageRankHash* hashLookup; struct PageRankNode* it; + bool byVal; int dataCursor = 0, csrCursor = 0; bool replIsNull[2]; Datum replVal[2]; @@ -166,12 +167,12 @@ pagerank_internal(PG_FUNCTION_ARGS, int nthreads) (errcode(ERRCODE_INTERNAL_ERROR), errmsg("src and dst lambda return types must be the same"))); } - else if (lambdaSrc->rettypmod != -1 || lambdaDst->rettypmod != -1) + /*else if (lambdaSrc->rettypmod != -1 || lambdaDst->rettypmod != -1) { ereport(ERROR, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Only base types can be used as keys."))); - } + }*/ oldcontext = MemoryContextSwitchTo(per_query_ctx); TupleTableSlot *slot = MakeTupleTableSlot(NULL); @@ -188,7 +189,10 @@ pagerank_internal(PG_FUNCTION_ARGS, int nthreads) TupleDescInitEntry(outDesc, 2, "pagerank", FLOAT8OID, -1, 0); + byVal = get_typbyval(lambdaSrc->rettype); ctl.keysize = get_typlen(lambdaSrc->rettype); + + printf("Typlen: %i\n", lambdaSrc->rettypmod); ctl.entrysize = sizeof(struct PageRankHash); mapping = hash_create("pagerank_mapping", @@ -212,7 +216,7 @@ pagerank_internal(PG_FUNCTION_ARGS, int nthreads) struct PageRankHash hash; hash.origKey = srcId; - hashLookup = (struct PageRankHash *) hash_search(mapping, &srcId, HASH_ENTER, &found); + hashLookup = (struct PageRankHash *) hash_search(mapping, byVal ? &srcId : srcId, HASH_ENTER, &found); if (!found) { @@ -230,7 +234,7 @@ pagerank_internal(PG_FUNCTION_ARGS, int nthreads) (edges + x)->src = hashLookup->node->aliasKey; hash.origKey = dstId; - hashLookup = (struct PageRankHash *) hash_search(mapping, &dstId, HASH_ENTER, &found); + hashLookup = (struct PageRankHash *) hash_search(mapping, byVal ? &dstId : dstId, HASH_ENTER, &found); if (!found) { diff --git a/src/include/jit/llvmjit.h b/src/include/jit/llvmjit.h index 4881ddf60eee39169957940561d7ae592ecb8a76..96bba812b6d1d4d2cb83ffe8a139fb6d5550468c 100644 --- a/src/include/jit/llvmjit.h +++ b/src/include/jit/llvmjit.h @@ -137,9 +137,9 @@ extern LLVMValueRef llvm_function_reference(LLVMJitContext *context, LLVMModuleRef mod, FunctionCallInfo fcinfo); extern Datum (*llvm_prepare_lambda_tablefunc(LLVMJitContext *context, char* bcModule,char* funcName, int numLambdas))(PG_FUNCTION_ARGS); - extern Datum (*llvm_prepare_simple_expression(ExprState *state))(Datum **); extern void llvm_inline(LLVMModuleRef mod); +extern void set_initial_cost(int cost); /* ****************************************************************************