freenode/#clasp - IRC Chatlog
Search
4:04:19
drmeister
I'll have to leave this new problem with code generation until next week - I have to focus on yet another grant proposal.
4:08:28
drmeister
You say when they begin and end their lifetime. It should be easy to generate that information.
4:09:49
Bike
yeah. but after segregate lexicals. because what "lifetime" means when a variable is in multiple functions isn't as obvious.
4:10:27
drmeister
So you have lifetime for variables that are in one function. There is no concept of variables in multiple functions in llvm.
4:12:58
drmeister
Could it be preserved to code generation? Say in a way that we know for a particular instruction that a variable has just come alive and the instruction after which it is no longer alive?
4:13:33
Bike
clasp computes it here https://github.com/drmeister/clasp/blob/dev/src/lisp/kernel/cleavir/translate.lisp#L957 but it can be done any time after process-captured-variables.
4:15:17
Bike
it could be recomputed, yeah. i don't know what you want to use it for so i don't know what the consequences would be.
4:15:36
Bike
i've been thinking a bit about how to do hir transformations while preserving information like that more scrupulously, but i haven't done any work.
4:16:32
Bike
the liveness object is just a hash table (actually two) from instructions to lists of lexical locations live there, i don't know if that's convenient.
4:16:35
drmeister
Interesting: https://www.phoronix.com/scan.php?page=news_item&px=LLVM-EfficiencySanitizer
4:21:21
drmeister
I can't find it right now - but there is a web page that suggests basic things that compiler writers should incorporate when using llvm. Specifying liveness of lexical variables was one of them
4:30:48
drmeister
??? is a JITted Cleavir function calling a generic function Instance::entry_point with a C-calling convention call.
4:31:32
drmeister
standard_dispatch looks up the effective method and invokes apply_method, passing arguments in a VaList_S* tagged pointer (no arguments copied)
4:32:07
drmeister
apply_method invokes funcall_consume_valist_ which calls funcall_va_list_8 (arguments are copied)
4:33:02
drmeister
That involves invoking apply_method /funcall_consume_valist_, funcall_va_list_8 (arguments are copied)
4:34:13
drmeister
They need to be copied once because the arguments list and list of next methods get prepended to the arguments.
4:36:23
drmeister
In the common case where there is a single method one of those argument copies could be eliminated and COMBINE-METHOD-FUNCTIONS3.LAMBDA could be skipped.
13:39:38
beach
Strange question. You would pass them the same way you pass arguments to an ordinary function, no?
13:41:40
drmeister
Yes, but a call to a generic function leads to a call to an effective method where two arguments are inserted in front of the others - that leads to arguments being copied. This is the general case. There are 4 arguments passed in registers maybe I should focus more on that.
13:49:50
beach
Let me make sure. I'll first check what SBCL does and then check the Common Lisp HyperSpec.
13:51:29
drmeister
If it's (m n o) then I could put them in a list (va_list) M and the call becomes (next-method M (cdr B))
13:54:17
beach
"When call-next-method is called with no arguments, it passes the current method's original arguments to the next method."
13:55:32
drmeister
Why say "current method's original arguments". "original" sounds like something other than the "current methods arguments"
13:57:31
beach
Next, with instances of standard-generic-function, I think you can do as you please as we have discussed in the past. For example, if the generic function takes only required parameters (say x y z), you can pass x y z B to the methods, rather than (x y z) B. That way you don't have to cons up a list.
14:00:28
beach
... and you also don't have to shuffle the arguments from the discriminating function to the methods.
14:01:20
drmeister
There is no consing of lists anymore for these arguments - I use the C va_list - at worst it's copying 4 integers on the stack.
14:10:33
Shinmera
drmeister: It says "original" because you might modify the contents of your arguments variable bindings.
14:15:26
beach
If you have keyword parameters, your execution time is going to be dominated by parsing the keyword arguments anyway.
14:36:45
drmeister
beach: Thank you for pointing out that I don't need to pass both sets of arguments - that simplifies things.
14:37:44
drmeister
I know more about modifying the CLOS code to change the calling convention. There are lots of changes scattered about that need to be made in a concerted manner.