jit: Correct parameter type for generated expression evaluation functions.
authorAndres Freund <[email protected]>
Tue, 8 Dec 2020 02:21:06 +0000 (18:21 -0800)
committerAndres Freund <[email protected]>
Tue, 8 Dec 2020 03:34:13 +0000 (19:34 -0800)
clang only uses the 'i1' type for scalar booleans, not for pointers to
booleans (as the pointer might be pointing into a larger memory
allocation). Therefore a pointer-to-bool needs to the "storage" boolean.

There's no known case of wrong code generation due to this, but it seems quite
possible that it could cause problems (see e.g. 72559438f92).

Author: Andres Freund
Discussion: https://postgr.es/m/20201207212142[email protected]
Backpatch: 11-, where jit support was added

src/backend/jit/llvm/llvmjit_expr.c

index f232397cabf86ce142b89dc5a634a6d9d879b4b7..da5e3a2c1d03c56c6894dbf77111e245bdf688fd 100644 (file)
@@ -155,7 +155,7 @@ llvm_compile_expr(ExprState *state)
 
        param_types[0] = l_ptr(StructExprState);    /* state */
        param_types[1] = l_ptr(StructExprContext);  /* econtext */
-       param_types[2] = l_ptr(TypeParamBool);  /* isnull */
+       param_types[2] = l_ptr(TypeStorageBool);    /* isnull */
 
        eval_sig = LLVMFunctionType(TypeSizeT,
                                    param_types, lengthof(param_types),
@@ -265,8 +265,6 @@ llvm_compile_expr(ExprState *state)
 
                    v_tmpvalue = LLVMBuildLoad(b, v_tmpvaluep, "");
                    v_tmpisnull = LLVMBuildLoad(b, v_tmpisnullp, "");
-                   v_tmpisnull =
-                       LLVMBuildTrunc(b, v_tmpisnull, TypeParamBool, "");
 
                    LLVMBuildStore(b, v_tmpisnull, v_isnullp);