https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121492
--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Created attachment 62359 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62359&action=edit With this additional change pre and lim can do the movement This changes: ``` a1 = VIEW_CONVERT_EXPR<union A>(_2); ``` to be ``` VIEW_CONVERT_EXPR<float>(a1) = _2; ``` And now both LIM and PRE is able to handle this better. LIM: ``` <bb 3> [local count: 1063004408]: # a1_lsm.3_8 = PHI <_2(3), a_6(D)(2)> # ivtmp_3 = PHI <ivtmp_10(3), 100(2)> _2 = a_6(D) + a1_lsm.3_8; ivtmp_10 = ivtmp_3 + 4294967295; if (ivtmp_10 != 0) goto <bb 3>; [98.99%] else goto <bb 4>; [1.01%] ``` LIM disabled: ``` <bb 3> [local count: 1063004408]: # prephitmp_8 = PHI <_2(3), a_6(D)(2)> # ivtmp_16 = PHI <ivtmp_1(3), 100(2)> _2 = a_6(D) + prephitmp_8; ivtmp_1 = ivtmp_16 + 4294967295; if (ivtmp_1 != 0) goto <bb 3>; [98.99%] else goto <bb 4>; [1.01%] ```