|
@@ -93,8 +93,11 @@ class AnalysisState(object):
|
|
|
|
|
|
def analyze_if(self, instruction):
|
|
|
"""Analyzes an 'if' instruction."""
|
|
|
+ def __analyze_condition():
|
|
|
+ condition_node = self.analyze(instruction.condition)
|
|
|
+ return self.current_block.append_definition(cfg_ir.Read(condition_node))
|
|
|
return self.emit_select(
|
|
|
- lambda: self.analyze(instruction.condition),
|
|
|
+ __analyze_condition,
|
|
|
lambda: self.analyze(instruction.if_clause),
|
|
|
lambda:
|
|
|
self.current_block.append_definition(cfg_ir.Literal(None))
|
|
@@ -110,7 +113,8 @@ class AnalysisState(object):
|
|
|
# jump !loop_condition()
|
|
|
#
|
|
|
# !loop_condition():
|
|
|
- # $condition = <condition>
|
|
|
+ # $condition_node = <condition>
|
|
|
+ # $condition = read condition_node
|
|
|
# select $condition, !loop_body(), !loop_exit()
|
|
|
#
|
|
|
# !loop_body():
|
|
@@ -128,9 +132,10 @@ class AnalysisState(object):
|
|
|
self.current_block.flow = cfg_ir.create_jump(loop_condition_block)
|
|
|
|
|
|
self.current_block = loop_condition_block
|
|
|
- condition_value = self.analyze(instruction.condition)
|
|
|
+ condition_node = self.analyze(instruction.condition)
|
|
|
+ condition = self.current_block.append_definition(cfg_ir.Read(condition_node))
|
|
|
self.current_block.flow = cfg_ir.SelectFlow(
|
|
|
- condition_value, cfg_ir.Branch(loop_body_block), cfg_ir.Branch(loop_exit_block))
|
|
|
+ condition, cfg_ir.Branch(loop_body_block), cfg_ir.Branch(loop_exit_block))
|
|
|
|
|
|
self.current_block = loop_body_block
|
|
|
self.analyze(instruction.body)
|