Issue 174001
Summary [OpenMP] Slow compile of OpenMPDecompositionTest.cpp
Labels openmp, slow-compile
Assignees
Reporter aengelke
    OpenMPDecompositionTest.cpp is regularly one of the slowest files when building LLVM, often in the range of 30-90s. The visitor pattern results in types (>10 kB!) like the following, which cause many template instantiations and many IR functions need to be generated/optimized out again. The recursion depth is way over 100. Is there any way to write this test without such heavy reliance on templates?

```c++
std::__detail::__variant::_Variant_storage<false, tomp::clause::AcqRelT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AcquireT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CaptureT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CompareT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::FullT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InbranchT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::MergeableT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NogroupT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NoOpenmpConstructsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NoOpenmpRoutinesT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NoOpenmpT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NoParallelismT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NotinbranchT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NowaitT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ReadT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::RelaxedT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ReleaseT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SeqCstT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SimdT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ThreadsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UnknownT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UntiedT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UseT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::WeakT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::WriteT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::OmpxAttributeT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::OmpxBareT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::OmpxDynCgroupMemT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AdjustArgsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AppendArgsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ApplyT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CollectorT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CountsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::GraphIdT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::GraphResetT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InductionT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InductorT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InitCompleteT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InteropT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::LocalT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::MatchT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::MemscopeT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::OtherwiseT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ReplayableT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SafesyncT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::TransparentT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::WhenT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AffinityT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AlignedT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AllocateT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DefaultmapT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DeviceT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DistScheduleT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DoacrossT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DynGroupprivateT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::FromT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::GrainsizeT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::IfT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InitT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InReductionT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::LastprivateT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::LinearT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::LooprangeT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::MapT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NumTasksT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::OrderT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ReductionT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ScheduleT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::TaskReductionT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ToT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DependT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AbsentT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AlignT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AllocatorT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AtomicDefaultMemOrderT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::AtT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::BindT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CollapseT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CombinerT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ContainsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CopyinT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::CopyprivateT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DefaultT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DestroyT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DetachT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DeviceSafesyncT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DeviceTypeT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::DynamicAllocatorsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::EnterT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ExclusiveT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::FailT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::FilterT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::FinalT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::FirstprivateT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::HasDeviceAddrT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::HintT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::HoldsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InclusiveT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::IndirectT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::InitializerT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::IsDevicePtrT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::LinkT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::MessageT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NocontextT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NontemporalT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NovariantsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NumTeamsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::NumThreadsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::OrderedT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::PartialT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::PriorityT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::PrivateT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ProcBindT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ReverseOffloadT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SafelenT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SelfMapsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SeverityT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SharedT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SimdlenT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::SizesT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::PermutationT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ThreadLimitT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::ThreadsetT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UnifiedAddressT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UnifiedSharedMemoryT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UniformT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UpdateT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UseDeviceAddrT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UseDevicePtrT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>, tomp::clause::UsesAllocatorsT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>>::_Variant_storage<75UL, tomp::clause::AtT<omp::TypeTy, std::basic_string<char>, omp::ExprTy>>
```

Time trace (green is InstantiateFunction), optimization starts after ~35s:

<img width="559" height="351" alt="image" src="" />

@kparzysz 
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to