I've noticed a few things in doing the above. GCC 4.x doesn't seems to do CSE on addresses. Because the VAX binutils doesn't support non-local symbols with a non-zero addend in the GOT, PIC will do a define_expand so that (const (plus (symbol_ref) (const_int))) will be split into separate instructions. However, gcc doesn't seem to be able to take advantage of that. For instance, gcc emits:
File a PR, CC me and ping me when your patches are in. I can take a look and see whether it's the responsibility of the VAX backend to provide more correct costs, or whether fwprop could do something it's not doing. Paolo