https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107608
--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Aldy Hernandez from comment #7) > (In reply to Richard Biener from comment #6) > > (In reply to Jakub Jelinek from comment #0) > > > ... but then > > > comes dom2 and happily replaces > > > _1 = 3.4028234663852885981170418348451692544e+38 * 2.0e+0; > > > return _1; > > > with > > > _1 = 3.4028234663852885981170418348451692544e+38 * 2.0e+0; > > > return Inf; > > > (I think this is still correct) > > > > Note this is also a pessimization code-generation wise since if we > > preserve the multiplication the result is readily available in a > > register but as optimized we have another constant pool entry and load. > > > > So we might want to consider not propagating constants generated by > > operations > > we cannot eliminate. If the only consumer is a compare-and-branch we > > can of course still end up with a seemingly dead stmt, so this would be only > > for the missed optimization. > > Up to y'all if this is the way to go, but here are some thoughts... > > Off the top of my head, we have VRP and DOM propagating constants. > Technically also simplify_using_ranges, but it's only called from VRP/DOM, > and it currently only works with integers, so we should be ok here. > > I think we could limit propagation in may_propagate_copy() which both VRP > and DOM gate on. VRP uses it through its use of substitute_and_fold_engine > and DOM uses it directly. Would this work? I don't think may_propagate_copy is the correct vehicle. Instead the substitute_and_fold_engine could only substitute from defs with no side-effects - IIRC it already refrains from propagating _into_ defs that will be removed after the propagation.