https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72103
Alan Modra <amodra at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-07-26 CC| |amodra at gmail dot com Ever confirmed|0 |1 --- Comment #2 from Alan Modra <amodra at gmail dot com> --- So, we are dealing with reloads for this insn: (insn 488 206 406 31 (set (reg:DI 317) (unspec:DI [ (fix:SI (reg:DF 105 28 [orig:173 _34 ] [173])) ] UNSPEC_FCTIWZ)) /home/alan/src/tmp/pr72103.ii:47 373 {fctiwz_df} (nil)) First call to push_secondary_reload results in a call to our target function: rs6000_secondary_reload (in_p=false, x=0x7ffff6710c30, rclass_i=5, mode=DImode, sri=0x7fffffffc900) at /home/alan/src/gcc-virgin/gcc/config/rs6000/rs6000.c:19408 x is (mem/c:DI (plus:DI (reg/f:DI 1 1) (const_int 80 [0x50])) [6 %sfp+80 S8 A64]) rclass is VSX_REGS returns FLOAT_REGS and sri = {icode = 0, extra_cost = 0, prev_sri = 0x0, t_icode = 1} Note the uninitialised t_icode field Because we return something other than NO_REGS, we recurse into push_secondaray_reload with the second call to our target function: rs6000_secondary_reload (in_p=false, x=0x7ffff6710c30, rclass_i=3, mode=DImode, sri=0x7fffffffc820) at /home/alan/src/gcc-virgin/gcc/config/rs6000/rs6000.c:19408 x as before and rclass of course is FLOAT_REGS This time we fall into default_secondary_reload where we hit this code if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing) { sri->icode = sri->prev_sri->t_icode; return NO_REGS; } which copies the uninitialized t_icode field. It seems that only default_secondary_reload sets sri->t_icode, in other words we are only good to call default_secondary_reload on the recursive call if default_secondary_reload was called on the first call. "Obvious" fix then is to add this to rs6000_secondary_reload sri->t_icode = CODE_FOR_nothing; and indeed this cures the ICE. We probably should do this just to harden rs6000_secondary_reload.