From 514b3147bf08817d17aacc492be255621209ec8b Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Wed, 7 Oct 2026 12:37:06 -0700 Subject: RoundF32 actually rounds --- .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/type/TypeStruct.java | 2 +- .../java/com/seaofnodes/simple/Chapter18Test.java | 27 ++++++++++++++++++++++ .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + .../com/seaofnodes/simple/node/RoundF32Node.java | 1 + docs/chapter-backports.md | 26 ++++++++++++++++----- 16 files changed, 61 insertions(+), 7 deletions(-) diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter14/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java index 78e7698c..6be071a2 100644 --- a/chapter14/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java +++ b/chapter14/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java @@ -16,6 +16,7 @@ public class RoundF32Node extends Node { public Type compute() { if (in(1)._type instanceof TypeFloat i0 && i0.isConstant() ) return TypeFloat.constant((float)i0.value()); + if( in(1)._type==TypeFloat.BOT ) return TypeFloat.B32; return in(1)._type; } diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter15/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java index 78e7698c..6be071a2 100644 --- a/chapter15/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java +++ b/chapter15/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java @@ -16,6 +16,7 @@ public class RoundF32Node extends Node { public Type compute() { if (in(1)._type instanceof TypeFloat i0 && i0.isConstant() ) return TypeFloat.constant((float)i0.value()); + if( in(1)._type==TypeFloat.BOT ) return TypeFloat.B32; return in(1)._type; } diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter16/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java index 78e7698c..6be071a2 100644 --- a/chapter16/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java +++ b/chapter16/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java @@ -16,6 +16,7 @@ public class RoundF32Node extends Node { public Type compute() { if (in(1)._type instanceof TypeFloat i0 && i0.isConstant() ) return TypeFloat.constant((float)i0.value()); + if( in(1)._type==TypeFloat.BOT ) return TypeFloat.B32; return in(1)._type; } diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java index 78e7698c..6be071a2 100644 --- a/chapter17a/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java +++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java @@ -16,6 +16,7 @@ public class RoundF32Node extends Node { public Type compute() { if (in(1)._type instanceof TypeFloat i0 && i0.isConstant() ) return TypeFloat.constant((float)i0.value()); + if( in(1)._type==TypeFloat.BOT ) return TypeFloat.B32; return in(1)._type; } diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java index 78e7698c..6be071a2 100644 --- a/chapter17b/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java +++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java @@ -16,6 +16,7 @@ public class RoundF32Node extends Node { public Type compute() { if (in(1)._type instanceof TypeFloat i0 && i0.isConstant() ) return TypeFloat.constant((float)i0.value()); + if( in(1)._type==TypeFloat.BOT ) return TypeFloat.B32; return in(1)._type; } diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter18/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java index 78e7698c..10a0e4aa 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java +++ b/chapter18/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java @@ -16,6 +16,7 @@ public class RoundF32Node extends Node { public Type compute() { if (in(1)._type instanceof TypeFloat i0 && i0.isConstant() ) return TypeFloat.constant((float)i0.value()); + if( in(1)._type==TypeFloat.F64 ) return TypeFloat.F32; return in(1)._type; } diff --git a/chapter18/src/main/java/com/seaofnodes/simple/type/TypeStruct.java b/chapter18/src/main/java/com/seaofnodes/simple/type/TypeStruct.java index bc640955..fff6a7db 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/type/TypeStruct.java +++ b/chapter18/src/main/java/com/seaofnodes/simple/type/TypeStruct.java @@ -49,7 +49,7 @@ public class TypeStruct extends Type { // Array public static TypeStruct makeAry(TypeInteger len, int lenAlias, Type body, int bodyAlias) { - assert body instanceof TypeInteger || (body instanceof TypeNil tn && tn.nullable()); + assert body instanceof TypeInteger || body instanceof TypeFloat || (body instanceof TypeNil tn && tn.nullable()); return make("[" + body.str() + "]", Field.make("#" ,len , lenAlias,true ), Field.make("[]",body,bodyAlias,false)); diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java index c4d5b9ac..0758fbf5 100644 --- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java +++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java @@ -9,6 +9,33 @@ import static org.junit.Assert.fail; import org.junit.Ignore; public class Chapter18Test { + @Test public void testFloatArrays() { + for( String type : new String[]{"flt","f64","f32"} ) { + CodeGen zero = new CodeGen("var a = new "+type+"[arg]; return a[arg-1];") + .parse().opto().typeCheck(); + assertEquals("0.0",Eval2.eval(zero,3)); + // Eval2 does not execute RoundF32 yet; check nonconstant narrowing here. + new CodeGen(type+" x = arg; var a = new "+type+"[arg]; a[0] = x; return a[0];") + .parse().opto().typeCheck(); + } + for( String type : new String[]{"flt","f64"} ) { + CodeGen loop = new CodeGen("var a = new "+type+"[arg]; "+ + "for(int i=0; i.log`. + - **Shared Phi inputs and deterministic inlining (2026-10-07).** Chapters 20-25 split a self-conflicting Phi's inputs when another Phi shares them; splitting only the entry and result could leave two loop Phis joined through -- cgit v1.2.3