Author: Nikita Popov Date: 2021-01-23T22:40:32+01:00 New Revision: c83cff45c7a58010e65270d3f5bfb8c9a72ad832
URL: https://github.com/llvm/llvm-project/commit/c83cff45c7a58010e65270d3f5bfb8c9a72ad832 DIFF: https://github.com/llvm/llvm-project/commit/c83cff45c7a58010e65270d3f5bfb8c9a72ad832.diff LOG: [IR] Add NoAliasScopeDeclInst (NFC) Add an intrinsic type class to represent the llvm.experimental.noalias.scope.decl intrinsic, to make code working with it a bit nicer by hiding the metadata extraction from view. Added: Modified: llvm/include/llvm/IR/IntrinsicInst.h llvm/lib/Transforms/Utils/InlineFunction.cpp llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp llvm/lib/Transforms/Vectorize/LoopVectorize.cpp Removed: ################################################################################ diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h index 52504582dd1d..12c464f8b8ba 100644 --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -989,6 +989,24 @@ class PseudoProbeInst : public IntrinsicInst { return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1))); } }; + +class NoAliasScopeDeclInst : public IntrinsicInst { +public: + static bool classof(const IntrinsicInst *I) { + return I->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl; + } + + static bool classof(const Value *V) { + return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); + } + + MDNode *getScopeList() const { + auto *MV = + cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg)); + return cast<MDNode>(MV->getMetadata()); + } +}; + } // end namespace llvm #endif // LLVM_IR_INTRINSICINST_H diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index abdd2b2361b7..2f8f3666d396 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -859,13 +859,8 @@ ScopedAliasMetadataDeepCloner::ScopedAliasMetadataDeepCloner( MD.insert(M); // We also need to clone the metadata in noalias intrinsics. - if (const auto *II = dyn_cast<IntrinsicInst>(&I)) - if (II->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl) - if (const auto *M = dyn_cast<MDNode>( - cast<MetadataAsValue>( - II->getOperand(Intrinsic::NoAliasScopeDeclScopeArg)) - ->getMetadata())) - MD.insert(M); + if (const auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I)) + MD.insert(Decl->getScopeList()); } } addRecursiveMetadataUses(); @@ -932,14 +927,11 @@ void ScopedAliasMetadataDeepCloner::remap(ValueToValueMapTy &VMap) { if (MDNode *M = I->getMetadata(LLVMContext::MD_noalias)) I->setMetadata(LLVMContext::MD_noalias, MDMap[M]); - if (auto *II = dyn_cast<IntrinsicInst>(I)) - if (II->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl) { - auto *MV = cast<MetadataAsValue>( - II->getOperand(Intrinsic::NoAliasScopeDeclScopeArg)); - auto *NewMV = MetadataAsValue::get( - II->getContext(), MDMap[cast<MDNode>(MV->getMetadata())]); - II->setOperand(Intrinsic::NoAliasScopeDeclScopeArg, NewMV); - } + if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(I)) { + auto *NewMV = + MetadataAsValue::get(Decl->getContext(), MDMap[Decl->getScopeList()]); + Decl->setOperand(Intrinsic::NoAliasScopeDeclScopeArg, NewMV); + } } } diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp index 2b873954f88b..2ab0848193f6 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp @@ -947,9 +947,8 @@ bool LoopVectorizationLegality::blockCanBePredicated( // Do not let llvm.experimental.noalias.scope.decl block the vectorization. // TODO: there might be cases that it should block the vectorization. Let's // ignore those for now. - if (match(&I, m_Intrinsic<Intrinsic::experimental_noalias_scope_decl>())) { + if (isa<NoAliasScopeDeclInst>(&I)) continue; - } // We might be able to hoist the load. if (I.mayReadFromMemory()) { diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 9e157f3061b6..9373d40458f4 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2882,10 +2882,9 @@ void InnerLoopVectorizer::scalarizeInstruction(Instruction *Instr, VPUser &User, // llvm.experimental.noalias.scope.decl intrinsics must only be duplicated for // the first lane and part. - if (auto *II = dyn_cast<IntrinsicInst>(Instr)) + if (isa<NoAliasScopeDeclInst>(Instr)) if (Instance.Lane != 0 || Instance.Part != 0) - if (II->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl) - return; + return; setDebugLocFromInst(Builder, Instr); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits