(chunk: &mut SSAChunk, dead: &mut [bool], ip: usize)
| 194 | } |
| 195 | |
| 196 | fn try_fold_binop(chunk: &mut SSAChunk, dead: &mut [bool], ip: usize) { |
| 197 | let Some(prev1_ip) = prev_live(dead, ip) else { return }; |
| 198 | let Some(prev2_ip) = prev_live(dead, prev1_ip) else { return }; |
| 199 | |
| 200 | let p2 = chunk.instructions[prev2_ip]; |
| 201 | let p1 = chunk.instructions[prev1_ip]; |
| 202 | if p2.opcode != OpCode::LoadConst || p1.opcode != OpCode::LoadConst { return; } |
| 203 | |
| 204 | let (Some(a), Some(b)) = ( |
| 205 | const_to_val(&chunk.constants, p2.operand), |
| 206 | const_to_val(&chunk.constants, p1.operand), |
| 207 | ) else { return }; |
| 208 | |
| 209 | let opcode = chunk.instructions[ip].opcode; |
| 210 | let Some(result) = fold_binop(opcode, a, b) else { return }; |
| 211 | |
| 212 | if !write_const_load(chunk, prev2_ip, result) { return; } |
| 213 | dead[prev1_ip] = true; |
| 214 | dead[ip] = true; |
| 215 | } |
| 216 | |
| 217 | fn try_fold_not(chunk: &mut SSAChunk, dead: &mut [bool], ip: usize) { |
| 218 | let Some(prev1_ip) = prev_live(dead, ip) else { return }; |
no test coverage detected