From 68f195cc50a8b7722004c8f3ca3dcf624b524552 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Fri, 4 Sep 2009 21:32:05 +0000 Subject: [PATCH] While replacing an MDNode elment, properly update MDNode's operand list. MDNode's operand list does not include all elements. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81045 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/LLVMContext.cpp | 7 +- lib/VMCore/Metadata.cpp | 24 ++ .../Transforms/GlobalDCE/2009-09-03-MDNode.ll | 264 ++++++++++++++++++ 3 files changed, 292 insertions(+), 3 deletions(-) create mode 100644 test/Transforms/GlobalDCE/2009-09-03-MDNode.ll diff --git a/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp index 887679e08d3..7d233d99216 100644 --- a/lib/VMCore/LLVMContext.cpp +++ b/lib/VMCore/LLVMContext.cpp @@ -62,9 +62,10 @@ bool LLVMContext::RemoveDeadMetadata() { return Changed; while (!DeadMDNodes.empty()) { - const MDNode *N = cast(DeadMDNodes.back()); DeadMDNodes.pop_back(); - if (N->use_empty()) - delete N; + Value *V = DeadMDNodes.back(); DeadMDNodes.pop_back(); + if (const MDNode *N = dyn_cast_or_null(V)) + if (N->use_empty()) + delete N; } } return Changed; diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index bf845eb5422..8e025b6d7a2 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -72,6 +72,9 @@ MDNode::MDNode(LLVMContext &C, Value*const* Vals, unsigned NumVals) // Only record metadata uses. if (MetadataBase *MB = dyn_cast_or_null(Vals[i])) OperandList[NumOperands++] = MB; + else if(Vals[i] && + Vals[i]->getType()->getTypeID() == Type::MetadataTyID) + OperandList[NumOperands++] = Vals[i]; Node.push_back(ElementVH(Vals[i], this)); } } @@ -144,6 +147,27 @@ void MDNode::replaceElement(Value *From, Value *To) { pImpl->MDNodeSet.RemoveNode(this); } + // MDNode only lists metadata elements in operand list, because MDNode + // used by MDNode is considered a valid use. However on the side, MDNode + // using a non-metadata value is not considered a "use" of non-metadata + // value. + SmallVector OpIndexes; + unsigned OpIndex = 0; + for (User::op_iterator OI = op_begin(), OE = op_end(); + OI != OE; ++OI, OpIndex++) { + if (*OI == From) + OpIndexes.push_back(OpIndex); + } + if (MetadataBase *MDTo = dyn_cast_or_null(To)) { + for (SmallVector::iterator OI = OpIndexes.begin(), + OE = OpIndexes.end(); OI != OE; ++OI) + setOperand(*OI, MDTo); + } else { + for (SmallVector::iterator OI = OpIndexes.begin(), + OE = OpIndexes.end(); OI != OE; ++OI) + setOperand(*OI, 0); + } + // Replace From element(s) in place. for (SmallVector::iterator I = Indexes.begin(), E = Indexes.end(); I != E; ++I) { diff --git a/test/Transforms/GlobalDCE/2009-09-03-MDNode.ll b/test/Transforms/GlobalDCE/2009-09-03-MDNode.ll new file mode 100644 index 00000000000..79930272f9b --- /dev/null +++ b/test/Transforms/GlobalDCE/2009-09-03-MDNode.ll @@ -0,0 +1,264 @@ +; RUN: llvm-as < %s | opt -globaldce | llc -O0 -o /dev/null + +%struct..0__pthread_mutex_s = type { i32, i32, i32, i32, i32, i32, %struct.__pthread_list_t } +%"struct.__gnu_cxx::_ConvertibleConcept" = type { i32 } +%struct.__pthread_list_t = type { %struct.__pthread_list_t*, %struct.__pthread_list_t* } +%struct.pthread_attr_t = type { i64, [48 x i8] } +%struct.pthread_mutex_t = type { %struct..0__pthread_mutex_s } + +@_ZL20__gthrw_pthread_oncePiPFvvE = alias weak i32 (i32*, void ()*)* @pthread_once ; [#uses=0] +@_ZL27__gthrw_pthread_getspecificj = alias weak i8* (i32)* @pthread_getspecific ; [#uses=0] +@_ZL27__gthrw_pthread_setspecificjPKv = alias weak i32 (i32, i8*)* @pthread_setspecific ; [#uses=0] +@_ZL22__gthrw_pthread_createPmPK14pthread_attr_tPFPvS3_ES3_ = alias weak i32 (i64*, %struct.pthread_attr_t*, i8* (i8*)*, i8*)* @pthread_create ; [#uses=0] +@_ZL22__gthrw_pthread_cancelm = alias weak i32 (i64)* @pthread_cancel ; [#uses=0] +@_ZL26__gthrw_pthread_mutex_lockP15pthread_mutex_t = alias weak i32 (%struct.pthread_mutex_t*)* @pthread_mutex_lock ; [#uses=0] +@_ZL29__gthrw_pthread_mutex_trylockP15pthread_mutex_t = alias weak i32 (%struct.pthread_mutex_t*)* @pthread_mutex_trylock ; [#uses=0] +@_ZL28__gthrw_pthread_mutex_unlockP15pthread_mutex_t = alias weak i32 (%struct.pthread_mutex_t*)* @pthread_mutex_unlock ; [#uses=0] +@_ZL26__gthrw_pthread_mutex_initP15pthread_mutex_tPK19pthread_mutexattr_t = alias weak i32 (%struct.pthread_mutex_t*, %"struct.__gnu_cxx::_ConvertibleConcept"*)* @pthread_mutex_init ; "*)*> [#uses=0] +@_ZL26__gthrw_pthread_key_createPjPFvPvE = alias weak i32 (i32*, void (i8*)*)* @pthread_key_create ; [#uses=0] +@_ZL26__gthrw_pthread_key_deletej = alias weak i32 (i32)* @pthread_key_delete ; [#uses=0] +@_ZL30__gthrw_pthread_mutexattr_initP19pthread_mutexattr_t = alias weak i32 (%"struct.__gnu_cxx::_ConvertibleConcept"*)* @pthread_mutexattr_init ; "*)*> [#uses=0] +@_ZL33__gthrw_pthread_mutexattr_settypeP19pthread_mutexattr_ti = alias weak i32 (%"struct.__gnu_cxx::_ConvertibleConcept"*, i32)* @pthread_mutexattr_settype ; "*, i32)*> [#uses=0] +@_ZL33__gthrw_pthread_mutexattr_destroyP19pthread_mutexattr_t = alias weak i32 (%"struct.__gnu_cxx::_ConvertibleConcept"*)* @pthread_mutexattr_destroy ; "*)*> [#uses=0] + +define weak void @_ZN9__gnu_cxx26__aux_require_boolean_exprIbEEvRKT_(i8* %__t) { +entry: + tail call void @llvm.dbg.func.start(metadata !0) + tail call void @llvm.dbg.stoppoint(i32 240, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !0) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_19_ConvertibleConceptIjjEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !8) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !8) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPcEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !11) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !11) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPKcEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !12) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !12) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPwEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !13) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !13) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPKwEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !14) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !14) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIPwEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !15) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !15) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIPcEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !16) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !16) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIiEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !17) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !17) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIlEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !18) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !18) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIxEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !19) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !19) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIjEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !20) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !20) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_22_OutputIteratorConceptISt19ostreambuf_iteratorIcSt11char_traitsIcEEcEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !21) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !21) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_22_OutputIteratorConceptISt19ostreambuf_iteratorIwSt11char_traitsIwEEwEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !22) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !22) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPcEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !23) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !23) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPKcEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !24) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !24) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPKcSsEEEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !25) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !25) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPcSsEEEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !26) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !26) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEEEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !27) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !27) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPwSbIwSt11char_traitsIwESaIwEEEEEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !28) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !28) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPwEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !29) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !29) + ret void +} + +define weak void @_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPKwEEEEvv() { +entry: + tail call void @llvm.dbg.func.start(metadata !30) + tail call void @llvm.dbg.stoppoint(i32 63, i32 0, metadata !2) + tail call void @llvm.dbg.region.end(metadata !30) + ret void +} + +declare void @llvm.dbg.func.start(metadata) nounwind readnone + +declare void @llvm.dbg.stoppoint(i32, i32, metadata) nounwind readnone + +declare void @llvm.dbg.region.end(metadata) nounwind readnone + +declare extern_weak i32 @pthread_once(i32*, void ()*) + +declare extern_weak i8* @pthread_getspecific(i32) + +declare extern_weak i32 @pthread_setspecific(i32, i8*) + +declare extern_weak i32 @pthread_create(i64*, %struct.pthread_attr_t*, i8* (i8*)*, i8*) + +declare extern_weak i32 @pthread_cancel(i64) + +declare extern_weak i32 @pthread_mutex_lock(%struct.pthread_mutex_t*) + +declare extern_weak i32 @pthread_mutex_trylock(%struct.pthread_mutex_t*) + +declare extern_weak i32 @pthread_mutex_unlock(%struct.pthread_mutex_t*) + +declare extern_weak i32 @pthread_mutex_init(%struct.pthread_mutex_t*, %"struct.__gnu_cxx::_ConvertibleConcept"*) + +declare extern_weak i32 @pthread_key_create(i32*, void (i8*)*) + +declare extern_weak i32 @pthread_key_delete(i32) + +declare extern_weak i32 @pthread_mutexattr_init(%"struct.__gnu_cxx::_ConvertibleConcept"*) + +declare extern_weak i32 @pthread_mutexattr_settype(%"struct.__gnu_cxx::_ConvertibleConcept"*, i32) + +declare extern_weak i32 @pthread_mutexattr_destroy(%"struct.__gnu_cxx::_ConvertibleConcept"*) + +!0 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__aux_require_boolean_expr", metadata !"__aux_require_boolean_expr", metadata !"_ZN9__gnu_cxx26__aux_require_boolean_exprIbEEvRKT_", metadata !2, i32 239, metadata !3, i1 false, i1 true} +!1 = metadata !{i32 458769, i32 0, i32 4, metadata !"concept-inst.cc", metadata !"/home/buildbot/buildslave/llvm-x86_64-linux-selfhost/llvm-gcc.obj/x86_64-unknown-linux-gnu/libstdc++-v3/src/../../../../llvm-gcc.src/libstdc++-v3/src", metadata !"4.2.1 (Based on Apple Inc. build 5649) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} +!2 = metadata !{i32 458769, i32 0, i32 4, metadata !"boost_concept_check.h", metadata !"/home/buildbot/buildslave/llvm-x86_64-linux-selfhost/llvm-gcc.obj/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits", metadata !"4.2.1 (Based on Apple Inc. build 5649) (LLVM build)", i1 false, i1 true, metadata !"", i32 0} +!3 = metadata !{i32 458773, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0} +!4 = metadata !{null, metadata !5} +!5 = metadata !{i32 458768, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !6} +!6 = metadata !{i32 458790, metadata !1, metadata !"", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, metadata !7} +!7 = metadata !{i32 458788, metadata !1, metadata !"bool", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} +!8 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_ConvertibleConcept >", metadata !"__function_requires<__gnu_cxx::_ConvertibleConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_19_ConvertibleConceptIjjEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!9 = metadata !{i32 458773, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0} +!10 = metadata !{null} +!11 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPcEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!12 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPKcEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!13 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPwEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!14 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_InputIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_21_InputIteratorConceptIPKwEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!15 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIPwEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!16 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIPcEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!17 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIiEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!18 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIlEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!19 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIxEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!20 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"__function_requires<__gnu_cxx::_LessThanComparableConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_26_LessThanComparableConceptIjEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!21 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_OutputIteratorConcept >, char> >", metadata !"__function_requires<__gnu_cxx::_OutputIteratorConcept >, char> >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_22_OutputIteratorConceptISt19ostreambuf_iteratorIcSt11char_traitsIcEEcEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!22 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_OutputIteratorConcept >, wchar_t> >", metadata !"__function_requires<__gnu_cxx::_OutputIteratorConcept >, wchar_t> >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_22_OutputIteratorConceptISt19ostreambuf_iteratorIwSt11char_traitsIwEEwEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!23 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPcEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!24 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPKcEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!25 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPKcSsEEEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!26 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPcSsEEEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!27 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEEEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!28 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator, std::allocator > > > >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptINS_17__normal_iteratorIPwSbIwSt11char_traitsIwESaIwEEEEEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!29 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPwEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true} +!30 = metadata !{i32 458798, i32 0, metadata !1, metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"__function_requires<__gnu_cxx::_RandomAccessIteratorConcept >", metadata !"_ZN9__gnu_cxx19__function_requiresINS_28_RandomAccessIteratorConceptIPKwEEEEvv", metadata !2, i32 61, metadata !9, i1 false, i1 true}