aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Attributes.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2025-04-01 07:34:31 +0700
committerGitHub <noreply@github.com>2025-04-01 07:34:31 +0700
commitf77f2b9c566858b3c6605ab02f4bbd56000f732f (patch)
tree73cc36e3cce650c7700afed613462f1fc945a7d3 /llvm/lib/IR/Attributes.cpp
parent0248d277cabab370b48114cc62aff393b273971b (diff)
downloadllvm-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.cpp32
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())