nitvm: Optimizing subtyping tests with new mechanisms
authorJulien Pagès <julien.projet@gmail.com>
Tue, 26 May 2015 09:32:15 +0000 (11:32 +0200)
committerJulien Pagès <julien.projet@gmail.com>
Tue, 26 May 2015 21:38:58 +0000 (23:38 +0200)
Signed-off-by: Julien Pagès <julien.projet@gmail.com>

src/vm/vm_optimizations.nit

index 8c024f8..514d3d1 100644 (file)
@@ -232,7 +232,7 @@ redef class AIsaExpr
                var recv = v.expr(self.n_expr)
                if recv == null then return null
 
-               if status == 0 then optimize(v, recv.mtype, self.cast_type.as(not null))
+               optimize(v, recv.mtype, self.cast_type.as(not null))
                var mtype = v.unanchor_type(self.cast_type.as(not null))
 
                # If this test can be optimized, directly call appropriate subtyping methods
@@ -258,10 +258,19 @@ redef class AIsaExpr
                        return
                end
 
-               if not target.mclass.loaded then return
+               if not target.mclass.abstract_loaded then return
+
+               # If the value is positive, the target class has an invariant position in source's structures
+               var value = source.mclass.get_position_methods(target.mclass)
 
-               # We use perfect hashing
-               status = 2
+               if value > 0 then
+                       # `value - 2` is the position of the target identifier in source vtable
+                       position = value - 2
+                       status = 1
+               else
+                       # We use perfect hashing
+                       status = 2
+               end
                id = target.mclass.vtable.id
        end
 end
@@ -288,7 +297,7 @@ redef class AAsCastExpr
                var recv = v.expr(self.n_expr)
                if recv == null then return null
 
-               if status == 0 then optimize(v, recv.mtype, self.mtype.as(not null))
+               optimize(v, recv.mtype, self.mtype.as(not null))
 
                var mtype = self.mtype.as(not null)
                var amtype = v.unanchor_type(mtype)
@@ -323,11 +332,17 @@ redef class AAsCastExpr
 
                if not target.mclass.loaded then return
 
-               # Try to get the position of the target type in source's structures
-               var value = source.mclass.positions_methods.get_or_null(target.mclass)
+               # If the value is positive, the target class has an invariant position in source's structures
+               var value = source.mclass.get_position_methods(target.mclass)
 
-               # We use perfect hashing
-               status = 2
+               if value > 0 then
+                       # `value - 2` is the position of the target identifier in source vtable
+                       position = value - 2
+                       status = 1
+               else
+                       # We use perfect hashing
+                       status = 2
+               end
                id = target.mclass.vtable.id
        end
 end