freenode/#clasp - IRC Chatlog
Search
14:41:20
beach
I am asking, because I am attacking that stuff for the first time now, and it is very complicated.
14:41:45
beach
... which is why I decided I wanted to do it in HIR before the HIR gets further transformed and optimized.
14:52:42
drmeister
beach: We switch over entirely to cleavir - so the argument processing is done by cleavir.
14:53:37
beach
Somewhere there must be code to loop over all the arguments to find keywords, for instance.
14:57:55
drmeister
translate calls layout-procedure and layout-procedure calls the code that does argument processing.
14:59:44
Bike
there's also some weird issues with like, optional parameters, since the enter-instruction can essentially assign them to be undefined (if nothing was provided), and the body initializes it
15:02:06
drmeister
I see. We do some argument processing setup in layout-procedure and then actually generate code from the lambda list in translate-simple-instruction
15:02:07
drmeister
https://github.com/clasp-developers/clasp/blob/dev/src/lisp/kernel/cleavir/translate-instruction.lisp#L18
15:02:59
beach
If I could figure out a way to abstract the calls to ERROR, it could likely be done in a portable way.
15:03:53
drmeister
How would you deal with optimizations like lambda lists with only required/optional arguments that can use only registers vs more complex lambda lists?
15:05:52
beach
I abstracted everything, using two new instructions, COMPUTE-ARGUMENT-COUNT and ARGUMENT (access the i:th argument). The code would be further processed by HIR transformations. I don't generate keyword parsing unless the lambda list has keywords, of course.
15:08:07
drmeister
Does ARGUMENT take a lexical variable as input or constants? I'm figuring the answer is that it takes a lexical variable.
15:09:10
Bike
we have an important optimization in clasp in that we don't put all the arguments in a vector (so to speak) if there are few enough parameters and they're all required or optional.
15:10:22
beach
If there are no keyword arguments, or if the number of required+optional parameters is greater than the number of registers used, then the ARGUMENT instruction has a constant input, so it can be turned into a register access.
15:15:41
Bike
i wrote some c pseudocode for the optional and key parsing. there's also the split i mentioned - the code generator is just completely different if we skip the vector
15:15:52
beach
It is probably easier for me to explain what i did so far by showing you the HIR snippets that I will insert: chapter 25 of metamodular.com/SICL/sicl-specification.pdf
15:18:13
beach
My intention is to do it early in HIR so that the code will benefit from optimizations in HIR.
15:21:04
Bike
we call force-output in every cl:write. seems like that will destroy any pretense of buffering pretty quickly
15:26:59
drmeister
beach: Are you considering supporting something like clasp's &va-rest parameter? sbcl has something equivalent and I don't recall what it is called at the moment.
15:29:51
drmeister
Right - something like that - an &rest that doesn't cons a list on the heap. dynamic extent allocation might be worked out.
15:30:35
Bike
in clasp (and probably sbcl) we have three different cases - normal &rest, dx &rest, and &more/&va-rest which doesn't involve a list at all, it's a pretty raw vector.
15:32:03
Bike
drmeister: this is unrelated, but how would I test whether https://github.com/clasp-developers/clasp/issues/637 is fixed? I can load cl-unicode.
15:37:33
Bike
hm hm, some optimizations for princ-to-string and friends might be good. in clasp compilation we do a lot of (write-to-string (cleavir-ir:name datum) ...), and if i define a specific function for write-to-string to do when it gets a symbol, that just copies the symbol name, it's 25x faster than the with-output-to-string biznis
15:37:57
Bike
sbcl does it for integers, but the math is a little tricky and clasp isn't good at math anyway
15:41:38
Bike
drmeister: also, you added the write-to-string optimization where it reuses a stream back, right? because the output column thing was fixed? any reason we can't do that for princ-to-string and such?
15:43:11
beach
drmeister: I will be very careful with what I support, but I am willing to make it easy for implementations to do that kind of stuff, provided it is not to hard to do.
15:47:37
Bike
the underlying problem was an issue with read-line, which is why i was messing with it last week.
15:53:01
drmeister
I'm getting cando/slime crashing when I ,restart - that's new - is anyone else seeing that?
15:55:44
drmeister
../../src/main/main.cc:260 There was an unhandled std::exception in process [pid: 88961] e.what()=[std::exception] - do something about it.
16:16:34
Bike
this can probably still be faster if i make a C++ function to apply print-case to a string and return a new string of the same length. we already have that, except it writes to a stream, so shouldn't be anything bad
16:52:33
Bike
i redefined write-to-string to bind a bunch of special variables and then call a function "stringify", and now stringify is over twice as fast as write-to-string with no arguments
16:52:44
Bike
so at least in this instance, binding special variables actually does notably slow things down. that's interesting
16:53:53
Bike
anyway, imma put in a compiler macro so it only binds what it needs to, that ought to help
17:47:01
Bike
something i did resulted in big numbers printing apparently randomly during build. doesn't actually break anything. ooookay
18:01:17
jakewalsh
I'm here! Sorry for being a bit incommunicado - I've spent a lot of today reading membrane papers Yihui sent me
18:02:04
jakewalsh
I was able to build clasp on my own machine but haven't really started working with it
19:14:13
Bike
if i have a SimpleString_sp and i want to access it, do i really have to use cl__char and stuff? compiler says SimpleString_O doesn't provide operator[]
19:31:53
Bike
ok, turns out if i just write this in lisp it's still faster than doing write to string
20:16:11
jakewalsh
drmeister: how should I get started looking into the various llvm pass optimizations?
20:21:15
Bike
if you run `opt -O3 -print-after-all -o=thing-after-O3.ll thing.ll` it'll show you the effect of every single pass. might want to `2>wherever` to put it in a file. you can get an ll from lisp by compile-file-ing anything and running llvm-dis on the resulting bc file.
20:21:32
Bike
https://llvm.org/docs/Passes.html the list of passes is here, but obviously there's not a lot of description
20:21:48
Bike
i don't know if you're familiar with lisp at all, but i can show you that sort of stuff if you need it
20:23:46
jakewalsh
Bike: thanks! I've started reading/working through Practical Common Lisp but I'm definitely still a novice in the language
20:24:53
Bike
you have some experience programming, right? i don't suppose you've ever looked into the murky abyss of compiler internals before?
20:27:42
jakewalsh
yeah, I have some experience in python and C - I've taken a standard undergrad computer systems (the standard one everyone rips from CMU - caches, shells, malloc, x86 assembly, etc) but that's the extent of my lower-level knowledge
20:28:43
pfdietz
"Obscure, profound it was, and nebulous, So that by fixing on its depths my sight -- Nothing whatever I discerned therein." -- Dante on compiler internals
20:30:03
Bike
for now i guess you should learn lisp and llvm-ir. for the latter, what i'd say you should do is write some basic (like very small) C programs, and look at the llvm-ir for them, then crossref with https://llvm.org/docs/LangRef.html until it makes sense
20:31:16
Bike
if you have clang installed you can get llvm-ir by doing `clang file.c -S -emit-llvm -o wherever.ll`