diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2025-04-01 07:34:31 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-01 07:34:31 +0700 |
commit | f77f2b9c566858b3c6605ab02f4bbd56000f732f (patch) | |
tree | 73cc36e3cce650c7700afed613462f1fc945a7d3 /llvm/lib/IR/Attributes.cpp | |
parent | 0248d277cabab370b48114cc62aff393b273971b (diff) | |
download | llvm-f77f2b9c566858b3c6605ab02f4bbd56000f732f.zip llvm-f77f2b9c566858b3c6605ab02f4bbd56000f732f.tar.gz llvm-f77f2b9c566858b3c6605ab02f4bbd56000f732f.tar.bz2 |
llvm-reduce: Try to preserve instruction metadata as argument attributes (#133557)
Fixes #131825
Diffstat (limited to 'llvm/lib/IR/Attributes.cpp')
-rw-r--r-- | llvm/lib/IR/Attributes.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp index 8da1dfe..8cb8b0d 100644 --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/lib/IR/Attributes.cpp @@ -2291,6 +2291,38 @@ AttrBuilder &AttrBuilder::addInitializesAttr(const ConstantRangeList &CRL) { return addConstantRangeListAttr(Attribute::Initializes, CRL.rangesRef()); } +AttrBuilder &AttrBuilder::addFromEquivalentMetadata(const Instruction &I) { + if (const MDNode *NonNull = I.getMetadata(LLVMContext::MD_nonnull)) + addAttribute(Attribute::NonNull); + + if (const MDNode *NoUndef = I.getMetadata(LLVMContext::MD_noundef)) + addAttribute(Attribute::NoUndef); + + if (const MDNode *Align = I.getMetadata(LLVMContext::MD_align)) { + ConstantInt *CI = mdconst::extract<ConstantInt>(Align->getOperand(0)); + addAlignmentAttr(CI->getZExtValue()); + } + + if (const MDNode *Dereferenceable = + I.getMetadata(LLVMContext::MD_dereferenceable)) { + ConstantInt *CI = + mdconst::extract<ConstantInt>(Dereferenceable->getOperand(0)); + addDereferenceableAttr(CI->getZExtValue()); + } + + if (const MDNode *DereferenceableOrNull = + I.getMetadata(LLVMContext::MD_dereferenceable_or_null)) { + ConstantInt *CI = + mdconst::extract<ConstantInt>(DereferenceableOrNull->getOperand(0)); + addDereferenceableAttr(CI->getZExtValue()); + } + + if (const MDNode *Range = I.getMetadata(LLVMContext::MD_range)) + addRangeAttr(getConstantRangeFromMetadata(*Range)); + + return *this; +} + AttrBuilder &AttrBuilder::merge(const AttrBuilder &B) { // TODO: Could make this O(n) as we're merging two sorted lists. for (const auto &I : B.attrs()) |