https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89546
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The gimple dumps aren't exactly readable with so many different tuple/type etc. types, where it is unclear what exact offset is something being stored at. That said, in cplxlower1 I still see a possibility to get there the desired value of 2: MEM[(struct tupleD.7416 &)&merged2D.7477 + 4].headD.7482.payloadD.6716 = 2; ... D.9878.headD.7889 = MEM[(const struct type_nD.6356 &)&merged2D.7477 + 4]; MEM[(struct &)&D.9880] ={v} {CLOBBER}; D.9880.headD.7099 = MEM[(const struct type_nD.6356 &)&D.9878]; D.9878 ={v} {CLOBBER}; MEM[(struct tupleD.6387 *)&D.9880 + 4B] = 4; D.9881 = D.9880; MEM[(struct &)&D.9874] ={v} {CLOBBER}; D.9874.headD.7096 = MEM[(const struct type_nD.6355 &)&merged2D.7477 + 8]; D.9874.tailD.7097 = D.9881; D.9881 ={v} {CLOBBER}; D.9880 ={v} {CLOBBER}; D.9873 = D.9874; MEM[(struct &)&D.9865] ={v} {CLOBBER}; D.9865.tailD.7802 = D.9873; D.9873 ={v} {CLOBBER}; D.9874 ={v} {CLOBBER}; D.9875 ={v} {CLOBBER}; D.9868 = MEM[(const struct tupleD.6387 &)&D.9865 + 8]; D.9869.tailD.8063 = D.9868; SR.34_37 = MEM[(struct tupleD.6387 *)&D.9868 + 4B]; D.9868 ={v} {CLOBBER}; MEM[(struct &)&D.9870] ={v} {CLOBBER}; D.9870.headD.7099 = MEM[(const struct type_nD.6356 &)&D.9869 + 4]; MEM[(struct &)&n1D.7646] ={v} {CLOBBER}; MEM[(struct tupleD.6387 *)&D.9870 + 4B] = SR.34_37; n1D.7646.tailD.7097 = D.9870; D.9870 ={v} {CLOBBER}; D.9869 ={v} {CLOBBER}; D.9865 ={v} {CLOBBER}; _2 = n1D.7646.tailD.7097.headD.7099.payloadD.6716; if (_2 != 2) But in the sra pass dump that possibility is gone: MEM[(struct &)&n1D.7646] ={v} {CLOBBER}; SR.41_6 = SR.34_37; MEM[(struct tupleD.6387 *)&n1D.7646 + 8B] = SR.41_6; n1$tail$head$payload_90 = MEM[(struct tupleD.6387 *)&n1D.7646 + 4B]; ... _2 = n1$tail$head$payload_90; if (_2 != 2)