summaryrefslogtreecommitdiff
path: root/src/main/java/com/seaofnodes/simple/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/seaofnodes/simple/codegen')
-rw-r--r--src/main/java/com/seaofnodes/simple/codegen/CodeGen.java1
-rw-r--r--src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java2
-rw-r--r--src/main/java/com/seaofnodes/simple/codegen/InstSelect.java1
-rw-r--r--src/main/java/com/seaofnodes/simple/codegen/Opto.java4
-rw-r--r--src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java5
5 files changed, 9 insertions, 4 deletions
diff --git a/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
index b79eb73d..a49299e1 100644
--- a/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
+++ b/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
@@ -154,7 +154,6 @@ public class CodeGen {
private int _fidx =0;
public TypeFunPtr makeFun( TypeFunPtr fun ) {
int fidx = _fidx++;
- assert fidx<64; // TODO: need a larger FIDX space
return fun.makeFrom(fidx);
}
// Signature for MAIN
diff --git a/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java b/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
index da45db4f..9be662e8 100644
--- a/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
+++ b/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
@@ -251,7 +251,7 @@ public abstract class GlobalCodeMotion {
visit.set(def._nid);
for( Node out : def._outputs )
if( out instanceof MemOpNode ld && ld._isLoad && late[ld._nid]==null ) work.push(ld);
- if( def instanceof MemMergeNode )
+ if( def instanceof MemMergeNode || def instanceof EscapeNode )
for( int i=1; i<def.nIns(); i++ )
if( def.in(i)!=null ) wakeLoads(def.in(i),late,work,visit);
}
diff --git a/src/main/java/com/seaofnodes/simple/codegen/InstSelect.java b/src/main/java/com/seaofnodes/simple/codegen/InstSelect.java
index 5a91cf9f..b0351c98 100644
--- a/src/main/java/com/seaofnodes/simple/codegen/InstSelect.java
+++ b/src/main/java/com/seaofnodes/simple/codegen/InstSelect.java
@@ -89,6 +89,7 @@ class InstSelect {
private Node select(Node n) {
+ if( n instanceof EscapeNode esc ) return new EscapeMach(esc);
if( n instanceof GuardNode guard ) return new GuardMach(guard);
if( n instanceof PtrToIntNode ptr ) return new PtrToIntMach(ptr);
Node op = n;
diff --git a/src/main/java/com/seaofnodes/simple/codegen/Opto.java b/src/main/java/com/seaofnodes/simple/codegen/Opto.java
index c78e732e..82646a25 100644
--- a/src/main/java/com/seaofnodes/simple/codegen/Opto.java
+++ b/src/main/java/com/seaofnodes/simple/codegen/Opto.java
@@ -101,6 +101,7 @@ abstract public class Opto {
// Always true for main
if( fun.sig().fidx() == code._main.fidx() ) return true;
// No escape analysis yet: a surviving address may be called from outside.
+ if( fun._constructor ) return false;
if( fun.hasPtr() ) return true;
// Never true for stdlib or anonymous functions
if( fun._name == null || fun._name.startsWith("sys.") )
@@ -113,8 +114,7 @@ abstract public class Opto {
// into a Call, link the Call and Fun.
private static void linkCG(CodeGen code, TypeFunPtr tfp, CallNode call) {
if( tfp.nargs() != call.nargs() ) return; // Error calls hit this
- for( long fidxs=tfp.fidxs(); fidxs!=0; fidxs=TypeFunPtr.nextFIDX(fidxs) ) {
- int fidx = Long.numberOfTrailingZeros(fidxs);
+ for( int fidx=XInt.next(tfp.fidxs(),-1); fidx>=0; fidx=XInt.next(tfp.fidxs(),fidx) ) {
FunNode fun = code.link(fidx);
// null here means an external function; i.e. this Call
// calls to an outside library and all its arguments escape.
diff --git a/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java b/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java
index bc698e19..7dadb4d2 100644
--- a/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java
+++ b/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java
@@ -14,6 +14,11 @@ abstract class TypeCheck {
});
if( errs.isEmpty() ) return;
+ // Publication is a producer check. Report an incomplete object before
+ // its users complain about values or permissions inherited from it.
+ for( Node n : errs )
+ if( n instanceof EscapeNode ) throw n.err();
+
// A bad Load now produces BOTTOM. Report the bad access before a
// Convert or arithmetic use that merely received its failed result.
Node first = errs.at(0);