From 5175ad374a53c089f75030ce4ca084a5229be365 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Fri, 2 Jul 1993 02:51:57 +0000 Subject: [PATCH] (find_auto_inc): In *p=expr;q=p+size case, avoid clobbering q if referenced in expr. * (find_auto_inc): In *p=expr;q=p+size case, avoid clobbering q if referenced in expr. From-SVN: r4830 --- gcc/flow.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gcc/flow.c b/gcc/flow.c index a5cc47612b0..8d4fc6c337b 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -1989,11 +1989,14 @@ find_auto_inc (needed, x, insn) if (dead_or_set_p (incr, addr)) win = 1; - else if (GET_CODE (q) == REG && ! reg_used_between_p (q, insn, incr)) + else if (GET_CODE (q) == REG + /* PREV_INSN used here to check the semi-open interval + [insn,incr). */ + && ! reg_used_between_p (q, PREV_INSN (insn), incr)) { - /* We have *p followed by q = p+size. + /* We have *p followed sometime later by q = p+size. Both p and q must be live afterward, - and q must be dead before. + and q is not used between INSN and it's assignment. Change it to q = p, ...*q..., q = q+size. Then fall into the usual case. */ rtx insns, temp;