Browse Source

Fix a bug in the instruction scheduling algorithm

jonathanvdc 8 years ago
parent
commit
f8c82738c1
1 changed files with 28 additions and 26 deletions
  1. 28 26
      kernel/modelverse_jit/cfg_to_tree.py

+ 28 - 26
kernel/modelverse_jit/cfg_to_tree.py

@@ -504,33 +504,30 @@ class DefinitionScheduler(object):
     def __schedule_definition(self, definition, store_and_forget=False):
         """Schedules the given definition, excluding definitions that are dependent on it.
            A list of trees is returned."""
+        assert not self.has_scheduled(definition)
         statements = []
-        if not self.has_scheduled(definition):
-            self.remove_definition(definition)
-            if isinstance(definition, cfg_ir.FlowInstruction):
-                statements.append(self.lowering_state.lower_value(definition))
+
+        self.remove_definition(definition)
+        if isinstance(definition, cfg_ir.FlowInstruction):
+            statements.append(self.lowering_state.lower_value(definition))
+        else:
+            # We're sure that we're dealing with a bona fide cfg_ir.Definition now.
+            definition_value = definition.value
+            if cfg_ir.is_value_def(definition_value, LoweringState.inline_value_types):
+                pass
+            elif (not store_and_forget
+                  and definition in self.lowering_state.inlinable_definitions):
+                statements.append(self.lowering_state.lower_value(definition_value))
             else:
-                # We're sure that we're dealing with a bona fide cfg_ir.Definition now.
-                definition_value = definition.value
-                if cfg_ir.is_value_def(definition_value, LoweringState.inline_value_types):
-                    pass
-                elif (not store_and_forget
-                      and definition in self.lowering_state.inlinable_definitions):
-                    statements.append(self.lowering_state.lower_value(definition_value))
+                lowered_value = self.lowering_state.lower_value(definition_value)
+                if definition.has_value():
+                    def_load = self.lowering_state.create_definition_load(definition)
+                    statements.append(
+                        tree_ir.IgnoreInstruction(def_load.create_store(lowered_value)))
+                    if not store_and_forget:
+                        statements.append(def_load)
                 else:
-                    lowered_value = self.lowering_state.lower_value(definition_value)
-                    if definition.has_value():
-                        def_load = self.lowering_state.create_definition_load(definition)
-                        statements.append(
-                            tree_ir.IgnoreInstruction(def_load.create_store(lowered_value)))
-                        if not store_and_forget:
-                            statements.append(def_load)
-                    else:
-                        statements.append(lowered_value)
-        elif (not store_and_forget
-              and definition.has_value()
-              and not cfg_ir.is_value_def(definition, LoweringState.inline_value_types)):
-            statements.append(self.lowering_state.create_definition_load(definition))
+                    statements.append(lowered_value)
 
         return statements
 
@@ -545,8 +542,13 @@ class DefinitionScheduler(object):
             dependent_tree = self.schedule(dependent, True)
             statements.append(dependent_tree)
 
-        # statements.reverse()
-        statements = self.__schedule_definition(definition, store_and_forget) + statements
+        statements.reverse()
+        if not self.has_scheduled(definition):
+            statements = self.__schedule_definition(definition, store_and_forget) + statements
+        elif (not store_and_forget
+              and definition.has_value()
+              and not cfg_ir.is_value_def(definition, LoweringState.inline_value_types)):
+            statements.append(self.lowering_state.create_definition_load(definition))
 
         result = tree_ir.create_block(*statements)
         return result