On Thu, Apr 4, 2013 at 3:33 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote: > Hi Richard, > > You slightly change behavior of find_base_term, namely before your fix we > have the following code: > > if (REG_P (tmp1) && REG_POINTER (tmp1)) > { > rtx base = find_base_term (tmp1); > if (base) > return base; > } > > but in your fix you added the following checks on base: > > tmp1 = find_base_term (tmp1); > if (tmp1 != NULL_RTX > && ((REG_P (tmp1) && REG_POINTER (tmp1)) > || known_base_value_p (tmp1))) > return tmp1; > Why you added these checks since function arguments may not considered as > bases.
If you continue down the original function there is (quoted fully) /* If either operand is known to be a pointer, then use it to determine the base term. */ if (REG_P (tmp1) && REG_POINTER (tmp1)) { rtx base = find_base_term (tmp1); if (base) return base; } if (REG_P (tmp2) && REG_POINTER (tmp2)) { rtx base = find_base_term (tmp2); if (base) return base; } /* Neither operand was known to be a pointer. Go ahead and find the base term for both operands. */ tmp1 = find_base_term (tmp1); tmp2 = find_base_term (tmp2); so we call find_base_term on tmp1 anyway, and after the modification tmp1 = find_base_term (tmp1); if (tmp1 != NULL_RTX && ((REG_P (tmp1) && REG_POINTER (tmp1)) || known_base_value_p (tmp1))) return tmp1; we take it if it is non-NULL and ... ah, I see. We now check REG_P/REG_POINTER on the new value. That was indeed unintended. I'll fix it like below. Richard. 2013-04-04 Richard Biener <rguent...@suse.de> * alias.c (find_base_term): Fix thinko in previous change. Index: gcc/alias.c =================================================================== --- gcc/alias.c (revision 197480) +++ gcc/alias.c (working copy) @@ -1687,16 +1687,16 @@ find_base_term (rtx x) term is from a pointer or is a named object or a special address (like an argument or stack reference), then use it for the base term. */ - tmp1 = find_base_term (tmp1); - if (tmp1 != NULL_RTX + rtx base = find_base_term (tmp1); + if (base != NULL_RTX && ((REG_P (tmp1) && REG_POINTER (tmp1)) - || known_base_value_p (tmp1))) - return tmp1; - tmp2 = find_base_term (tmp2); - if (tmp2 != NULL_RTX + || known_base_value_p (base))) + return base; + base = find_base_term (tmp2); + if (base != NULL_RTX && ((REG_P (tmp2) && REG_POINTER (tmp2)) - || known_base_value_p (tmp2))) - return tmp2; + || known_base_value_p (base))) + return base; /* We could not determine which of the two operands was the base register and which was the index. So we can determine