Generate optimized IR for a for loop counting from 0 to infinity.
| 1177 | |
| 1178 | |
| 1179 | class ForInfiniteCounter(ForGenerator): |
| 1180 | """Generate optimized IR for a for loop counting from 0 to infinity.""" |
| 1181 | |
| 1182 | def init(self) -> None: |
| 1183 | builder = self.builder |
| 1184 | # Create a register to store the state of the loop index and |
| 1185 | # initialize this register along with the loop index to 0. |
| 1186 | zero = Integer(0) |
| 1187 | self.index_reg = builder.maybe_spill_assignable(zero) |
| 1188 | self.index_target: Register | AssignmentTarget = builder.get_assignment_target(self.index) |
| 1189 | |
| 1190 | def gen_step(self) -> None: |
| 1191 | builder = self.builder |
| 1192 | line = self.line |
| 1193 | # We can safely assume that the integer is short, since we are not going to wrap |
| 1194 | # around a 63-bit integer. |
| 1195 | # NOTE: This would be questionable if short ints could be 32 bits. |
| 1196 | new_val = builder.int_op( |
| 1197 | short_int_rprimitive, builder.read(self.index_reg, line), Integer(1), IntOp.ADD, line |
| 1198 | ) |
| 1199 | builder.assign(self.index_reg, new_val, line) |
| 1200 | |
| 1201 | def begin_body(self) -> None: |
| 1202 | self.builder.assign( |
| 1203 | self.index_target, self.builder.read(self.index_reg, self.line), self.line |
| 1204 | ) |
| 1205 | |
| 1206 | |
| 1207 | class ForEnumerate(ForGenerator): |
no outgoing calls
no test coverage detected
searching dependent graphs…