|
@@ -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
|