Hi! This is something I've introduced through cselib_subst_to_values substing ENTRY_VALUE to corresponding VALUE and have been fixing already in the * var-tracking.c (replace_expr_with_values): Return NULL for ENTRY_VALUE too. hunk. Apparently there are other 3 places where it needs to be handled similarly. If a MEM has ENTRY_VALUE address, equating of cselib_lookup on the ENTRY_VALUE and cselib_subst_to_values of it (which returns the same thing) results in set_slot_part ICEs. Fixed by not doing that for ENTRY_VALUEs, like it isn't done e.g. for REGs which have the same problem.
Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk as obvious. 2011-06-01 Jakub Jelinek <ja...@redhat.com> PR debug/49250 * var-tracking.c (add_uses, add_stores): Don't call cselib_subst_to_values on ENTRY_VALUE. --- gcc/var-tracking.c.jj 2011-06-01 10:51:30.000000000 +0200 +++ gcc/var-tracking.c 2011-06-01 18:59:15.000000000 +0200 @@ -5052,6 +5052,7 @@ add_uses (rtx *ploc, void *data) if (MEM_P (vloc) && !REG_P (XEXP (vloc, 0)) && !MEM_P (XEXP (vloc, 0)) + && GET_CODE (XEXP (vloc, 0)) != ENTRY_VALUE && (GET_CODE (XEXP (vloc, 0)) != PLUS || XEXP (XEXP (vloc, 0), 0) != cfa_base_rtx || !CONST_INT_P (XEXP (XEXP (vloc, 0), 1)))) @@ -5130,6 +5131,7 @@ add_uses (rtx *ploc, void *data) if (MEM_P (oloc) && !REG_P (XEXP (oloc, 0)) && !MEM_P (XEXP (oloc, 0)) + && GET_CODE (XEXP (oloc, 0)) != ENTRY_VALUE && (GET_CODE (XEXP (oloc, 0)) != PLUS || XEXP (XEXP (oloc, 0), 0) != cfa_base_rtx || !CONST_INT_P (XEXP (XEXP (oloc, 0), 1)))) @@ -5383,6 +5385,7 @@ add_stores (rtx loc, const_rtx expr, voi if (MEM_P (loc) && type == MO_VAL_SET && !REG_P (XEXP (loc, 0)) && !MEM_P (XEXP (loc, 0)) + && GET_CODE (XEXP (loc, 0)) != ENTRY_VALUE && (GET_CODE (XEXP (loc, 0)) != PLUS || XEXP (XEXP (loc, 0), 0) != cfa_base_rtx || !CONST_INT_P (XEXP (XEXP (loc, 0), 1)))) Jakub