diff options
Diffstat (limited to 'chapter28b/src/test/java/com/seaofnodes')
3 files changed, 19 insertions, 2 deletions
diff --git a/chapter28b/src/test/java/com/seaofnodes/simple/Chapter20Test.java b/chapter28b/src/test/java/com/seaofnodes/simple/Chapter20Test.java index 1001e691..66a318ae 100644 --- a/chapter28b/src/test/java/com/seaofnodes/simple/Chapter20Test.java +++ b/chapter28b/src/test/java/com/seaofnodes/simple/Chapter20Test.java @@ -216,7 +216,7 @@ for( int i=0; i<ary#-1; i++ ) return ary[1] * 1000 + ary[3]; // 1 * 1000 + 6 """; testCPU(src,"x86_64_v2", "SystemV",-1,"return mov(.[]);"); - testCPU(src,"riscv" , "SystemV", 9,"return (add,.[],(mul,.[],1000));"); + testCPU(src,"riscv" , "SystemV", 7,"return (add,.[],(mul,.[],1000));"); testCPU(src,"arm" , "SystemV", 5,"return (add,.[],(mul,.[],1000));"); } diff --git a/chapter28b/src/test/java/com/seaofnodes/simple/Chapter21Test.java b/chapter28b/src/test/java/com/seaofnodes/simple/Chapter21Test.java index d5b41ac9..f1dc54e2 100644 --- a/chapter28b/src/test/java/com/seaofnodes/simple/Chapter21Test.java +++ b/chapter28b/src/test/java/com/seaofnodes/simple/Chapter21Test.java @@ -324,7 +324,7 @@ for( int i=0; i<ary#-1; i++ ) return ary[1] * 1000 + ary[3]; // 1 * 1000 + 6 """; testCPU(src,"x86_64_v2", "SystemV",-1,"return mov(.[]);"); - testCPU(src,"riscv" , "SystemV", 9,"return (add,.[],(mul,.[],1000));"); + testCPU(src,"riscv" , "SystemV", 7,"return (add,.[],(mul,.[],1000));"); testCPU(src,"arm" , "SystemV", 5,"return (add,.[],(mul,.[],1000));"); } diff --git a/chapter28b/src/test/java/com/seaofnodes/simple/TypeTest.java b/chapter28b/src/test/java/com/seaofnodes/simple/TypeTest.java index 113676ff..bb08b5ac 100644 --- a/chapter28b/src/test/java/com/seaofnodes/simple/TypeTest.java +++ b/chapter28b/src/test/java/com/seaofnodes/simple/TypeTest.java @@ -7,6 +7,23 @@ import static org.junit.Assert.assertSame; public class TypeTest { + // Refining an unknown pointer must remove possible escapes, not add them. + // Inlining can expose the abstract self pointer before its concrete class. + @Test public void testAbstractPointerEscapes() { + TypeMemPtr object = TypeMemPtr.make(TypeStruct.make("EscapingCallback",false, + Field.make("callback",TypeFunPtr.TEST,2,false))); + for( Type precise : new Type[]{object,TypeFunPtr.TEST} ) + for( Type broad : new Type[]{Type.BOTTOM,TypeScalar.BOT,TypePtr.PTR,TypePtr.NPTR} ) { + Assert.assertTrue(precise.isa(broad)); + TypeMem unknown = TypeMem.START.escapes(broad); + assertSame(XInt.FULL,unknown._escFs); + assertSame(XInt.FULL,unknown._escAs); + Assert.assertTrue(TypeMem.START.escapes(precise).isa(unknown)); + } + for( Type empty : new Type[]{Type.TOP,TypeScalar.TOP,TypePtr.XPTR,TypePtr.XNPTR,TypeNil.NIL} ) + assertSame(TypeMem.START,TypeMem.START.escapes(empty)); + } + @Test public void testBoundedBits() { int[] sparse = XInt.make(XInt.make(2),65); for( int[] bits : new int[][]{XInt.EMPTY,XInt.FULL,sparse,XInt.dual(sparse)} ) |
