diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index a42ef0c..0a7b7a6 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -59,6 +59,7 @@ #include "llvm/IR/IntrinsicsWebAssembly.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/MDBuilder.h" +#include "llvm/IR/MemoryModelRelaxationAnnotations.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" #include "llvm/IR/PatternMatch.h" @@ -3284,6 +3285,9 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J, case LLVMContext::MD_invariant_group: // Preserve !invariant.group in K. break; + case LLVMContext::MD_mmra: + // Combine MMRAs + break; case LLVMContext::MD_align: if (DoesKMove || !K->hasMetadata(LLVMContext::MD_noundef)) K->setMetadata( @@ -3322,6 +3326,16 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J, if (auto *JMD = J->getMetadata(LLVMContext::MD_invariant_group)) if (isa<LoadInst>(K) || isa<StoreInst>(K)) K->setMetadata(LLVMContext::MD_invariant_group, JMD); + + // Merge MMRAs. + // This is handled separately because we also want to handle cases where K + // doesn't have tags but J does. + auto JMMRA = J->getMetadata(LLVMContext::MD_mmra); + auto KMMRA = K->getMetadata(LLVMContext::MD_mmra); + if (JMMRA || KMMRA) { + K->setMetadata(LLVMContext::MD_mmra, + MMRAMetadata::combine(K->getContext(), JMMRA, KMMRA)); + } } void llvm::combineMetadataForCSE(Instruction *K, const Instruction *J, @@ -3341,7 +3355,8 @@ void llvm::combineMetadataForCSE(Instruction *K, const Instruction *J, LLVMContext::MD_preserve_access_index, LLVMContext::MD_prof, LLVMContext::MD_nontemporal, - LLVMContext::MD_noundef}; + LLVMContext::MD_noundef, + LLVMContext::MD_mmra}; combineMetadata(K, J, KnownIDs, KDominatesJ); } |