https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71437
--- Comment #8 from amker at gcc dot gnu.org --- (In reply to amker from comment #7) > I think it's not PRE's fault. The input to PRE is already sub-optimal to be > handled. > Look at the source code: > > for( i = 0 ; i < ( I - 1 ) ; i++ ) > { > if( ( L < pL[i+1] ) && ( L >= pL[i] ) ) > break ; > } > > if( i == ( I - 1 ) ) > L = pL[i] ; > LD = (float)( L - pL[i] ) / > (float)( pL[i + 1] - pL[i] ) ; > > Following path from the "break" statement, we know i < (I - 1) must be > satisfied, so control flow can go from "break" directly to assignment to LD. > This is the case before the change. > After r235817, all paths from the loop (including the break edge) go to if > (i == ( I - 1) ) statement. Because in if-then branch, L was assigned, and > we don't know if pL[i] is modified or not by this assignment by aliasing > rule, there is no redundancy for load of pL[i]. And maybe that's why -fwhole-program is helpful, because we know L and pL don't alias with each other.