From 14a226107f845454676a2e14ae0fb843a5b4f668 Mon Sep 17 00:00:00 2001 From: Pierre Ducroquet Date: Wed, 11 Jul 2018 23:41:59 +0200 Subject: [PATCH 1/2] Check for the hasnulls attribute before checking individual fields --- src/backend/jit/llvm/llvmjit_deform.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c index 795f67114e..c53855eb63 100644 --- a/src/backend/jit/llvm/llvmjit_deform.c +++ b/src/backend/jit/llvm/llvmjit_deform.c @@ -48,6 +48,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) LLVMBasicBlockRef b_out; LLVMBasicBlockRef b_dead; LLVMBasicBlockRef *attcheckattnoblocks; + LLVMBasicBlockRef *attfaststartblocks; LLVMBasicBlockRef *attstartblocks; LLVMBasicBlockRef *attisnullblocks; LLVMBasicBlockRef *attcheckalignblocks; @@ -145,6 +146,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) b = LLVMCreateBuilder(); attcheckattnoblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); + attfaststartblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); attstartblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); attisnullblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); attcheckalignblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); @@ -239,6 +241,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) { attcheckattnoblocks[attnum] = l_bb_append_v(v_deform_fn, "block.attr.%d.attcheckattno", attnum); + attfaststartblocks[attnum] = + l_bb_append_v(v_deform_fn, "block.attr.%d.faststart", attnum); attstartblocks[attnum] = l_bb_append_v(v_deform_fn, "block.attr.%d.start", attnum); attisnullblocks[attnum] = @@ -337,7 +341,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) /* * If this is the first attribute, slot->tts_nvalid was 0. Therefore - * reset offset to 0 to, it be from a previous execution. + * reset offset to 0 too, it could be from a previous execution. */ if (attnum == 0) { @@ -351,7 +355,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) */ if (attnum <= guaranteed_column_number) { - LLVMBuildBr(b, attstartblocks[attnum]); + LLVMBuildBr(b, attfaststartblocks[attnum]); } else { @@ -361,8 +365,19 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) l_attno, v_maxatt, "heap_natts"); - LLVMBuildCondBr(b, v_islast, b_out, attstartblocks[attnum]); + LLVMBuildCondBr(b, v_islast, b_out, attfaststartblocks[attnum]); } + + LLVMPositionBuilderAtEnd(b, attfaststartblocks[attnum]); + + /* + * Fast-start block : check if there can be nulls on tuple. + * If not, jump straight to align checks. + */ + { + LLVMBuildCondBr(b, v_hasnulls, attstartblocks[attnum], attcheckalignblocks[attnum]); + } + LLVMPositionBuilderAtEnd(b, attstartblocks[attnum]); /* @@ -375,7 +390,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) LLVMBasicBlockRef b_ifnotnull; LLVMBasicBlockRef b_ifnull; LLVMBasicBlockRef b_next; - LLVMValueRef v_attisnull; LLVMValueRef v_nullbyteno; LLVMValueRef v_nullbytemask; LLVMValueRef v_nullbyte; @@ -399,9 +413,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts) l_int8_const(0), "attisnull"); - v_attisnull = LLVMBuildAnd(b, v_hasnulls, v_nullbit, ""); - - LLVMBuildCondBr(b, v_attisnull, b_ifnull, b_ifnotnull); + LLVMBuildCondBr(b, v_nullbit, b_ifnull, b_ifnotnull); LLVMPositionBuilderAtEnd(b, b_ifnull); -- 2.18.0