Alexey Milovidov
65a08210ac
Merge branch 'llvm-jit' of https://github.com/pyos/ClickHouse into pyos-llvm-jit
2018-05-10 22:09:47 +03:00
pyos
e5ebc24657
Revert the part of bd332b that moved a read after std::move.
2018-05-10 21:19:41 +03:00
pyos
1718e575a7
Bridge between incompatible LLVM APIs
2018-05-10 20:31:24 +03:00
Alexey Milovidov
4d9088d3d4
Merge branch 'llvm-jit' of https://github.com/pyos/ClickHouse into pyos-llvm-jit
2018-05-10 18:23:53 +03:00
Alexey Milovidov
d3b7bafedf
Miscellaneous #2277
2018-05-10 18:22:54 +03:00
pyos
bd332b9171
Allow calling into libc from jitted code.
...
Mostly for intrinsics like memcpy/memset/memmove, which are inserted
during optimization by LLVM itself. (With a null resolver, a compiled
version of something like `Uint64 < 0` would segfault.)
2018-05-10 17:00:32 +03:00
Alexey Milovidov
72ab282bca
Removed hack #2277
2018-05-10 00:03:03 +03:00
pyos
32fd123010
Select an *exact* target machine, not an approximation.
...
Required for enabling advanced features such as AVX and AVX2.
Code mostly copied from LLVM's tools/opt/opt.cpp.
2018-05-07 19:06:13 +03:00
pyos
d4b5c01a1e
Fix addModule check for LLVM < 7
...
It returns `Expected`, so false-y is a failure. (In >= 7 it returns
an `Error`, so truth-y is a failure. Wow, that's confusing.)
2018-05-07 16:04:07 +03:00
pyos
0e09138405
Assume output and one input of LLVMFunction is non-const
2018-05-07 16:03:26 +03:00
Alexey Milovidov
01bbf650f8
Build fixes #2277
2018-05-07 11:59:24 +03:00
Alexey Milovidov
147919928d
Better error checks #2277
2018-05-07 09:49:56 +03:00
Alexey Milovidov
d1b4b5c836
Fixed error; added ProfileEvent #2277
2018-05-07 09:23:18 +03:00
Alexey Milovidov
a687c90100
Allow to link with LLVM if it was compiled without RTTI #2277
2018-05-07 03:00:12 +03:00
Alexey Milovidov
b580d1c487
Allow to build with clang 7
2018-05-06 14:16:38 +03:00
Alexey Milovidov
6c7f896f9f
Miscellaneous #2277
2018-05-06 13:42:35 +03:00
Alexey Milovidov
69c67b4cd4
Addition to prev. revision #2277
2018-05-06 12:37:16 +03:00
Alexey Milovidov
b1b95454cc
Make warning suppressions more local #2277
2018-05-06 12:29:57 +03:00
pyos
88bb2f7c25
Resolve symbols right after compiling.
...
llvm::orc::RTDyldObjectLinkingLayer::findSymbol appears to be non-threadsafe.
2018-05-05 00:38:17 +03:00
pyos
a286dea2e1
Don't waste time jit-compiling isolated functions.
...
This is already done ahead of time when building the executable.
2018-05-03 16:34:42 +03:00
pyos
23bbf632e5
If all inputs to a jitted function are constant, return a constant
2018-05-03 16:33:40 +03:00
pyos
900b92f744
Merge API changes from upstream
2018-05-01 22:52:33 +03:00
pyos
7529aa55a4
Fix a bug that limited inlining depth at 2
2018-04-30 01:23:27 +03:00
pyos
72f2fea837
Extract the code that compiles a single IFunctionBase from LLVMFunction
2018-04-29 21:03:58 +03:00
pyos
1be009d485
Remove getDefaultNativeValue in favor of llvm::Constant::getNullValue
2018-04-29 20:32:30 +03:00
pyos
4641e2960f
Move ExpressionActions::compileFunctions to ExpressionJIT.cpp.
...
This means ExpressionJIT.h only has to expose one function.
2018-04-29 13:39:01 +03:00
pyos
6e05c5ace4
compilePrologue() isn't particularly useful after all.
...
Basically the only thing it can do that compile() can't is create 'alloca'
instructions, which are only needed to get pointers to stack variables.
Given that dynamically-sized allocations aren't possible with this API,
such pointers are probably completely pointless (heh).
2018-04-28 18:11:23 +03:00
pyos
1ffc2a0775
Make LLVMFunction monotonicity computation shorter (and fix a typo-bug)
2018-04-28 17:41:24 +03:00
pyos
a1eb938ed2
Inline nullable number constants into compiled code.
...
Also, protect against some segfaults during compilation by checking
correctness of the type returned by compile().
2018-04-28 17:12:00 +03:00
pyos
ccc895d162
Represent nullable types as pairs instead of pointers.
...
Turns out LLVM has insertvalue & extractvalue for struct in registers. This is
faster than pointers because null checks are now subject to more optimizations.
2018-04-28 14:12:23 +03:00
pyos
5c75342d54
Check nativity of all types *before* calling isCompilable
2018-04-28 01:03:52 +03:00
pyos
979c4d959f
Let jit-compilable functions deal with NULLs themselves.
...
And provide a default implementation of compile() for nullable columns
that actually works and is consistent with execute().
2018-04-28 00:34:27 +03:00
pyos
49b61cd27d
Refactor LLVMFunction to make extending to DataTypeNullable easier
2018-04-27 18:44:38 +03:00
pyos
b4d527ee85
Inline compile-time constants into jitted functions.
2018-04-26 14:30:16 +03:00
pyos
9ae5fe1b6d
Minor style fixes
2018-04-25 18:33:58 +03:00
pyos
854f85dd9b
Put #if USE_EMBEDDED_COMPILER in ExpressionJIT.{cpp,h}
2018-04-25 18:19:22 +03:00
pyos
d59b0d7ec0
Add IColumn::getRawData to fixed-contiguous columns
2018-04-25 18:16:48 +03:00
pyos
6c275c27d0
Remove an unnoticed debug return
2018-04-25 16:44:24 +03:00
pyos
5482282943
Implement informational methods for LLVMFunction
2018-04-25 16:01:06 +03:00
pyos
162a0c8b33
Fix some comments' style
2018-04-25 16:01:06 +03:00
pyos
1bece1de46
Support nullable columns (with default behavior) in jitted functions
2018-04-25 13:37:26 +03:00
pyos
df2d2e0b25
Tweak the jit compilation API to be more amenable to lazy computation
2018-04-25 13:37:26 +03:00
pyos
3810173103
Remove IFunction::createResultColumn.
...
Given that the list of supported types is hardcoded in
LLVMContext::Data::toNativeType, this method is redundant because
LLVMPreparedFunction can create a ColumnVector itself.
2018-04-25 13:37:26 +03:00
pyos
6b526f784c
Enable the default set of LLVM optimization passes
...
I honestly can't tell if they work. LLVM has surprisingly bad API documentation.
2018-04-25 13:37:26 +03:00
pyos
5f1bf11ede
Implement a loop over the columns in jit-compiled code
2018-04-25 13:37:25 +03:00
pyos
407008a4d9
Separate jit-compilability checks from actual compilation
2018-04-25 13:37:25 +03:00
pyos
e96a5e8344
Implement JIT compilation, without a loop for now.
...
It actually seems to work, so long as you only have one row that is. E.g.
> select something(cast(number + 6 as Float64), cast(number + 2 as Float64)) from system.numbers limit 1';
8
with this IR:
define void @"something(CAST(plus(number, 6), 'Float64'), CAST(plus(number, 2), 'Float64'))"(void**, i8*, double*) {
entry:
%3 = load void*, void** %0
%4 = bitcast void* %3 to double*
%5 = load double, double* %4
%6 = getelementptr void*, void** %0, i32 1
%7 = load void*, void** %6
%8 = bitcast void* %7 to double*
%9 = load double, double* %8
%10 = fadd double %5, %9
store double %10, double* %2
ret void
}
2018-04-25 13:37:25 +03:00
pyos
b398ffbaba
Map all number types to LLVM types.
...
The example from the previous commit doesn't need a cast to Float64 anymore.
2018-04-25 13:37:25 +03:00
pyos
851684de51
Add a JIT interface for row-wise default-nullable functions.
...
Not actually implemented, though. It does print out some jit-compiled stuff,
but that's about it. For example, this query:
select number from system.numbers where something(cast(number as Float64)) == 4
results in this on server's stderr:
define double @"something(CAST(number, 'Float64'))"(void**, i8*, void*) {
"something(CAST(number, 'Float64'))":
ret double 1.234500e+04
}
(and an exception, because that's what the non-jitted method does.)
As one may notice, this function neither reads the input (first argument;
tuple of arrays) nor writes the output (third argument; array), instead
returning some general nonsense.
In addition, `#if USE_EMBEDDED_COMPILER` doesn't work for some reason,
including LLVM headers requires -Wno-unused-parameter, this probably only
works on LLVM 5.0 due to rampant API instability, and I'm definitely
no expert on CMake. In short, there's still a long way to go.
2018-04-25 13:37:25 +03:00