-
Notifications
You must be signed in to change notification settings - Fork 681
Open
Description
pseudo code
I have two pattern rules like this.
- First case
I need to remove the instruction 'iget-wide '
iput-wide v1, v0, Lcom/example/myapplication/ui/home/Peephole;->put_wide_value:J
iget-wide v1, v0, Lcom/example/myapplication/ui/home/Peephole;->put_wide_value:J
return-void
Pattern A:
iput_field(Register::A, Register::B, reference)
iget_field(Register::A, Register::B, reference)
- Second case
I need to replace the second instruction 'iget-wide ' to 'move v2, v1'
iput-wide v1, v0, Lcom/example/myapplication/ui/home/Peephole;->put_wide_value:J
iget-wide v2, v0, Lcom/example/myapplication/ui/home/Peephole;->put_wide_value:J
return-void
Pattern B:
iput_field(Register::A, Register::B, reference)
iget_field(Register::C, Register::B, reference)
Problem
The instruction list at this:
iput-wide v1, v0, Lcom/example/myapplication/ui/home/Peephole;->put_wide_value:J
iget-wide v2, v0, Lcom/example/myapplication/ui/home/Peephole;->put_wide_value:J
return-void
has been matched by the pattern A and B.
Analyze
From redex source code at try_match method in peephole pass
auto match_reg = [&](Register pattern_reg, reg_t insn_reg) {
// This register has been observed already. Check whether they are same.
if (matched_regs.find(pattern_reg) != end(matched_regs)) {
return matched_regs.at(pattern_reg) == insn_reg;
}
// Newly observed. Remember it.
matched_regs.emplace(pattern_reg, insn_reg);
return true;
};
The pattern_reg and insn_reg is not one to one. The insn_reg can set to multi Register value.
Metadata
Metadata
Assignees
Labels
No labels