freenode/#clasp - IRC Chatlog
Search
20:40:59
karlosz
wouild i have to resort to adding new instruction types on the MIR level to take advantage of specializing?
20:43:38
karlosz
as in system provided functions don't need to go through fdefinition and computed funcall
20:44:15
karlosz
ie. clisp compiles (lambda (x) (funcall (fdefinition '1+) x)) the same as cleavir compiles (llambda (x) (1+ x)) right now
20:44:44
karlosz
whereas (lambda (x) (1+ x)) in clisp compiles to a shorter instruction sequence since 1+ is in a specialized 'funtab'
20:50:18
karlosz
does clasp just lookup C++ functions in a table to determine whether to produce the C++ all ast node?
20:52:15
Bike
Like, the function-info for 1+ or whatever has an AST, and that AST is the foreign call thing.
20:54:31
Bike
So I guess you'd write a definition like (declaim (inline 1+)) (defun 1+ (n) (system-call 177 n))
20:56:22
karlosz
clisp already has a function that queries whether a function is 'system'. so i could just ask the function and convert the appropriate ast node during cst to ast conversion, right?
20:57:54
karlosz
i.e. convert function calls differently to ast depending on whether they are system or not during cst->ast
21:02:11
Bike
if you want it to generate typeq you'll need to provide a definition for typep that uses typeq.
21:04:03
Bike
so the ast doesn't have a function call, just the eq ast, which is converted into the eq instruction.
23:21:50
Kevslinger
Google cloud now has a machine you can rent out with 160 virtual CPUs and 3.75 TB of RAM.
0:30:33
karlosz
still not quite sure what i should be subclassing. in function-info, if i make an instance of global-function-info with :inline set, should i return an subclass of fdefinition-ast, maybe system-fdefinition?
0:32:29
karlosz
well, i don't want to start redefining things like eq and 1+ and declaring them inline in order to get specialized system call HIR nodes
0:33:01
Bike
you don't have to redefine them, just have function-info return an fdefinition-ast without actually redefining the class
0:35:37
karlosz
then how are system functions distinguished from normal functions? or are you saying that theres no need to distinguish them at the AST level?
0:37:12
Bike
what i'm saying is for 1+, you return a function-ast with a body consisting of your custom syscall-ast or whatever you want to call it
1:47:04
karlosz
i was able to make the ast by faking up another function and replacing its node with the node i want, but when i graph it it seems like its not inlining properly
2:01:28
karlosz
well cst-to-ast didn't complain when i didn't have a method on cleavir-env:declarations
2:03:31
karlosz
and generate-ast is also complaining about a method for cleavir-ast:chilren not being defined on my new node
2:26:07
karlosz
when i compile to stack machine bytes i just treat assignment instructions as alising stack locations
2:27:04
Bike
setq also turns into an assignment instruction, so you probably have to actually do something at runtime
2:29:13
Bike
in this case, the ast inlining generates assignments to match the parsing of the lambda list of the function being inlined.
2:29:46
Bike
i've spent a fair bit of time trying to figure out a way to generate less, but i haven't come up with much.
2:31:56
karlosz
yeah, but even when there was no inling, just things like using a lexical location to a function would have to go through an assign instruction
2:59:35
Bike
karlosz: it generates more assignments and temporaries than it needs to, for sure. it's because of how ast-to-hir works. i couldn't think of a way to write it that avoided that while being understandable.
3:03:05
karlosz
i think it wouldn't be so bad doing it in a separate coalescing pass if you have an interference graph
3:12:59
karlosz
hm, it seems like this inlining approach can't work for functions with rest arguments
3:13:43
karlosz
the number of arguments the node is going to take is already precomputed ahead of time
3:19:31
karlosz
you just need to push the correct number of arguments on the stack and call the appropriate bytecode
3:23:01
karlosz
although i guess even if you redefined the function and put inline on it it would still be tricky
3:24:10
karlosz
well if you have a function like + in the flowgraph, it has an arbitrary number of inputs
3:24:59
karlosz
but if you tried to put the ast of (lambda (x y) (system-call 100 x y)) or whatever and inline that
3:25:40
karlosz
but for a function with &rest you can'tcompute that up front in the ast you're returning from fun-info
3:35:04
karlosz
so even though the number of arguments is known at inlining time, its not possible to just make a HIR node with the right number of inputs?
3:35:35
karlosz
that would fit clisp's calling convention better than explicitly making a list in the hir graph
3:36:55
Bike
yes but i don't understand what you want this node to be, or do, or where it would be inserted for inlining, or anything.
3:38:12
karlosz
well when i translate the node to bytecode, it just makes bytecode to push each of the inputs on the stack
3:39:44
karlosz
i don't understand. the funcall instruction can take any number of inputs, without creating a list. ie (+ 1 2 3) creates a hir node with 3 inputs
3:43:14
Bike
if you have a lambda list (x &rest y) the ENTER-INSTRUCTION has three outputs - the closure, X, and Y, right?
3:44:01
Bike
But, since we're inlining, the enter-instruction goes away, and we have to replace it with something.
3:46:59
karlosz
i'd like to have the 4 inputs (or however many is determined at inline time) wired directly to the node
3:55:45
Bike
oh, if you mean you have something with a &rest you want to "inline", you can just use a compiler macro instead
3:56:01
Bike
e.g. have (funcall x ...) expand to (cleavir-primop:funcall (coerce-to-function x) ...)
4:02:03
Bike
if you don't want to define an clisp-normal compiler macro function, you can have function-info just make one up like you're already doing with ASTs