As several front-end people have suggested, calling fold whilst constructing parse trees shouldn't be necessary (as shown by the shining examples of g77 and GNAT).
I don't follow. GNAT certainly calls fold for every expression it makes. In reality, many of the transformations performed by fold (most? as I expect expressions with constant operands are actually fairly rare at the source level) are purely to tidy up the inefficiencies or incorrect tree representations constructed by the front-ends. I disagree. It's far better to have common code to do simplifications than to have each front end have their own set. I'm not sure I understand your point here.