libera/#clasp - IRC Chatlog
Search
2:49:54
drmeister
Since beginnings are important - can you change it to: (return-value (arguments...))
2:54:16
drmeister
Actually that compile error was on zeus and on there I'm running it under udb to try and get a backtrace.
3:08:49
Bike
like, ((:single-float :single-float) :single-float :single-float) means it takes two single floats as arguments, and then returns two single floats
3:27:09
Bike
you could have one that returns all three values from an ovec, but it probably wouldn't be too useful, at least at the moment
4:06:44
Bike
um, also it looks like you still have the rtype wrong, though that's not what's causing this
4:09:07
Bike
try wrapping the defvprimop-intrinsics in (eval-when (:compile-toplevel :load-toplevel :execute
4:11:49
drmeister
This is unrelated (probably) and downstream but it happened again - now on my mac...
4:12:37
Bike
i was thinking maybe we should check argument types in irc-intrinsic so we get a normal error instead of llvm killing everythign
4:12:49
drmeister
I don't think so - it first surfaced on zeus and I haven't put these primops on there.
4:15:30
Bike
i could throw that into the macro i guess, but then it would need to know whether it unwinds as well
4:22:21
Bike
if that's coming from the primop type resolution thing maybe it should signal an error instead of returning nil
4:27:51
drmeister
Something about registering object files and the GDB jit interface slows udb way, way down.
4:31:03
Bike
for reference, if i'm understanding the eval-when solution correctly, the problem is that the inline ast is generated at compile time, before the vprimop is actually defined
4:40:21
drmeister
https://github.com/clasp-developers/clasp/blob/unboxed-floats/src/lisp/kernel/cmp/cmpir.lsp#L1390
4:54:55
karlosz
::notify Bike i don't know if meta-evaluate is the best place to analyze dx. the idea of meta-evaluate is that it partially evaluates a syntax tree, which inherently corresponds to a forward pass over a graph - use the data from a previous operation to optimize the next
4:57:49
karlosz
::notify Bike the only backwards thing it does is code flushing. i was thinking dx probably would go with constraint propagation, since that works backwards from assertions to uses. if i remember correctly i never ported the limited constraint pass from hir to bir. but i would say dx fits naturally into a constraint framework. sbcl does dx analysis totally wrong; DX wasn't part of the original design
4:59:22
karlosz
::notify Bike sbcl's support was cribbed partially from cmucl when it was added there in 2003; the dx funargs database hasn't even been ported over to sbcl yet
11:15:51
drmeister
::notify Bike I hit a problem when generating the inline wrapper function. See logs
12:01:09
drmeister
(defvprimop-intrinsic core::sf-sqrt ((:single-float) :single-float) "llvm.sqrt.f32")
12:24:38
Colleen
Bike: karlosz said 7 hours, 29 minutes ago: i don't know if meta-evaluate is the best place to analyze dx. the idea of meta-evaluate is that it partially evaluates a syntax tree, which inherently corresponds to a forward pass over a graph - use the data from a previous operation to optimize the next
12:24:38
Colleen
Bike: karlosz said 7 hours, 26 minutes ago: the only backwards thing it does is code flushing. i was thinking dx probably would go with constraint propagation, since that works backwards from assertions to uses. if i remember correctly i never ported the limited constraint pass from hir to bir. but i would say dx fits naturally into a constraint framework. sbcl does dx analysis totally wrong; DX wasn't part of the original design
12:24:38
Colleen
Bike: karlosz said 7 hours, 25 minutes ago: sbcl's support was cribbed partially from cmucl when it was added there in 2003; the dx funargs database hasn't even been ported over to sbcl yet
12:24:38
Colleen
Bike: drmeister said 1 hour, 8 minutes ago: I hit a problem when generating the inline wrapper function. See logs
12:26:03
Bike
https://github.com/clasp-developers/clasp/commit/634fd051a3e8ee103d55c1ed4e333353425cc4e6
12:28:57
Bike
::notify karlosz i've been thinking of it as a reverse of type inference in the sense that there can be both a simple data-dependent analysis like meta evaluate, and then a more involved control flow dependent analysis like constraint propagation
12:29:41
Bike
::notify and it seems to me that constraint prop might be overkill, since in the reverse case we only need it when there's more than one definition for a thing, which is rarer than having more than once use (which is why constraint prop for types is useful)
12:30:38
Colleen
and: Bike said 57 seconds ago: it seems to me that constraint prop might be overkill, since in the reverse case we only need it when there's more than one definition for a thing, which is rarer than having more than once use (which is why constraint prop for types is useful)
12:30:49
Bike
::notify karlosz and it seems to me that constraint prop might be overkill, since in the reverse case we only need it when there's more than one definition for a thing, which is rarer than having more than once use (which is why constraint prop for types is useful)
12:31:23
Bike
::notify karlosz it's true a reverse analysis could be a different thing from meta-evaluate, though. it's just dual or whatever, and simple enough that i thought interleaving them might make snese
13:39:35
drmeister
It would give us a performance boost and run on M1 chips and all other llvm targets.
13:41:03
drmeister
GlobalEntryPoint_O maintains a vector of entry points (currently 1) - I could add six more for six arities.
13:41:43
drmeister
It would be completely portable and take advantage of register arguments in a better way.
13:42:15
drmeister
Each function would have six entry points for zero to five arguments and one for six or more.
13:42:37
drmeister
Each call would choose the appropriate entry point based on the number of arguments for the call.
13:43:38
drmeister
Many entry points would point to an error function when the number of arguments don't match.
13:47:15
drmeister
I don't know what weird apply magic you want to replace. But the general apply would look just like it does now - but it would probably call the general -ext entry point.
13:48:09
drmeister
I think I know what magic you mean - no - that wouldn't change. That's setting up a call with arbitrary arguments - that's the trickiest thing in C
13:50:10
drmeister
It depends on how similar the call ABI's are to each other. ARM and x86 are very similar - if they just differ in the number of register arguments then we can configure the max number of register arguments for each ABI.
13:51:52
drmeister
If they push their stack arguments onto the stack in reverse order and pass N arguments in registers and there aren't more words between the earliest stack argument and the return address - then each ABI would simply be defined by a number of register arguments.
13:55:00
drmeister
The call site approach would be a quantum leap beyond this. It would require tight integration with the garbage collector.
14:02:02
drmeister
Different topic: Given that the first time the compiler hiccuped with these new primops was while compiling leap suggests that we aren't using them yet in the compiler.
14:02:30
Bike
yeah, we aren't. we use floats rarely. there are only a few places i've hit problems while building
14:10:08
drmeister
I think we should just merge this into main and fix any problems in tests that we find.
14:17:26
Bike
could you get a non-asdf backtrace? definition-rtype is supposed to be called on data rather than instructions, is the issue
14:18:12
drmeister
Ok. I cleared the quicklisp cache just in case - it will take a few min to get back to this.
14:22:44
Bike
no idea why asdf does this. there might be some configuration operation to stop it but asdf is hard to understand
14:23:00
Bike
to reproduce this you might just need to recompile this code, which i'm guessing is (defun unbuilt-vec3-p ...)
14:26:01
Bike
(handler-bind ((error #'invoke-debugger)) (compile-file ...)) might work, but using the serial compiler is probably a good idea anyway
14:28:31
Bike
this error is happening because it's trying to report an error, but i didn't update the error-reporting code, so i can do that to see the actual error
14:32:01
Bike
it's just (= (geom:vx v) (geom:vy v) (geom:vz v) 0.0), assuming you haven't changed it
14:32:52
Bike
could you do (let ((clasp-cleavir::*dis* t)) (compile nil '(lambda (x) (core::primop::%vx x))))? it should give you a bir disassembly
14:35:04
drmeister
No I haven’t changed it. I understand now. This is the first place the compiler is trying to use this primop