| ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -enable-shrink-wrap=true %s -o - | FileCheck %s |
| ; |
| ; Test the use of a non-R0 register to save/restore the LR in function |
| ; prologue/epilogue. |
| ; This problem can occur as a result of shrink wrapping, where the function |
| ; prologue and epilogue are moved from the beginning/ending of the function. If |
| ; register R0 is used before the prologue/epilogue blocks, then it cannot be |
| ; used to save/restore the LR. |
| ; |
| ; TODO: Convert this to an MIR test once the infrastructure can support it. |
| ; To convert this to an MIR pass, generate MIR after register allocation |
| ; but before shrink wrapping and verify that has been used in the body of |
| ; the function. This can be done with something like: |
| ; llc -stop-after stack-slot-coloring BreakableToken-reduced.ll > BreakableToken-reduced.mir |
| ; |
| ; The resulting MIR file can then be used as input to llc, and only run |
| ; shrink wrapping and Prologue/Epilogue insertion on it. For example: |
| ; llc -start-after stack-slot-coloring -stop-after prologepilog BreakableToken-reduced.mir |
| ; |
| ; Verify in the resulting code that R0 is not used in the prologue/epilogue. |
| ; |
| ; This currently cannot be done because the PrologEpilogInserter pass has |
| ; a dependency on the TargetPassConfig and StackProtector classes, which |
| ; are currently not serialized when generating the MIR. |
| ; |
| |
| ; ModuleID = 'BreakableToken.cpp' |
| target datalayout = "e-m:e-i64:64-n32:64" |
| target triple = "powerpc64le-unknown-linux-gnu" |
| |
| %"class.clang::format::BreakableStringLiteral" = type { %"class.clang::format::BreakableSingleLineToken" } |
| %"class.clang::format::BreakableSingleLineToken" = type { %"class.clang::format::BreakableToken", i32, %"class.llvm::StringRef", %"class.llvm::StringRef", %"class.llvm::StringRef" } |
| %"class.clang::format::BreakableToken" = type { i32 (...)**, %"struct.clang::format::FormatToken"*, i32, i8, i32, %"struct.clang::format::FormatStyle"* } |
| %"class.llvm::StringRef" = type { i8*, i64 } |
| %"struct.clang::format::FormatToken" = type <{ %"class.clang::Token", i32, i8, [3 x i8], %"class.clang::SourceRange", i32, i32, i32, i8, i8, i8, i8, %"class.llvm::StringRef", i8, [3 x i8], i32, i32, i32, i8, i8, [2 x i8], i32, i32, i16, [2 x i8], %"class.std::unique_ptr", i32, i32, i32, i32, i32, i32, i32, i32, %"class.llvm::SmallVector", i32, i8, i8, [2 x i8], i32, i8, i8, [2 x i8], %"struct.clang::format::FormatToken"*, %"struct.clang::format::FormatToken"*, %"struct.clang::format::FormatToken"*, %"class.llvm::SmallVector.6", i32, i8, [3 x i8] }> |
| %"class.clang::Token" = type <{ i32, i32, i8*, i16, i16, [4 x i8] }> |
| %"class.clang::SourceRange" = type { %"class.clang::SourceLocation", %"class.clang::SourceLocation" } |
| %"class.clang::SourceLocation" = type { i32 } |
| %"class.std::unique_ptr" = type { %"class.std::tuple" } |
| %"class.std::tuple" = type { %"struct.std::_Tuple_impl" } |
| %"struct.std::_Tuple_impl" = type { %"struct.std::_Head_base.2" } |
| %"struct.std::_Head_base.2" = type { %"class.clang::format::TokenRole"* } |
| %"class.clang::format::TokenRole" = type { i32 (...)**, %"struct.clang::format::FormatStyle"* } |
| %"class.llvm::SmallVector" = type { %"class.llvm::SmallVectorImpl.base", %"struct.llvm::SmallVectorStorage" } |
| %"class.llvm::SmallVectorImpl.base" = type { %"class.llvm::SmallVectorTemplateBase.base" } |
| %"class.llvm::SmallVectorTemplateBase.base" = type { %"class.llvm::SmallVectorTemplateCommon.base" } |
| %"class.llvm::SmallVectorTemplateCommon.base" = type <{ %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion" }> |
| %"class.llvm::SmallVectorBase" = type { i8*, i8*, i8* } |
| %"struct.llvm::AlignedCharArrayUnion" = type { %"struct.llvm::AlignedCharArray" } |
| %"struct.llvm::AlignedCharArray" = type { [4 x i8] } |
| %"struct.llvm::SmallVectorStorage" = type { [3 x %"struct.llvm::AlignedCharArrayUnion"] } |
| %"class.llvm::SmallVector.6" = type <{ %"class.llvm::SmallVectorImpl.7", %"struct.llvm::SmallVectorStorage.12", [7 x i8] }> |
| %"class.llvm::SmallVectorImpl.7" = type { %"class.llvm::SmallVectorTemplateBase.8" } |
| %"class.llvm::SmallVectorTemplateBase.8" = type { %"class.llvm::SmallVectorTemplateCommon.9" } |
| %"class.llvm::SmallVectorTemplateCommon.9" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.10" } |
| %"struct.llvm::AlignedCharArrayUnion.10" = type { %"struct.llvm::AlignedCharArray.11" } |
| %"struct.llvm::AlignedCharArray.11" = type { [8 x i8] } |
| %"struct.llvm::SmallVectorStorage.12" = type { i8 } |
| %"struct.clang::format::FormatStyle" = type { i32, i8, i8, i8, i8, i8, i8, i8, i8, i32, i8, i8, i32, i8, i8, i8, i8, i32, i32, i8, i8, i32, %"class.std::basic_string", i8, i32, i32, i8, i8, i8, i8, %"class.std::vector", i8, i32, i8, i8, i32, %"class.std::basic_string", %"class.std::basic_string", i32, i32, i32, i8, i8, i32, i32, i32, i32, i32, i32, i32, i8, i8, i32, i8, i32, i8, i8, i8, i8, i8, i32, i32, i32 } |
| %"class.std::vector" = type { %"struct.std::_Vector_base" } |
| %"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<std::basic_string<char>, std::allocator<std::basic_string<char> > >::_Vector_impl" } |
| %"struct.std::_Vector_base<std::basic_string<char>, std::allocator<std::basic_string<char> > >::_Vector_impl" = type { %"class.std::basic_string"*, %"class.std::basic_string"*, %"class.std::basic_string"* } |
| %"class.std::basic_string" = type { %"struct.std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider" } |
| %"struct.std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider" = type { i8* } |
| %"struct.llvm::AlignedCharArray.52" = type { [16 x i8] } |
| %"class.clang::format::WhitespaceManager" = type <{ %"class.llvm::SmallVector.13", %"class.clang::SourceManager"*, %"class.std::set", %"struct.clang::format::FormatStyle"*, i8, [7 x i8] }> |
| %"class.llvm::SmallVector.13" = type { %"class.llvm::SmallVectorImpl.14", %"struct.llvm::SmallVectorStorage.19" } |
| %"class.llvm::SmallVectorImpl.14" = type { %"class.llvm::SmallVectorTemplateBase.15" } |
| %"class.llvm::SmallVectorTemplateBase.15" = type { %"class.llvm::SmallVectorTemplateCommon.16" } |
| %"class.llvm::SmallVectorTemplateCommon.16" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.17" } |
| %"struct.llvm::AlignedCharArrayUnion.17" = type { %"struct.llvm::AlignedCharArray.18" } |
| %"struct.llvm::AlignedCharArray.18" = type { [88 x i8] } |
| %"struct.llvm::SmallVectorStorage.19" = type { [15 x %"struct.llvm::AlignedCharArrayUnion.17"] } |
| %"class.clang::SourceManager" = type { %"class.llvm::RefCountedBase", %"class.clang::DiagnosticsEngine"*, %"class.clang::FileManager"*, %"class.llvm::BumpPtrAllocatorImpl", %"class.llvm::DenseMap.65", i8, i8, %"class.std::unique_ptr.78", %"class.std::vector.94", %"class.llvm::SmallVector.99", %"class.llvm::SmallVector.99", i32, i32, %"class.std::vector.107", %"class.clang::ExternalSLocEntrySource"*, %"class.clang::FileID", %"class.clang::LineTableInfo"*, %"class.clang::FileID", %"class.clang::SrcMgr::ContentCache"*, i32, i32, %"class.clang::FileID", %"class.clang::FileID", i32, i32, %"class.llvm::DenseMap.111", %"class.llvm::DenseMap.115", %"class.clang::InBeforeInTUCacheEntry", %"class.std::unique_ptr.119", %"class.std::unique_ptr.127", %"class.llvm::DenseMap.135", %"class.llvm::SmallVector.139" } |
| %"class.llvm::RefCountedBase" = type { i32 } |
| %"class.clang::DiagnosticsEngine" = type opaque |
| %"class.clang::FileManager" = type { %"class.llvm::RefCountedBase.20", %"class.llvm::IntrusiveRefCntPtr", %"class.clang::FileSystemOptions", %"class.std::map", %"class.std::map.24", %"class.llvm::SmallVector.29", %"class.llvm::SmallVector.35", %"class.llvm::StringMap", %"class.llvm::StringMap.56", %"class.llvm::DenseMap", %"class.llvm::BumpPtrAllocatorImpl", i32, i32, i32, i32, i32, %"class.std::unique_ptr.57" } |
| %"class.llvm::RefCountedBase.20" = type { i32 } |
| %"class.llvm::IntrusiveRefCntPtr" = type { %"class.clang::vfs::FileSystem"* } |
| %"class.clang::vfs::FileSystem" = type <{ i32 (...)**, %"class.llvm::ThreadSafeRefCountedBase", [4 x i8] }> |
| %"class.llvm::ThreadSafeRefCountedBase" = type { %"struct.std::atomic" } |
| %"struct.std::atomic" = type { %"struct.std::__atomic_base" } |
| %"struct.std::__atomic_base" = type { i32 } |
| %"class.clang::FileSystemOptions" = type { %"class.std::basic_string" } |
| %"class.std::map" = type { %"class.std::_Rb_tree" } |
| %"class.std::_Rb_tree" = type { %"struct.std::_Rb_tree<llvm::sys::fs::UniqueID, std::pair<const llvm::sys::fs::UniqueID, clang::DirectoryEntry>, std::_Select1st<std::pair<const llvm::sys::fs::UniqueID, clang::DirectoryEntry> >, std::less<llvm::sys::fs::UniqueID>, std::allocator<std::pair<const llvm::sys::fs::UniqueID, clang::DirectoryEntry> > >::_Rb_tree_impl" } |
| %"struct.std::_Rb_tree<llvm::sys::fs::UniqueID, std::pair<const llvm::sys::fs::UniqueID, clang::DirectoryEntry>, std::_Select1st<std::pair<const llvm::sys::fs::UniqueID, clang::DirectoryEntry> >, std::less<llvm::sys::fs::UniqueID>, std::allocator<std::pair<const llvm::sys::fs::UniqueID, clang::DirectoryEntry> > >::_Rb_tree_impl" = type { %"struct.std::less", %"struct.std::_Rb_tree_node_base", i64 } |
| %"struct.std::less" = type { i8 } |
| %"struct.std::_Rb_tree_node_base" = type { i32, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* } |
| %"class.std::map.24" = type { %"class.std::_Rb_tree.25" } |
| %"class.std::_Rb_tree.25" = type { %"struct.std::_Rb_tree<llvm::sys::fs::UniqueID, std::pair<const llvm::sys::fs::UniqueID, clang::FileEntry>, std::_Select1st<std::pair<const llvm::sys::fs::UniqueID, clang::FileEntry> >, std::less<llvm::sys::fs::UniqueID>, std::allocator<std::pair<const llvm::sys::fs::UniqueID, clang::FileEntry> > >::_Rb_tree_impl" } |
| %"struct.std::_Rb_tree<llvm::sys::fs::UniqueID, std::pair<const llvm::sys::fs::UniqueID, clang::FileEntry>, std::_Select1st<std::pair<const llvm::sys::fs::UniqueID, clang::FileEntry> >, std::less<llvm::sys::fs::UniqueID>, std::allocator<std::pair<const llvm::sys::fs::UniqueID, clang::FileEntry> > >::_Rb_tree_impl" = type { %"struct.std::less", %"struct.std::_Rb_tree_node_base", i64 } |
| %"class.llvm::SmallVector.29" = type { %"class.llvm::SmallVectorImpl.30", %"struct.llvm::SmallVectorStorage.34" } |
| %"class.llvm::SmallVectorImpl.30" = type { %"class.llvm::SmallVectorTemplateBase.31" } |
| %"class.llvm::SmallVectorTemplateBase.31" = type { %"class.llvm::SmallVectorTemplateCommon.32" } |
| %"class.llvm::SmallVectorTemplateCommon.32" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.33" } |
| %"struct.llvm::AlignedCharArrayUnion.33" = type { %"struct.llvm::AlignedCharArray.11" } |
| %"struct.llvm::SmallVectorStorage.34" = type { [3 x %"struct.llvm::AlignedCharArrayUnion.33"] } |
| %"class.llvm::SmallVector.35" = type { %"class.llvm::SmallVectorImpl.36", %"struct.llvm::SmallVectorStorage.40" } |
| %"class.llvm::SmallVectorImpl.36" = type { %"class.llvm::SmallVectorTemplateBase.37" } |
| %"class.llvm::SmallVectorTemplateBase.37" = type { %"class.llvm::SmallVectorTemplateCommon.38" } |
| %"class.llvm::SmallVectorTemplateCommon.38" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.39" } |
| %"struct.llvm::AlignedCharArrayUnion.39" = type { %"struct.llvm::AlignedCharArray.11" } |
| %"struct.llvm::SmallVectorStorage.40" = type { [3 x %"struct.llvm::AlignedCharArrayUnion.39"] } |
| %"class.llvm::StringMap" = type { %"class.llvm::StringMapImpl", %"class.llvm::BumpPtrAllocatorImpl" } |
| %"class.llvm::StringMapImpl" = type { %"class.llvm::StringMapEntryBase"**, i32, i32, i32, i32 } |
| %"class.llvm::StringMapEntryBase" = type { i32 } |
| %"class.llvm::StringMap.56" = type { %"class.llvm::StringMapImpl", %"class.llvm::BumpPtrAllocatorImpl" } |
| %"class.llvm::DenseMap" = type <{ %"struct.llvm::detail::DenseMapPair"*, i32, i32, i32, [4 x i8] }> |
| %"struct.llvm::detail::DenseMapPair" = type opaque |
| %"class.std::unique_ptr.57" = type { %"class.std::tuple.58" } |
| %"class.std::tuple.58" = type { %"struct.std::_Tuple_impl.59" } |
| %"struct.std::_Tuple_impl.59" = type { %"struct.std::_Head_base.64" } |
| %"struct.std::_Head_base.64" = type { %"class.clang::FileSystemStatCache"* } |
| %"class.clang::FileSystemStatCache" = type opaque |
| %"class.llvm::BumpPtrAllocatorImpl" = type <{ i8*, i8*, %"class.llvm::SmallVector.41", %"class.llvm::SmallVector.47", i64, %"class.llvm::MallocAllocator", [7 x i8] }> |
| %"class.llvm::SmallVector.41" = type { %"class.llvm::SmallVectorImpl.42", %"struct.llvm::SmallVectorStorage.46" } |
| %"class.llvm::SmallVectorImpl.42" = type { %"class.llvm::SmallVectorTemplateBase.43" } |
| %"class.llvm::SmallVectorTemplateBase.43" = type { %"class.llvm::SmallVectorTemplateCommon.44" } |
| %"class.llvm::SmallVectorTemplateCommon.44" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.45" } |
| %"struct.llvm::AlignedCharArrayUnion.45" = type { %"struct.llvm::AlignedCharArray.11" } |
| %"struct.llvm::SmallVectorStorage.46" = type { [3 x %"struct.llvm::AlignedCharArrayUnion.45"] } |
| %"class.llvm::SmallVector.47" = type <{ %"class.llvm::SmallVectorImpl.48", %"struct.llvm::SmallVectorStorage.53", [7 x i8] }> |
| %"class.llvm::SmallVectorImpl.48" = type { %"class.llvm::SmallVectorTemplateBase.49" } |
| %"class.llvm::SmallVectorTemplateBase.49" = type { %"class.llvm::SmallVectorTemplateCommon.50" } |
| %"class.llvm::SmallVectorTemplateCommon.50" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.51" } |
| %"struct.llvm::AlignedCharArrayUnion.51" = type { %"struct.llvm::AlignedCharArray.52" } |
| %"struct.llvm::SmallVectorStorage.53" = type { i8 } |
| %"class.llvm::MallocAllocator" = type { i8 } |
| %"class.llvm::DenseMap.65" = type <{ %"struct.llvm::detail::DenseMapPair.67"*, i32, i32, i32, [4 x i8] }> |
| %"struct.llvm::detail::DenseMapPair.67" = type { %"struct.std::pair.68" } |
| %"struct.std::pair.68" = type { %"class.clang::FileEntry"*, %"class.clang::SrcMgr::ContentCache"* } |
| %"class.clang::FileEntry" = type { i8*, i64, i64, %"class.clang::DirectoryEntry"*, i32, %"class.llvm::sys::fs::UniqueID", i8, i8, i8, %"class.std::unique_ptr.69" } |
| %"class.clang::DirectoryEntry" = type { i8* } |
| %"class.llvm::sys::fs::UniqueID" = type { i64, i64 } |
| %"class.std::unique_ptr.69" = type { %"class.std::tuple.70" } |
| %"class.std::tuple.70" = type { %"struct.std::_Tuple_impl.71" } |
| %"struct.std::_Tuple_impl.71" = type { %"struct.std::_Head_base.76" } |
| %"struct.std::_Head_base.76" = type { %"class.clang::vfs::File"* } |
| %"class.clang::vfs::File" = type { i32 (...)** } |
| %"class.std::unique_ptr.78" = type { %"class.std::tuple.79" } |
| %"class.std::tuple.79" = type { %"struct.std::_Tuple_impl.80" } |
| %"struct.std::_Tuple_impl.80" = type { %"struct.std::_Head_base.85" } |
| %"struct.std::_Head_base.85" = type { %"struct.clang::SourceManager::OverriddenFilesInfoTy"* } |
| %"struct.clang::SourceManager::OverriddenFilesInfoTy" = type { %"class.llvm::DenseMap.86", %"class.llvm::DenseSet" } |
| %"class.llvm::DenseMap.86" = type <{ %"struct.llvm::detail::DenseMapPair.88"*, i32, i32, i32, [4 x i8] }> |
| %"struct.llvm::detail::DenseMapPair.88" = type { %"struct.std::pair.89" } |
| %"struct.std::pair.89" = type { %"class.clang::FileEntry"*, %"class.clang::FileEntry"* } |
| %"class.llvm::DenseSet" = type { %"class.llvm::DenseMap.91" } |
| %"class.llvm::DenseMap.91" = type <{ %"class.llvm::detail::DenseSetPair"*, i32, i32, i32, [4 x i8] }> |
| %"class.llvm::detail::DenseSetPair" = type { %"class.clang::FileEntry"* } |
| %"class.std::vector.94" = type { %"struct.std::_Vector_base.95" } |
| %"struct.std::_Vector_base.95" = type { %"struct.std::_Vector_base<clang::SrcMgr::ContentCache *, std::allocator<clang::SrcMgr::ContentCache *> >::_Vector_impl" } |
| %"struct.std::_Vector_base<clang::SrcMgr::ContentCache *, std::allocator<clang::SrcMgr::ContentCache *> >::_Vector_impl" = type { %"class.clang::SrcMgr::ContentCache"**, %"class.clang::SrcMgr::ContentCache"**, %"class.clang::SrcMgr::ContentCache"** } |
| %"class.llvm::SmallVector.99" = type <{ %"class.llvm::SmallVectorImpl.100", %"struct.llvm::SmallVectorStorage.105", [7 x i8] }> |
| %"class.llvm::SmallVectorImpl.100" = type { %"class.llvm::SmallVectorTemplateBase.101" } |
| %"class.llvm::SmallVectorTemplateBase.101" = type { %"class.llvm::SmallVectorTemplateCommon.102" } |
| %"class.llvm::SmallVectorTemplateCommon.102" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.103" } |
| %"struct.llvm::AlignedCharArrayUnion.103" = type { %"struct.llvm::AlignedCharArray.104" } |
| %"struct.llvm::AlignedCharArray.104" = type { [24 x i8] } |
| %"struct.llvm::SmallVectorStorage.105" = type { i8 } |
| %"class.std::vector.107" = type { %"struct.std::_Bvector_base" } |
| %"struct.std::_Bvector_base" = type { %"struct.std::_Bvector_base<std::allocator<bool> >::_Bvector_impl" } |
| %"struct.std::_Bvector_base<std::allocator<bool> >::_Bvector_impl" = type { %"struct.std::_Bit_iterator", %"struct.std::_Bit_iterator", i64* } |
| %"struct.std::_Bit_iterator" = type { %"struct.std::_Bit_iterator_base.base", [4 x i8] } |
| %"struct.std::_Bit_iterator_base.base" = type <{ i64*, i32 }> |
| %"class.clang::ExternalSLocEntrySource" = type { i32 (...)** } |
| %"class.clang::LineTableInfo" = type opaque |
| %"class.clang::SrcMgr::ContentCache" = type <{ %"class.llvm::PointerIntPair", %"class.clang::FileEntry"*, %"class.clang::FileEntry"*, i32*, [5 x i8], [3 x i8] }> |
| %"class.llvm::PointerIntPair" = type { i64 } |
| %"class.clang::FileID" = type { i32 } |
| %"class.llvm::DenseMap.111" = type <{ %"struct.llvm::detail::DenseMapPair.113"*, i32, i32, i32, [4 x i8] }> |
| %"struct.llvm::detail::DenseMapPair.113" = type opaque |
| %"class.llvm::DenseMap.115" = type <{ %"struct.llvm::detail::DenseMapPair.117"*, i32, i32, i32, [4 x i8] }> |
| %"struct.llvm::detail::DenseMapPair.117" = type opaque |
| %"class.clang::InBeforeInTUCacheEntry" = type { %"class.clang::FileID", %"class.clang::FileID", i8, %"class.clang::FileID", i32, i32 } |
| %"class.std::unique_ptr.119" = type { %"class.std::tuple.120" } |
| %"class.std::tuple.120" = type { %"struct.std::_Tuple_impl.121" } |
| %"struct.std::_Tuple_impl.121" = type { %"struct.std::_Head_base.126" } |
| %"struct.std::_Head_base.126" = type { %"class.llvm::MemoryBuffer"* } |
| %"class.llvm::MemoryBuffer" = type { i32 (...)**, i8*, i8* } |
| %"class.std::unique_ptr.127" = type { %"class.std::tuple.128" } |
| %"class.std::tuple.128" = type { %"struct.std::_Tuple_impl.129" } |
| %"struct.std::_Tuple_impl.129" = type { %"struct.std::_Head_base.134" } |
| %"struct.std::_Head_base.134" = type { %"class.clang::SrcMgr::ContentCache"* } |
| %"class.llvm::DenseMap.135" = type <{ %"struct.llvm::detail::DenseMapPair.137"*, i32, i32, i32, [4 x i8] }> |
| %"struct.llvm::detail::DenseMapPair.137" = type opaque |
| %"class.llvm::SmallVector.139" = type { %"class.llvm::SmallVectorImpl.140", %"struct.llvm::SmallVectorStorage.144" } |
| %"class.llvm::SmallVectorImpl.140" = type { %"class.llvm::SmallVectorTemplateBase.141" } |
| %"class.llvm::SmallVectorTemplateBase.141" = type { %"class.llvm::SmallVectorTemplateCommon.142" } |
| %"class.llvm::SmallVectorTemplateCommon.142" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.143" } |
| %"struct.llvm::AlignedCharArrayUnion.143" = type { %"struct.llvm::AlignedCharArray.104" } |
| %"struct.llvm::SmallVectorStorage.144" = type { [1 x %"struct.llvm::AlignedCharArrayUnion.143"] } |
| %"class.std::set" = type { %"class.std::_Rb_tree.145" } |
| %"class.std::_Rb_tree.145" = type { %"struct.std::_Rb_tree<clang::tooling::Replacement, clang::tooling::Replacement, std::_Identity<clang::tooling::Replacement>, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement> >::_Rb_tree_impl" } |
| %"struct.std::_Rb_tree<clang::tooling::Replacement, clang::tooling::Replacement, std::_Identity<clang::tooling::Replacement>, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement> >::_Rb_tree_impl" = type { %"struct.std::less.149", %"struct.std::_Rb_tree_node_base", i64 } |
| %"struct.std::less.149" = type { i8 } |
| |
| |
| ; Function Attrs: nounwind |
| ; CHECK-LABEL: @_ZN5clang6format22BreakableStringLiteral11insertBreakEjjSt4pairImjERNS0_17WhitespaceManagerE |
| |
| ; Load a value into R0 before saving the LR |
| ; CHECK: lwz 0, {{[0-9]+([0-9]+)}} |
| |
| ; Ensure the LR is saved using a different register |
| ; CHECK: mflr {{[1-9]+}} |
| |
| ; Ensure the LR is restored using a different register |
| ; CHECK: mtlr {{[0-9]+}} |
| ; CHECK: blr |
| define void @_ZN5clang6format22BreakableStringLiteral11insertBreakEjjSt4pairImjERNS0_17WhitespaceManagerE(%"class.clang::format::BreakableStringLiteral"* nocapture readonly %this, i32 zeroext %LineIndex, i32 zeroext %TailOffset, [2 x i64] %Split.coerce, %"class.clang::format::WhitespaceManager"* dereferenceable(1504) %Whitespaces) unnamed_addr #1 align 2 { |
| entry: |
| %Split.coerce.fca.0.extract = extractvalue [2 x i64] %Split.coerce, 0 |
| %Split.coerce.fca.1.extract = extractvalue [2 x i64] %Split.coerce, 1 |
| %StartColumn = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 1 |
| %0 = load i32, i32* %StartColumn, align 8, !tbaa !2 |
| %Prefix = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 2 |
| %Length.i.19 = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 2, i32 1 |
| %1 = load i64, i64* %Length.i.19, align 8, !tbaa !10 |
| %cmp.i = icmp eq i64 %1, 0 |
| br i1 %cmp.i, label %entry._ZNK4llvm9StringRef10startswithES0_.exit_crit_edge, label %if.end.i.i |
| |
| entry._ZNK4llvm9StringRef10startswithES0_.exit_crit_edge: ; preds = %entry |
| %agg.tmp7.sroa.0.0..sroa_cast.phi.trans.insert = bitcast %"class.llvm::StringRef"* %Prefix to i64* |
| %agg.tmp7.sroa.0.0.copyload.pre = load i64, i64* %agg.tmp7.sroa.0.0..sroa_cast.phi.trans.insert, align 8 |
| br label %_ZNK4llvm9StringRef10startswithES0_.exit |
| |
| if.end.i.i: ; preds = %entry |
| %Data.i.20 = getelementptr inbounds %"class.llvm::StringRef", %"class.llvm::StringRef"* %Prefix, i64 0, i32 0 |
| %2 = load i8*, i8** %Data.i.20, align 8, !tbaa !12 |
| %lhsc = load i8, i8* %2, align 1 |
| %phitmp.i = icmp eq i8 %lhsc, 64 |
| %3 = ptrtoint i8* %2 to i64 |
| br label %_ZNK4llvm9StringRef10startswithES0_.exit |
| |
| _ZNK4llvm9StringRef10startswithES0_.exit: ; preds = %entry._ZNK4llvm9StringRef10startswithES0_.exit_crit_edge, %if.end.i.i |
| %agg.tmp7.sroa.0.0.copyload = phi i64 [ %agg.tmp7.sroa.0.0.copyload.pre, %entry._ZNK4llvm9StringRef10startswithES0_.exit_crit_edge ], [ %3, %if.end.i.i ] |
| %4 = phi i1 [ false, %entry._ZNK4llvm9StringRef10startswithES0_.exit_crit_edge ], [ %phitmp.i, %if.end.i.i ] |
| %dec = sext i1 %4 to i32 |
| %dec. = add i32 %dec, %0 |
| %Tok = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 0, i32 1 |
| %ref = load %"struct.clang::format::FormatToken"*, %"struct.clang::format::FormatToken"** %Tok, align 8, !tbaa !13 |
| %conv = zext i32 %TailOffset to i64 |
| %add = add i64 %Split.coerce.fca.0.extract, %conv |
| %add4 = add i64 %add, %1 |
| %conv5 = trunc i64 %add4 to i32 |
| %Split.sroa.2.8.extract.trunc = trunc i64 %Split.coerce.fca.1.extract to i32 |
| %agg.tmp6.sroa.0.0..sroa_idx13 = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 3 |
| %agg.tmp6.sroa.0.0..sroa_cast = bitcast %"class.llvm::StringRef"* %agg.tmp6.sroa.0.0..sroa_idx13 to i64* |
| %agg.tmp6.sroa.0.0.copyload = load i64, i64* %agg.tmp6.sroa.0.0..sroa_cast, align 8 |
| %agg.tmp6.sroa.2.0..sroa_idx14 = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 3, i32 1 |
| %agg.tmp6.sroa.2.0.copyload = load i64, i64* %agg.tmp6.sroa.2.0..sroa_idx14, align 8 |
| %InPPDirective = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 0, i32 3 |
| %5 = load i8, i8* %InPPDirective, align 4, !tbaa !34, !range !39 |
| %tobool = icmp ne i8 %5, 0 |
| %IndentLevel = getelementptr inbounds %"class.clang::format::BreakableStringLiteral", %"class.clang::format::BreakableStringLiteral"* %this, i64 0, i32 0, i32 0, i32 2 |
| %6 = load i32, i32* %IndentLevel, align 8, !tbaa !33 |
| %.fca.0.insert11 = insertvalue [2 x i64] undef, i64 %agg.tmp6.sroa.0.0.copyload, 0 |
| %.fca.1.insert12 = insertvalue [2 x i64] %.fca.0.insert11, i64 %agg.tmp6.sroa.2.0.copyload, 1 |
| %.fca.0.insert = insertvalue [2 x i64] undef, i64 %agg.tmp7.sroa.0.0.copyload, 0 |
| %.fca.1.insert = insertvalue [2 x i64] %.fca.0.insert, i64 %1, 1 |
| tail call void @_ZN5clang6format17WhitespaceManager24replaceWhitespaceInTokenERKNS0_11FormatTokenEjjN4llvm9StringRefES6_bjji(%"class.clang::format::WhitespaceManager"* nonnull %Whitespaces, %"struct.clang::format::FormatToken"* dereferenceable(272) %ref, i32 zeroext %conv5, i32 zeroext %Split.sroa.2.8.extract.trunc, [2 x i64] %.fca.1.insert12, [2 x i64] %.fca.1.insert, i1 zeroext %tobool, i32 zeroext 1, i32 zeroext %6, i32 signext %dec.) #9 |
| ret void |
| } |
| |
| ; Function Attrs: nounwind argmemonly |
| declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #2 |
| |
| declare void @_ZN5clang6format17WhitespaceManager24replaceWhitespaceInTokenERKNS0_11FormatTokenEjjN4llvm9StringRefES6_bjji(%"class.clang::format::WhitespaceManager"*, %"struct.clang::format::FormatToken"* dereferenceable(272), i32 zeroext, i32 zeroext, [2 x i64], [2 x i64], i1 zeroext, i32 zeroext, i32 zeroext, i32 signext) #3 |
| |
| ; Function Attrs: nounwind argmemonly |
| declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #2 |
| |
| attributes #9 = { nounwind } |
| |
| !llvm.module.flags = !{!0} |
| !llvm.ident = !{!1} |
| |
| !0 = !{i32 1, !"PIC Level", i32 2} |
| !1 = !{!"clang version 3.8.0 (trunk 248714) (llvm/trunk 248719)"} |
| !2 = !{!3, !4, i64 40} |
| !3 = !{!"_ZTSN5clang6format24BreakableSingleLineTokenE", !4, i64 40, !7, i64 48, !7, i64 64, !7, i64 80} |
| !4 = !{!"int", !5, i64 0} |
| !5 = !{!"omnipotent char", !6, i64 0} |
| !6 = !{!"Simple C/C++ TBAA"} |
| !7 = !{!"_ZTSN4llvm9StringRefE", !8, i64 0, !9, i64 8} |
| !8 = !{!"any pointer", !5, i64 0} |
| !9 = !{!"long", !5, i64 0} |
| !10 = !{!7, !9, i64 8} |
| !11 = !{!9, !9, i64 0} |
| !12 = !{!7, !8, i64 0} |
| !13 = !{!5, !5, i64 0} |
| !14 = !{!15, !4, i64 200} |
| !15 = !{!"_ZTSN5clang6format11FormatStyleE", !4, i64 0, !16, i64 4, !16, i64 5, !16, i64 6, !16, i64 7, !16, i64 8, !16, i64 9, !16, i64 10, !16, i64 11, !17, i64 12, !16, i64 16, !16, i64 17, !18, i64 20, !16, i64 24, !16, i64 25, !16, i64 26, !16, i64 27, !19, i64 28, !20, i64 32, !16, i64 36, !16, i64 37, !4, i64 40, !21, i64 48, !16, i64 56, !4, i64 60, !4, i64 64, !16, i64 68, !16, i64 69, !16, i64 70, !16, i64 71, !23, i64 72, !16, i64 96, !4, i64 100, !16, i64 104, !16, i64 105, !24, i64 108, !21, i64 112, !21, i64 120, !4, i64 128, !25, i64 132, !4, i64 136, !16, i64 140, !16, i64 141, !4, i64 144, !4, i64 148, !4, i64 152, !4, i64 156, !4, i64 160, !4, i64 164, !26, i64 168, !16, i64 172, !16, i64 173, !27, i64 176, !16, i64 180, !4, i64 184, !16, i64 188, !16, i64 189, !16, i64 190, !16, i64 191, !16, i64 192, !28, i64 196, !4, i64 200, !29, i64 204} |
| !16 = !{!"bool", !5, i64 0} |
| !17 = !{!"_ZTSN5clang6format11FormatStyle18ShortFunctionStyleE", !5, i64 0} |
| !18 = !{!"_ZTSN5clang6format11FormatStyle33DefinitionReturnTypeBreakingStyleE", !5, i64 0} |
| !19 = !{!"_ZTSN5clang6format11FormatStyle19BinaryOperatorStyleE", !5, i64 0} |
| !20 = !{!"_ZTSN5clang6format11FormatStyle18BraceBreakingStyleE", !5, i64 0} |
| !21 = !{!"_ZTSSs", !22, i64 0} |
| !22 = !{!"_ZTSNSs12_Alloc_hiderE", !8, i64 0} |
| !23 = !{!"_ZTSSt6vectorISsSaISsEE"} |
| !24 = !{!"_ZTSN5clang6format11FormatStyle12LanguageKindE", !5, i64 0} |
| !25 = !{!"_ZTSN5clang6format11FormatStyle24NamespaceIndentationKindE", !5, i64 0} |
| !26 = !{!"_ZTSN5clang6format11FormatStyle21PointerAlignmentStyleE", !5, i64 0} |
| !27 = !{!"_ZTSN5clang6format11FormatStyle24SpaceBeforeParensOptionsE", !5, i64 0} |
| !28 = !{!"_ZTSN5clang6format11FormatStyle16LanguageStandardE", !5, i64 0} |
| !29 = !{!"_ZTSN5clang6format11FormatStyle11UseTabStyleE", !5, i64 0} |
| !30 = !{!31, !32, i64 24} |
| !31 = !{!"_ZTSN5clang6format14BreakableTokenE", !5, i64 8, !4, i64 16, !16, i64 20, !32, i64 24, !5, i64 32} |
| !32 = !{!"_ZTSN5clang6format8encoding8EncodingE", !5, i64 0} |
| !33 = !{!31, !4, i64 16} |
| !34 = !{!31, !16, i64 20} |
| !35 = !{!36, !36, i64 0} |
| !36 = !{!"vtable pointer", !6, i64 0} |
| !37 = !{!38, !38, i64 0} |
| !38 = !{!"short", !5, i64 0} |
| !39 = !{i8 0, i8 2} |
| !40 = !{i64 0, i64 8, !41, i64 8, i64 8, !11} |
| !41 = !{!8, !8, i64 0} |
| !42 = !{!43, !8, i64 16} |
| !43 = !{!"_ZTSN4llvm15SmallVectorBaseE", !8, i64 0, !8, i64 8, !8, i64 16} |
| !44 = !{!43, !8, i64 8} |
| !45 = !{!43, !8, i64 0} |
| !46 = !{!4, !4, i64 0} |
| !47 = !{!48, !16, i64 500} |
| !48 = !{!"_ZTSN5clang6format21BreakableBlockCommentE", !49, i64 40, !51, i64 320, !53, i64 408, !4, i64 496, !16, i64 500, !7, i64 504} |
| !49 = !{!"_ZTSN4llvm11SmallVectorINS_9StringRefELj16EEE", !50, i64 40} |
| !50 = !{!"_ZTSN4llvm18SmallVectorStorageINS_9StringRefELj16EEE", !5, i64 0} |
| !51 = !{!"_ZTSN4llvm11SmallVectorIjLj16EEE", !52, i64 28} |
| !52 = !{!"_ZTSN4llvm18SmallVectorStorageIjLj16EEE", !5, i64 0} |
| !53 = !{!"_ZTSN4llvm11SmallVectorIiLj16EEE", !54, i64 28} |
| !54 = !{!"_ZTSN4llvm18SmallVectorStorageIiLj16EEE", !5, i64 0} |
| !55 = !{!48, !4, i64 496} |