http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52272
bin.cheng <amker.cheng at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amker.cheng at gmail dot com --- Comment #21 from bin.cheng <amker.cheng at gmail dot com> --- Hi Richard, I looked into PR50955 for which the mentioned commit causing this PR is applied: Commit 2012-02-06 Richard Guenther <rguent...@suse.de> PR tree-optimization/50955 * tree-ssa-loop-ivopts.c (get_computation_cost_at): Artificially raise cost of expressions that replace an address with an expression based on a different pointer. I noticed that the offending non-linear use in PR50955 is actually from memory reference. If I understand the issue correct, the whole alias issue is introduced by rewriting iv use with one base_object through candidate with another incompatible base_object, and it is related to memory reference. An genuine non-linear iv use (the pointer never de-referenced, like in this PR) won't have this issue. So I come up this idea to relax the condition: - if (address_p) + if (address_p + || (use->iv->base_object + && cand->iv->base_object + && POINTER_TYPE_P (TREE_TYPE (use->iv->base_object)) + && POINTER_TYPE_P (TREE_TYPE (cand->iv->base_object)))) { /* Do not try to express address of an object with computation based on address of a different object. This may cause problems in rtl to non-linear uses which truly occurred in memory reference, something like: - if (address_p) + if (address_p + || (use->in_mem_ref_p + && use->iv->base_object + && cand->iv->base_object + && POINTER_TYPE_P (TREE_TYPE (use->iv->base_object)) + && POINTER_TYPE_P (TREE_TYPE (cand->iv->base_object)))) { /* Do not try to express address of an object with computation based on address of a different object. This may cause problems in rtl The flag in_mem_ref_p can be set for appropriate uses when finding interesting address uses. With this change, this PR should be resolved while not violating PR50955. I am not very much into 50955, so how does this sound? I can send a patch for review if the idea is in right direction. BTW, I cannot reproduce 50955 with the reported revision of GCC. The store isn't deleted by pass_cd_dce, though it is re-written just as the PR reported. So maybe I just misunderstood something. Any words? Thanks, bin