avoid generating code for 'if' conditions that are known to be False
authorStefan Behnel <scoder@users.berlios.de>
Tue, 27 Apr 2010 18:37:32 +0000 (20:37 +0200)
committerStefan Behnel <scoder@users.berlios.de>
Tue, 27 Apr 2010 18:37:32 +0000 (20:37 +0200)
Cython/Compiler/Nodes.py

index 49d1376215291b89c0cc1c5d136a78abca128146..00ac446326b46780f6201afbfb033de1720abc5e 100644 (file)
@@ -3871,18 +3871,36 @@ class IfStatNode(StatNode):
             if_clause.analyse_expressions(env)
         if self.else_clause:
             self.else_clause.analyse_expressions(env)
-    
+
+        # eliminate dead code based on constant condition results
+        if_clauses = []
+        condition_result = None
+        for if_clause in self.if_clauses:
+            condition_result = if_clause.get_constant_condition_result()
+            if condition_result != False:
+                if_clauses.append(if_clause)
+                if condition_result == True:
+                    # other conditions can no longer apply
+                    self.else_clause = None
+                    break
+        self.if_clauses = if_clauses
+        # FIXME: if only one active code body is left here, we can
+        # replace the whole node
+
     def generate_execution_code(self, code):
         code.mark_pos(self.pos)
-        end_label = code.new_label()
-        for if_clause in self.if_clauses:
-            if_clause.generate_execution_code(code, end_label)
-        if self.else_clause:
-            code.putln("/*else*/ {")
+        if self.if_clauses:
+            end_label = code.new_label()
+            for if_clause in self.if_clauses:
+                if_clause.generate_execution_code(code, end_label)
+            if self.else_clause:
+                code.putln("/*else*/ {")
+                self.else_clause.generate_execution_code(code)
+                code.putln("}")
+            code.put_label(end_label)
+        elif self.else_clause:
             self.else_clause.generate_execution_code(code)
-            code.putln("}")
-        code.put_label(end_label)
-        
+
     def annotate(self, code):
         for if_clause in self.if_clauses:
             if_clause.annotate(code)
@@ -3909,7 +3927,13 @@ class IfClauseNode(Node):
         self.condition = \
             self.condition.analyse_temp_boolean_expression(env)
         self.body.analyse_expressions(env)
-    
+
+    def get_constant_condition_result(self):
+        if self.condition.has_constant_result():
+            return self.condition.constant_result
+        else:
+            return None
+
     def generate_execution_code(self, code, end_label):
         self.condition.generate_evaluation_code(code)
         code.putln(