Hi, > I'm investigating an ICE in loop-iv.c:get_biv_step(). I hope you can shed > some light on what the correct fix would be. > > The ICE happens when processing: > == > (insn 111 (set (reg:SI 304) > (plus (subreg:SI (reg:DI 251) 4) > (const_int 1)))) > > (insn 177 (set (subreg:SI (reg:DI 251)) > (reg:SI 304))) > == > > The code like the above does not occur on current mainline early enough for > loop-iv.c to catch it. The subregs above are produced by Tom's (CC'ed) > extension elimination pass (scheduled before fwprop1) which is not in > mainline yet [*]. > > The failure is due to assert in loop-iv.c:get_biv_step(): > == > gcc_assert ((*inner_mode == *outer_mode) != (*extend != UNKNOWN)); > == > i.e., inner and outer modes can differ iff there's an extend in the chain. > > Get_biv_step_1() starts with insn 177, then gets to insn 111, then loops back > to insn 177 at which point it stops and returns GRD_MAYBE_BIV and sets: > > * outer_mode == DImode == natural mode of (reg A); > > * inner_mode == SImode == mode of (subreg (reg A)), set in get_biv_step_1: > == > if (GET_CODE (next) == SUBREG) > { > enum machine_mode amode = GET_MODE (next); > > if (GET_MODE_SIZE (amode) > GET_MODE_SIZE (*inner_mode)) > return false; > > *inner_mode = amode; > *inner_step = simplify_gen_binary (PLUS, outer_mode, > *inner_step, *outer_step); > *outer_step = const0_rtx; > *extend = UNKNOWN; > } > == > > * extend == UNKNOWN as there are no extensions in the chain. > > It seems to me that computations of outer_mode and extend are correct, I'm > not sure about inner_mode. > > Zdenek, what do you think is the right way to handle the above case in loop > analysis?
loop iv analysis currently does not handle assignments to subregs; we test for that in iv_get_reaching_def, but the corresponding test is missing in latch_dominating_def. I.e., a simple fix is to add if (single_rd && (DF_REF_FLAGS (single_rd) & DF_REF_READ_WRITE)) return false; at the end of latch_dominating_def. On the other hand, this means that the loops using the code like above will not get optimized. So, if such a code gets produced consistently for a large fraction of the loops, it would be necessary to teach loop-iv to analyze induction variables represented in subregs. This would mean a more involved rewrite of loop-iv, though, Zdenek