How to eliminate duplicated load/store IR in LLVM?

We are writing a binary translator with LLVM. There are a lot of duplicated load/store IR instruction generated by our binary translator.
Is there any kind of optimization pass which can eliminate those duplicated load/store instruction? We know that this kind of optimization can be harmful under some circumstances such as multi-threading, but it’s safe in our model.

Bin LI,
State Key Laboratory of Computer Architecture,
Institute of Computing Technology of Chinese Academy of Sciences,
Address: NO.6 Kexueyuan South Road, Haidian District, Beijing, China

Depending on the situation, you either want to use mem2reg or GVN.

We are able to optimize stack memory multi-load/store and constant global variable multi-load with O3 optimization, but we cannot optimize ordinary global variable multi-load/store. mem2reg and gvn optimizations are already included in O3 option.
Is there anything we missed?