https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91137
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- I think the issue is inv_expr 5: ((signed long) &d + 19600) - (signed long) &c I hope Bin can investigate this. In the end we can only fight the RTL alias analysis issue with heuristics here though... We're fearing compile-time issues from a fix like the following, but ultimatively find_base_term is known broken for a _looooong_ time. Index: gcc/alias.c =================================================================== --- gcc/alias.c (revision 273355) +++ gcc/alias.c (working copy) @@ -2003,16 +2003,20 @@ find_base_term (rtx x, vec<std::pair<cse 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. */ - rtx base = find_base_term (tmp1, visited_vals); - if (base != NULL_RTX - && ((REG_P (tmp1) && REG_POINTER (tmp1)) - || known_base_value_p (base))) - return base; - base = find_base_term (tmp2, visited_vals); - if (base != NULL_RTX - && ((REG_P (tmp2) && REG_POINTER (tmp2)) - || known_base_value_p (base))) - return base; + rtx base1 = find_base_term (tmp1, visited_vals); + if (!(base1 != NULL_RTX + && ((REG_P (tmp1) && REG_POINTER (tmp1)) + || known_base_value_p (base1)))) + base1 = NULL_RTX; + rtx base2 = find_base_term (tmp2, visited_vals); + if (!(base2 != NULL_RTX + && ((REG_P (tmp2) && REG_POINTER (tmp2)) + || known_base_value_p (base2)))) + base2 = NULL_RTX; + if (base1 && !base2) + return base1; + if (!base1 && base2) + return base2; /* We could not determine which of the two operands was the base register and which was the index. So we can determine