[ 3 ] [ "ffi_test_1" f dlsym indirect-test-1 ] unit-test
+: indirect-test-1' ( ptr -- )
+ "int" { } "cdecl" alien-indirect drop ;
+
+{ 1 0 } [ indirect-test-1' ] must-infer-as
+
+[ ] [ "ffi_test_1" f dlsym indirect-test-1' ] unit-test
+
[ -1 indirect-test-1 ] must-fail
: indirect-test-2 ( x y ptr -- result )
drop-values
] ;
-: drop-dead-outputs ( node -- nodes )
+: drop-dead-outputs ( node -- #shuffle )
dup out-d>> drop-dead-values tuck in-d>> >>out-d drop ;
+: some-outputs-dead? ( #call -- ? )
+ out-d>> [ live-value? not ] contains? ;
+
+: maybe-drop-dead-outputs ( node -- nodes )
+ dup some-outputs-dead? [
+ dup drop-dead-outputs 2array
+ ] when ;
+
M: #introduce remove-dead-code* ( #introduce -- nodes )
- dup drop-dead-outputs 2array ;
+ maybe-drop-dead-outputs ;
M: #>r remove-dead-code*
[ filter-live ] change-out-r
[ in-d>> #drop remove-dead-code* ]
bi ;
-: some-outputs-dead? ( #call -- ? )
- out-d>> [ live-value? not ] contains? ;
-
M: #call remove-dead-code*
- dup dead-flushable-call? [
- remove-flushable-call
- ] [
- dup some-outputs-dead? [
- dup drop-dead-outputs 2array
- ] when
- ] if ;
+ dup dead-flushable-call?
+ [ remove-flushable-call ] [ maybe-drop-dead-outputs ] if ;
M: #shuffle remove-dead-code*
[ filter-live ] change-in-d
M: #terminate remove-dead-code*
[ filter-live ] change-in-d
[ filter-live ] change-in-r ;
+
+M: #alien-invoke remove-dead-code*
+ maybe-drop-dead-outputs ;
+
+M: #alien-indirect remove-dead-code*
+ maybe-drop-dead-outputs ;