diff -r 07c1e0dc312b Cython/Compiler/Nodes.py
--- a/Cython/Compiler/Nodes.py	Thu Mar 19 11:58:58 2009 -0700
+++ b/Cython/Compiler/Nodes.py	Fri Mar 20 02:53:42 2009 +0530
@@ -3967,35 +3967,65 @@
             decop = "%s=%s" % (decop[0], step)
         loopvar_name = self.loopvar_node.result()
         if from_range:
+            temp_range_bound = code.funcstate.allocate_temp(self.bound2.type, manage_ref=False)
+            code.putln("%s = %s;" % (temp_range_bound, self.bound2.result()))
             # Skip the loop entirely (and avoid assigning to the loopvar) if
             # the loop is empty:
             code.putln("if (%s%s %s %s) {" % (
-            self.bound1.result(), offset, self.relation2, self.bound2.result()
+            self.bound1.result(), offset, self.relation2, temp_range_bound
             ))
-        code.putln(
-            "for (%s = %s%s; %s %s %s; %s%s) {" % (
-                loopvar_name,
-                self.bound1.result(), offset,
-                loopvar_name, self.relation2, self.bound2.result(),
-                loopvar_name, incop))
-        if self.py_loopvar_node:
-            self.py_loopvar_node.generate_evaluation_code(code)
-            self.target.generate_assignment_code(self.py_loopvar_node, code)
-        self.body.generate_execution_code(code)
-        code.put_label(code.continue_label)
-        if from_range:
-            # Undo last increment to maintain Python semantics:
-            code.putln("} %s%s;" % (loopvar_name, decop))
-            # End the outer if statement:
-            code.putln("} /* end if */")
-        else:
-            code.putln("}")
-        break_label = code.break_label
-        code.set_loop_labels(old_loop_labels)
-        if self.else_clause:
-            code.putln("/*else*/ {")
-            self.else_clause.generate_execution_code(code)
-            code.putln("}")
+            code.putln(
+                "for (%s = %s%s; %s %s %s; %s%s) {" % (
+                    loopvar_name,
+                    self.bound1.result(), offset,
+                    loopvar_name, self.relation2, temp_range_bound,
+                    loopvar_name, incop))
+            if self.py_loopvar_node:
+                self.py_loopvar_node.generate_evaluation_code(code)
+                self.target.generate_assignment_code(self.py_loopvar_node, code)
+            self.body.generate_execution_code(code)
+            code.put_label(code.continue_label)
+            if from_range:
+                code.funcstate.release_temp(temp_range_bound)  
+                # Undo last increment to maintain Python semantics:
+                code.putln("} %s%s;" % (loopvar_name, decop))
+                # End the outer if statement:
+                code.putln("} /* end if */")
+            else:
+                code.putln("}")
+            break_label = code.break_label
+            code.set_loop_labels(old_loop_labels)
+            if self.else_clause:
+                code.putln("/*else*/ {")
+                self.else_clause.generate_execution_code(code)
+                code.putln("}")
+
+        else:
+            code.putln(
+                "for (%s = %s%s; %s %s %s; %s%s) {" % (
+                    loopvar_name,
+                    self.bound1.result(), offset,
+                    loopvar_name, self.relation2, self.bound2.result(),
+                    loopvar_name, incop))
+            if self.py_loopvar_node:
+                self.py_loopvar_node.generate_evaluation_code(code)
+                self.target.generate_assignment_code(self.py_loopvar_node, code)
+            self.body.generate_execution_code(code)
+            code.put_label(code.continue_label)
+            if from_range:
+                # Undo last increment to maintain Python semantics:
+                code.putln("} %s%s;" % (loopvar_name, decop))
+                # End the outer if statement:
+                code.putln("} /* end if */")
+            else:
+                code.putln("}")
+            break_label = code.break_label
+            code.set_loop_labels(old_loop_labels)
+            if self.else_clause:
+                code.putln("/*else*/ {")
+                self.else_clause.generate_execution_code(code)
+                code.putln("}")
+
         code.put_label(break_label)
         self.bound1.generate_disposal_code(code)
         self.bound1.free_temps(code)
diff -r 07c1e0dc312b tests/bugs/rangeOptimization_T203.pyx
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/bugs/rangeOptimization_T203.pyx	Fri Mar 20 02:53:42 2009 +0530
@@ -0,0 +1,61 @@
+__doc__ = u"""
+>>> test_var(10, 5)
+at 0
+at 1
+at 2
+at 3
+at 4
+5
+>>> test_func(5)
+get_bound(5)
+at 0
+at 1
+at 2
+at 3
+at 4
+5
+>>> test_f()
+9
+>>> f()
+g called
+0
+1
+2
+2
+"""
+
+cdef int get_bound(int m):
+    print "get_bound(%s)"%m
+    return m
+
+def test_var(int n, int m):
+    cdef int i
+    for i from 0 <= i < n:
+        print "at", i
+        n = m
+    return i
+
+def test_func(int n):
+    cdef int i
+    for i from 0 <= i < get_bound(n):
+        print "at", i
+    return i
+
+def test_f():
+    cdef int i,n
+    n = 10
+    for i in range(n):
+      if i == 5: n *= 2
+    print i
+
+cdef int g():
+    print "g called"
+    return 3
+
+def f():
+    cdef int i
+    for i in range(g()):
+        print i
+    print i
+
+
