Calls to this function are guarded by a test checking if the operand is defined by an OP_AND. Move this guard inside the function as this make easier to handle more opcodes later. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- simplify.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/simplify.c b/simplify.c index a01245f79..a8a5d9b91 100644 --- a/simplify.c +++ b/simplify.c @@ -550,7 +550,7 @@ undef: // try to simplify OP(OR(a, b), C) // @insn: the 'masking' instruction // @mask: the mask associated to @insn (M) -// @ora: one of the OR's operands +// @ora: one of the OR's operands, guaranted to be PSEUDO_REG // @orb: the other OR's operand // @return: 0 if no changes have been made, one or more REPEAT_* flags otherwise. static int simplify_mask_or_and(struct instruction *insn, unsigned long long mask, @@ -560,6 +560,8 @@ static int simplify_mask_or_and(struct instruction *insn, unsigned long long mas struct instruction *and = ora->def; pseudo_t src2 = and->src2; + if (and->opcode != OP_AND) + return 0; if (!constant(src2)) return 0; omask = src2->value; @@ -587,12 +589,14 @@ static int simplify_mask_or(struct instruction *insn, unsigned long long mask, s pseudo_t src2 = or->src2; int rc; - if (def_opcode(src1) == OP_AND) + if (src1->type == PSEUDO_REG) { if ((rc = simplify_mask_or_and(insn, mask, src1, src2))) return rc; - if (def_opcode(src2) == OP_AND) + } + if (src2->type == PSEUDO_REG) { if ((rc = simplify_mask_or_and(insn, mask, src2, src1))) return rc; + } return 0; } -- 2.18.0