Returns the phi definition.
(&mut self, block: usize, from_block: usize)
| 439 | impl Renamer<'_> { |
| 440 | // Returns the phi definition. |
| 441 | fn insert_phi_value(&mut self, block: usize, from_block: usize) -> Word { |
| 442 | let from_block_label = self.blocks[from_block].label_id().unwrap(); |
| 443 | let phi_defs = &self.phi_defs; |
| 444 | let existing_phi = self.blocks[block].instructions.iter_mut().find(|inst| { |
| 445 | inst.class.opcode == Op::Phi && phi_defs.contains(&inst.result_id.unwrap()) |
| 446 | }); |
| 447 | let top_def = top_stack_or_undef( |
| 448 | self.header, |
| 449 | self.types_global_values, |
| 450 | &self.stack, |
| 451 | self.base_var_type, |
| 452 | ); |
| 453 | match existing_phi { |
| 454 | None => { |
| 455 | let new_id = id(self.header); |
| 456 | self.blocks[block].instructions.insert( |
| 457 | 0, |
| 458 | Instruction::new( |
| 459 | Op::Phi, |
| 460 | Some(self.base_var_type), |
| 461 | Some(new_id), |
| 462 | vec![Operand::IdRef(top_def), Operand::IdRef(from_block_label)], |
| 463 | ), |
| 464 | ); |
| 465 | self.phi_defs.insert(new_id); |
| 466 | new_id |
| 467 | } |
| 468 | Some(existing_phi) => { |
| 469 | existing_phi.operands.extend_from_slice(&[ |
| 470 | Operand::IdRef(top_def), |
| 471 | Operand::IdRef(from_block_label), |
| 472 | ]); |
| 473 | existing_phi.result_id.unwrap() |
| 474 | } |
| 475 | } |
| 476 | } |
| 477 | |
| 478 | fn rename(&mut self, block: usize, from_block: Option<usize>) { |
| 479 | let original_stack = self.stack.len(); |
no test coverage detected