SelectionDAG currently misses opportunities to fold constants into GlobalAddresses in several areas. For example, given (add (add GA, c1), y), it often reassociates to (add (add GA, y), c1), missing the opportunity to create (add GA+c, y). This isn't often visible on targets such as X86 which effectively reassociate adds in their complex address-mode folding logic, however it is currently visible on WebAssembly since it currently has very simple address mode folding code that doesn't reassociate anything.
The attached patch fixes this by making SelectionDAG fold offsets into GlobalAddresses at the same times that it folds constants together, so that it doesn't miss any opportunities to perform such folding.