Hi, > >> it is trying to allow for > >> > >> do > >> { > >> *p = '\0'; > >> i++; /* use_uses_inced_iv == true */ > >> p++; /* use_after_cand_inc == true */ > >> if (!(i < n)) > >> break; > >> } > >> while (1); > >> > >> and for > >> > >> do > >> { > >> *p = '\0'; > >> if (!(i < n)) > >> break; > >> i++; /* use_uses_inced_iv == false */ > >> p++; /* use_after_cand_inc == false */ > >> } > >> while (1); > >> > >> but not for > >> > >> do > >> { > >> *p = '\0'; > >> i++; /* use_uses_inced_iv == true */ > >> if (!(i < n)) > >> break; > >> p++; /* use_after_cand_inc == false */ > >> } > >> while (1); > >> > >> and not for > >> > >> do > >> { > >> *p = '\0'; > >> p++; /* use_after_cand_inc == true */ > >> if (!(i < n)) > >> break; > >> i++; /* use_uses_inced_iv == false */ > >> } > >> while (1); > >> > >> In the latter 2 cases, I cannot simply replace i < n with p < base + n. > > > > Why not (other than that the value to compare with varies in these cases, > > but > > it always is "the value of p in the last iteration of the loop")? > > In the 2 latter cases, the value to compare with will be either base + n > + 1 or base + n - 1. The code does not handle these cases yet.
well, if not, then it certainly handles one of the first two cases incorrectly (since the use_uses_inced_iv test is meaningless). > > One more thing: what is fold_walk_def_plus for? > > It tries to fold a plus, and if not successful, finds ssa vars in > operands of the plus, substitutes the defining statements of ssa vars > for those ssa vars and retries folding. Sorry for not being more clear; I meant, why is it used? Zdenek