From 8fe39e64c0ef0a1aefce3c1187c5822343caeedd Mon Sep 17 00:00:00 2001 From: Owen Pan Date: Thu, 16 May 2024 19:23:47 -0700 Subject: [PATCH 0001/1875] [clang-format] Don't always break before << between string literals (#92214) Instead, leave the line wrapping as is. Fixes #43887. Fixes #44363. --- clang/lib/Format/TokenAnnotator.cpp | 7 +++++-- clang/unittests/Format/FormatTest.cpp | 11 +++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index d0aa0838423e..7c4c76a91f2c 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -5601,10 +5601,13 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, return true; if (Left.IsUnterminatedLiteral) return true; - if (Right.is(tok::lessless) && AfterRight && Left.is(tok::string_literal) && + + if (BeforeLeft && BeforeLeft->is(tok::lessless) && + Left.is(tok::string_literal) && Right.is(tok::lessless) && AfterRight && AfterRight->is(tok::string_literal)) { - return true; + return Right.NewlinesBefore > 0; } + if (Right.is(TT_RequiresClause)) { switch (Style.RequiresClausePosition) { case FormatStyle::RCPS_OwnLine: diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index e6f8e4a06515..6f57f10e12e8 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -10539,6 +10539,17 @@ TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { " bbbbbbbbbbbbbbbbbbbbbbb);"); } +TEST_F(FormatTest, WrapBeforeInsertionOperatorbetweenStringLiterals) { + verifyFormat("QStringList() << \"foo\" << \"bar\";"); + + verifyNoChange("QStringList() << \"foo\"\n" + " << \"bar\";"); + + verifyFormat("log_error(log, \"foo\" << \"bar\");", + "log_error(log, \"foo\"\n" + " << \"bar\");"); +} + TEST_F(FormatTest, UnderstandsEquals) { verifyFormat( "aaaaaaaaaaaaaaaaa =\n" -- GitLab From 88d351e2e62d2ff291f3e6dea6b7e425f683285b Mon Sep 17 00:00:00 2001 From: Owen Pan Date: Thu, 16 May 2024 19:24:35 -0700 Subject: [PATCH 0002/1875] [clang-format] Fix a regression in annotating struct braces (#92352) Fixes #92350. --- clang/lib/Format/UnwrappedLineParser.cpp | 12 +++++++----- clang/unittests/Format/TokenAnnotatorTest.cpp | 5 +++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 2236a49e4b76..b15a87327240 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -4008,8 +4008,6 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) { }; if (FormatTok->isOneOf(tok::colon, tok::less)) { - if (FormatTok->is(tok::colon)) - IsDerived = true; int AngleNestingLevel = 0; do { if (FormatTok->is(tok::less)) @@ -4017,9 +4015,13 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) { else if (FormatTok->is(tok::greater)) --AngleNestingLevel; - if (AngleNestingLevel == 0 && FormatTok->is(tok::l_paren) && - IsNonMacroIdentifier(FormatTok->Previous)) { - break; + if (AngleNestingLevel == 0) { + if (FormatTok->is(tok::colon)) { + IsDerived = true; + } else if (FormatTok->is(tok::l_paren) && + IsNonMacroIdentifier(FormatTok->Previous)) { + break; + } } if (FormatTok->is(tok::l_brace)) { if (AngleNestingLevel == 0 && IsListInitialization()) diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 51b475d37977..aadfa6dc0165 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -2903,6 +2903,11 @@ TEST_F(TokenAnnotatorTest, BraceKind) { EXPECT_BRACE_KIND(Tokens[5], BK_Block); EXPECT_BRACE_KIND(Tokens[6], BK_Block); + Tokens = annotate("struct Foo : Base {};"); + ASSERT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_BRACE_KIND(Tokens[7], BK_Block); + EXPECT_BRACE_KIND(Tokens[8], BK_Block); + Tokens = annotate("struct Foo final {};"); ASSERT_EQ(Tokens.size(), 7u) << Tokens; EXPECT_BRACE_KIND(Tokens[3], BK_Block); -- GitLab From ebf283162f5a0e7e9392c3a825e060856eee0991 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Thu, 16 May 2024 19:31:43 -0700 Subject: [PATCH 0003/1875] [lldb] Include SBLanguages in the SWIG bindings (#92470) --- lldb/bindings/CMakeLists.txt | 2 ++ lldb/bindings/headers.swig | 1 + lldb/bindings/interfaces.swig | 1 + 3 files changed, 4 insertions(+) diff --git a/lldb/bindings/CMakeLists.txt b/lldb/bindings/CMakeLists.txt index 296eae1ae77f..bec694e43bd7 100644 --- a/lldb/bindings/CMakeLists.txt +++ b/lldb/bindings/CMakeLists.txt @@ -3,6 +3,7 @@ file(GLOB_RECURSE SWIG_SOURCES *.swig) file(GLOB SWIG_HEADERS ${LLDB_SOURCE_DIR}/include/lldb/API/*.h ${LLDB_SOURCE_DIR}/include/lldb/*.h + ${LLDB_BINARY_DIR}/include/lldb/API/SBLanguages.h ) file(GLOB SWIG_PRIVATE_HEADERS ${LLDB_SOURCE_DIR}/include/lldb/lldb-private*.h @@ -30,6 +31,7 @@ set(SWIG_COMMON_FLAGS -w361,362,509 -features autodoc -I${LLDB_SOURCE_DIR}/include + -I${LLDB_BINARY_DIR}/include -I${CMAKE_CURRENT_SOURCE_DIR} ${DARWIN_EXTRAS} ) diff --git a/lldb/bindings/headers.swig b/lldb/bindings/headers.swig index e8d0cda28814..ffdc3c31ec88 100644 --- a/lldb/bindings/headers.swig +++ b/lldb/bindings/headers.swig @@ -36,6 +36,7 @@ #include "lldb/API/SBHostOS.h" #include "lldb/API/SBInstruction.h" #include "lldb/API/SBInstructionList.h" +#include "lldb/API/SBLanguages.h" #include "lldb/API/SBLanguageRuntime.h" #include "lldb/API/SBLaunchInfo.h" #include "lldb/API/SBLineEntry.h" diff --git a/lldb/bindings/interfaces.swig b/lldb/bindings/interfaces.swig index a31a0b4af1eb..2a29a8dd7ef0 100644 --- a/lldb/bindings/interfaces.swig +++ b/lldb/bindings/interfaces.swig @@ -114,6 +114,7 @@ %include "lldb/API/SBHostOS.h" %include "lldb/API/SBInstruction.h" %include "lldb/API/SBInstructionList.h" +%include "lldb/API/SBLanguages.h" %include "lldb/API/SBLanguageRuntime.h" %include "lldb/API/SBLaunchInfo.h" %include "lldb/API/SBLineEntry.h" -- GitLab From 552927840319572a649cdec2d8bf2e688a5df490 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Thu, 16 May 2024 19:58:58 -0700 Subject: [PATCH 0004/1875] Revert "[lldb] Include SBLanguages in the SWIG bindings" (#92490) Reverts llvm/llvm-project#92470 --- lldb/bindings/CMakeLists.txt | 2 -- lldb/bindings/headers.swig | 1 - lldb/bindings/interfaces.swig | 1 - 3 files changed, 4 deletions(-) diff --git a/lldb/bindings/CMakeLists.txt b/lldb/bindings/CMakeLists.txt index bec694e43bd7..296eae1ae77f 100644 --- a/lldb/bindings/CMakeLists.txt +++ b/lldb/bindings/CMakeLists.txt @@ -3,7 +3,6 @@ file(GLOB_RECURSE SWIG_SOURCES *.swig) file(GLOB SWIG_HEADERS ${LLDB_SOURCE_DIR}/include/lldb/API/*.h ${LLDB_SOURCE_DIR}/include/lldb/*.h - ${LLDB_BINARY_DIR}/include/lldb/API/SBLanguages.h ) file(GLOB SWIG_PRIVATE_HEADERS ${LLDB_SOURCE_DIR}/include/lldb/lldb-private*.h @@ -31,7 +30,6 @@ set(SWIG_COMMON_FLAGS -w361,362,509 -features autodoc -I${LLDB_SOURCE_DIR}/include - -I${LLDB_BINARY_DIR}/include -I${CMAKE_CURRENT_SOURCE_DIR} ${DARWIN_EXTRAS} ) diff --git a/lldb/bindings/headers.swig b/lldb/bindings/headers.swig index ffdc3c31ec88..e8d0cda28814 100644 --- a/lldb/bindings/headers.swig +++ b/lldb/bindings/headers.swig @@ -36,7 +36,6 @@ #include "lldb/API/SBHostOS.h" #include "lldb/API/SBInstruction.h" #include "lldb/API/SBInstructionList.h" -#include "lldb/API/SBLanguages.h" #include "lldb/API/SBLanguageRuntime.h" #include "lldb/API/SBLaunchInfo.h" #include "lldb/API/SBLineEntry.h" diff --git a/lldb/bindings/interfaces.swig b/lldb/bindings/interfaces.swig index 2a29a8dd7ef0..a31a0b4af1eb 100644 --- a/lldb/bindings/interfaces.swig +++ b/lldb/bindings/interfaces.swig @@ -114,7 +114,6 @@ %include "lldb/API/SBHostOS.h" %include "lldb/API/SBInstruction.h" %include "lldb/API/SBInstructionList.h" -%include "lldb/API/SBLanguages.h" %include "lldb/API/SBLanguageRuntime.h" %include "lldb/API/SBLaunchInfo.h" %include "lldb/API/SBLineEntry.h" -- GitLab From 9f15aa009c36d2c108f0f2d09c2e9b283ebc4453 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Thu, 16 May 2024 20:02:51 -0700 Subject: [PATCH 0005/1875] [BOLT][NFC] Rename DataAggregator::BranchInfo to TakenBranchInfo Align the name to its counterpart `FTInfo` which avoids name aliasing with llvm::bolt::BranchInfo and allows to drop namespace specifier. Test Plan: NFC Reviewers: maksfb, rafaelauler, ayermolo, dcci Reviewed By: dcci Pull Request: https://github.com/llvm/llvm-project/pull/92017 --- bolt/include/bolt/Profile/DataAggregator.h | 4 ++-- bolt/lib/Profile/DataAggregator.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bolt/include/bolt/Profile/DataAggregator.h b/bolt/include/bolt/Profile/DataAggregator.h index f2fa59bcaa1a..c158a9bb3e3f 100644 --- a/bolt/include/bolt/Profile/DataAggregator.h +++ b/bolt/include/bolt/Profile/DataAggregator.h @@ -122,14 +122,14 @@ private: uint64_t ExternCount{0}; }; - struct BranchInfo { + struct TakenBranchInfo { uint64_t TakenCount{0}; uint64_t MispredCount{0}; }; /// Intermediate storage for profile data. We save the results of parsing /// and use them later for processing and assigning profile. - std::unordered_map BranchLBRs; + std::unordered_map BranchLBRs; std::unordered_map FallthroughLBRs; std::vector AggregatedLBRs; std::unordered_map BasicSamples; diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp index 167899ccba12..e06debcee741 100644 --- a/bolt/lib/Profile/DataAggregator.cpp +++ b/bolt/lib/Profile/DataAggregator.cpp @@ -1464,7 +1464,7 @@ uint64_t DataAggregator::parseLBRSample(const PerfBranchSample &Sample, uint64_t To = getBinaryFunctionContainingAddress(LBR.To) ? LBR.To : 0; if (!From && !To) continue; - BranchInfo &Info = BranchLBRs[Trace(From, To)]; + TakenBranchInfo &Info = BranchLBRs[Trace(From, To)]; ++Info.TakenCount; Info.MispredCount += LBR.Mispred; } @@ -1609,7 +1609,7 @@ void DataAggregator::processBranchEvents() { for (const auto &AggrLBR : BranchLBRs) { const Trace &Loc = AggrLBR.first; - const BranchInfo &Info = AggrLBR.second; + const TakenBranchInfo &Info = AggrLBR.second; doBranch(Loc.From, Loc.To, Info.TakenCount, Info.MispredCount); } } @@ -2253,13 +2253,13 @@ DataAggregator::writeAggregatedFile(StringRef OutputFilename) const { } else { for (const auto &KV : NamesToBranches) { const FuncBranchData &FBD = KV.second; - for (const llvm::bolt::BranchInfo &BI : FBD.Data) { + for (const BranchInfo &BI : FBD.Data) { writeLocation(BI.From); writeLocation(BI.To); OutFile << BI.Mispreds << " " << BI.Branches << "\n"; ++BranchValues; } - for (const llvm::bolt::BranchInfo &BI : FBD.EntryData) { + for (const BranchInfo &BI : FBD.EntryData) { // Do not output if source is a known symbol, since this was already // accounted for in the source function if (BI.From.IsSymbol) @@ -2366,7 +2366,7 @@ std::error_code DataAggregator::writeBATYAML(BinaryContext &BC, return std::pair(BlockIt->first, BlockIt->second.getBBIndex()); }; - for (const llvm::bolt::BranchInfo &BI : Branches.Data) { + for (const BranchInfo &BI : Branches.Data) { using namespace yaml::bolt; const auto &[BlockOffset, BlockIndex] = getBlock(BI.From.Offset); BinaryBasicBlockProfile &YamlBB = YamlBF.Blocks[BlockIndex]; @@ -2388,7 +2388,7 @@ std::error_code DataAggregator::writeBATYAML(BinaryContext &BC, } } // Set entry counts, similar to DataReader::readProfile. - for (const llvm::bolt::BranchInfo &BI : Branches.EntryData) { + for (const BranchInfo &BI : Branches.EntryData) { if (!BlockMap.isInputBlock(BI.To.Offset)) { if (opts::Verbosity >= 1) errs() << "BOLT-WARNING: Unexpected EntryData in " << FuncName -- GitLab From c33922666ce219fd6cb3341c3394f72050599552 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Thu, 16 May 2024 20:47:12 -0700 Subject: [PATCH 0006/1875] [lldb] Use operator==(StringRef, StringRef) instead of StringRef::equals (NFC) (#92476) Note that StringRef::equals has been deprecated in favor of operator==(StringRef, StringRef). --- lldb/source/Commands/CommandObjectThread.cpp | 4 +- lldb/source/Core/FormatEntity.cpp | 12 +- lldb/source/Expression/IRExecutionUnit.cpp | 34 ++--- .../ExpressionParser/Clang/IRForTarget.cpp | 8 +- lldb/source/Plugins/Language/ObjC/Cocoa.cpp | 2 +- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 2 +- .../GDBRemoteCommunicationClient.cpp | 133 +++++++++--------- .../GDBRemoteCommunicationServerCommon.cpp | 22 +-- .../GDBRemoteCommunicationServerPlatform.cpp | 4 +- .../Process/gdb-remote/ProcessGDBRemote.cpp | 26 ++-- .../Plugins/SymbolFile/PDB/PDBASTParser.cpp | 2 +- .../Plugins/SymbolFile/PDB/SymbolFilePDB.cpp | 4 +- .../TypeSystem/Clang/TypeSystemClang.cpp | 17 ++- lldb/source/Target/PathMappingList.cpp | 4 +- 14 files changed, 136 insertions(+), 138 deletions(-) diff --git a/lldb/source/Commands/CommandObjectThread.cpp b/lldb/source/Commands/CommandObjectThread.cpp index 3dbbfd4f9d34..4397ee14ea07 100644 --- a/lldb/source/Commands/CommandObjectThread.cpp +++ b/lldb/source/Commands/CommandObjectThread.cpp @@ -151,14 +151,14 @@ public: for (size_t idx = 0; idx < num_entries; idx++) { llvm::StringRef arg_string = copy_args[idx].ref(); - if (arg_string.equals("-c") || count_opt.starts_with(arg_string)) { + if (arg_string == "-c" || count_opt.starts_with(arg_string)) { idx++; if (idx == num_entries) return std::nullopt; count_idx = idx; if (copy_args[idx].ref().getAsInteger(0, count_val)) return std::nullopt; - } else if (arg_string.equals("-s") || start_opt.starts_with(arg_string)) { + } else if (arg_string == "-s" || start_opt.starts_with(arg_string)) { idx++; if (idx == num_entries) return std::nullopt; diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp index 07978d388296..1c3a4cb1062f 100644 --- a/lldb/source/Core/FormatEntity.cpp +++ b/lldb/source/Core/FormatEntity.cpp @@ -1921,7 +1921,7 @@ static Status ParseEntry(const llvm::StringRef &format_str, const size_t n = parent->num_children; for (size_t i = 0; i < n; ++i) { const Definition *entry_def = parent->children + i; - if (key.equals(entry_def->name) || entry_def->name[0] == '*') { + if (key == entry_def->name || entry_def->name[0] == '*') { llvm::StringRef value; if (sep_char) value = @@ -2002,7 +2002,7 @@ static const Definition *FindEntry(const llvm::StringRef &format_str, const size_t n = parent->num_children; for (size_t i = 0; i < n; ++i) { const Definition *entry_def = parent->children + i; - if (p.first.equals(entry_def->name) || entry_def->name[0] == '*') { + if (p.first == entry_def->name || entry_def->name[0] == '*') { if (p.second.empty()) { if (format_str.back() == '.') remainder = format_str.drop_front(format_str.size() - 1); @@ -2351,13 +2351,13 @@ Status FormatEntity::ExtractVariableInfo(llvm::StringRef &format_str, bool FormatEntity::FormatFileSpec(const FileSpec &file_spec, Stream &s, llvm::StringRef variable_name, llvm::StringRef variable_format) { - if (variable_name.empty() || variable_name.equals(".fullpath")) { + if (variable_name.empty() || variable_name == ".fullpath") { file_spec.Dump(s.AsRawOstream()); return true; - } else if (variable_name.equals(".basename")) { + } else if (variable_name == ".basename") { s.PutCString(file_spec.GetFilename().GetStringRef()); return true; - } else if (variable_name.equals(".dirname")) { + } else if (variable_name == ".dirname") { s.PutCString(file_spec.GetFilename().GetStringRef()); return true; } @@ -2440,7 +2440,7 @@ void FormatEntity::AutoComplete(CompletionRequest &request) { // "${thread.id" request.AddCompletion(MakeMatch(str, "}")); } - } else if (remainder.equals(".")) { + } else if (remainder == ".") { // "${thread." StringList new_matches; AddMatches(entry_def, str, llvm::StringRef(), new_matches); diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp index 07df8c52a2a4..f22070442362 100644 --- a/lldb/source/Expression/IRExecutionUnit.cpp +++ b/lldb/source/Expression/IRExecutionUnit.cpp @@ -534,63 +534,63 @@ lldb::SectionType IRExecutionUnit::GetSectionTypeFromSectionName( } if (!name.empty()) { - if (name.equals("__text") || name.equals(".text")) + if (name == "__text" || name == ".text") sect_type = lldb::eSectionTypeCode; - else if (name.equals("__data") || name.equals(".data")) + else if (name == "__data" || name == ".data") sect_type = lldb::eSectionTypeCode; else if (name.starts_with("__debug_") || name.starts_with(".debug_")) { const uint32_t name_idx = name[0] == '_' ? 8 : 7; llvm::StringRef dwarf_name(name.substr(name_idx)); switch (dwarf_name[0]) { case 'a': - if (dwarf_name.equals("abbrev")) + if (dwarf_name == "abbrev") sect_type = lldb::eSectionTypeDWARFDebugAbbrev; - else if (dwarf_name.equals("aranges")) + else if (dwarf_name == "aranges") sect_type = lldb::eSectionTypeDWARFDebugAranges; - else if (dwarf_name.equals("addr")) + else if (dwarf_name == "addr") sect_type = lldb::eSectionTypeDWARFDebugAddr; break; case 'f': - if (dwarf_name.equals("frame")) + if (dwarf_name == "frame") sect_type = lldb::eSectionTypeDWARFDebugFrame; break; case 'i': - if (dwarf_name.equals("info")) + if (dwarf_name == "info") sect_type = lldb::eSectionTypeDWARFDebugInfo; break; case 'l': - if (dwarf_name.equals("line")) + if (dwarf_name == "line") sect_type = lldb::eSectionTypeDWARFDebugLine; - else if (dwarf_name.equals("loc")) + else if (dwarf_name == "loc") sect_type = lldb::eSectionTypeDWARFDebugLoc; - else if (dwarf_name.equals("loclists")) + else if (dwarf_name == "loclists") sect_type = lldb::eSectionTypeDWARFDebugLocLists; break; case 'm': - if (dwarf_name.equals("macinfo")) + if (dwarf_name == "macinfo") sect_type = lldb::eSectionTypeDWARFDebugMacInfo; break; case 'p': - if (dwarf_name.equals("pubnames")) + if (dwarf_name == "pubnames") sect_type = lldb::eSectionTypeDWARFDebugPubNames; - else if (dwarf_name.equals("pubtypes")) + else if (dwarf_name == "pubtypes") sect_type = lldb::eSectionTypeDWARFDebugPubTypes; break; case 's': - if (dwarf_name.equals("str")) + if (dwarf_name == "str") sect_type = lldb::eSectionTypeDWARFDebugStr; - else if (dwarf_name.equals("str_offsets")) + else if (dwarf_name == "str_offsets") sect_type = lldb::eSectionTypeDWARFDebugStrOffsets; break; case 'r': - if (dwarf_name.equals("ranges")) + if (dwarf_name == "ranges") sect_type = lldb::eSectionTypeDWARFDebugRanges; break; @@ -599,7 +599,7 @@ lldb::SectionType IRExecutionUnit::GetSectionTypeFromSectionName( } } else if (name.starts_with("__apple_") || name.starts_with(".apple_")) sect_type = lldb::eSectionTypeInvalid; - else if (name.equals("__objc_imageinfo")) + else if (name == "__objc_imageinfo") sect_type = lldb::eSectionTypeOther; } return sect_type; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp b/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp index 597873af8b2a..cc9bd14c6194 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp @@ -1449,7 +1449,7 @@ bool IRForTarget::ReplaceVariables(Function &llvm_function) { Argument *argument = &*iter; - if (argument->getName().equals("this")) { + if (argument->getName() == "this") { ++iter; if (iter == llvm_function.arg_end()) { @@ -1461,7 +1461,7 @@ bool IRForTarget::ReplaceVariables(Function &llvm_function) { } argument = &*iter; - } else if (argument->getName().equals("self")) { + } else if (argument->getName() == "self") { ++iter; if (iter == llvm_function.arg_end()) { @@ -1472,7 +1472,7 @@ bool IRForTarget::ReplaceVariables(Function &llvm_function) { return false; } - if (!iter->getName().equals("_cmd")) { + if (iter->getName() != "_cmd") { m_error_stream.Format("Internal error [IRForTarget]: Wrapper takes '{0}' " "after 'self' argument (should take '_cmd')", iter->getName()); @@ -1493,7 +1493,7 @@ bool IRForTarget::ReplaceVariables(Function &llvm_function) { argument = &*iter; } - if (!argument->getName().equals("$__lldb_arg")) { + if (argument->getName() != "$__lldb_arg") { m_error_stream.Format("Internal error [IRForTarget]: Wrapper takes an " "argument named '{0}' instead of the struct pointer", argument->getName()); diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp index 96166657ceeb..341923108e32 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp @@ -802,7 +802,7 @@ bool lldb_private::formatters::NSURLSummaryProvider( llvm::StringRef class_name = descriptor->GetClassName().GetStringRef(); - if (!class_name.equals("NSURL")) + if (class_name != "NSURL") return false; uint64_t offset_text = ptr_size + ptr_size + diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index d88f2d083019..5c6b475044be 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -3557,7 +3557,7 @@ ObjectFile::Strata ObjectFileELF::CalculateStrata() { // decrease by one llvm::StringRef loader_name(buffer, read_size - 1); llvm::StringRef freebsd_kernel_loader_name("/red/herring"); - if (loader_name.equals(freebsd_kernel_loader_name)) + if (loader_name == freebsd_kernel_loader_name) return eStrataKernel; } } diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp index db9fb37a9a3c..74e392249a94 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -1052,10 +1052,10 @@ bool GDBRemoteCommunicationClient::GetGDBServerVersion() { llvm::StringRef name, value; bool success = false; while (response.GetNameColonValue(name, value)) { - if (name.equals("name")) { + if (name == "name") { success = true; m_gdb_server_name = std::string(value); - } else if (name.equals("version")) { + } else if (name == "version") { llvm::StringRef major, minor; std::tie(major, minor) = value.split('.'); if (!major.getAsInteger(0, m_gdb_server_version)) @@ -1192,12 +1192,12 @@ bool GDBRemoteCommunicationClient::GetDefaultThreadId(lldb::tid_t &tid) { static void ParseOSType(llvm::StringRef value, std::string &os_name, std::string &environment) { - if (value.equals("iossimulator") || value.equals("tvossimulator") || - value.equals("watchossimulator") || value.equals("xrossimulator") || - value.equals("visionossimulator")) { + if (value == "iossimulator" || value == "tvossimulator" || + value == "watchossimulator" || value == "xrossimulator" || + value == "visionossimulator") { environment = "simulator"; os_name = value.drop_back(environment.size()).str(); - } else if (value.equals("maccatalyst")) { + } else if (value == "maccatalyst") { os_name = "ios"; environment = "macabi"; } else { @@ -1230,44 +1230,44 @@ bool GDBRemoteCommunicationClient::GetHostInfo(bool force) { ByteOrder byte_order = eByteOrderInvalid; uint32_t num_keys_decoded = 0; while (response.GetNameColonValue(name, value)) { - if (name.equals("cputype")) { + if (name == "cputype") { // exception type in big endian hex if (!value.getAsInteger(0, cpu)) ++num_keys_decoded; - } else if (name.equals("cpusubtype")) { + } else if (name == "cpusubtype") { // exception count in big endian hex if (!value.getAsInteger(0, sub)) ++num_keys_decoded; - } else if (name.equals("arch")) { + } else if (name == "arch") { arch_name = std::string(value); ++num_keys_decoded; - } else if (name.equals("triple")) { + } else if (name == "triple") { StringExtractor extractor(value); extractor.GetHexByteString(triple); ++num_keys_decoded; - } else if (name.equals("distribution_id")) { + } else if (name == "distribution_id") { StringExtractor extractor(value); extractor.GetHexByteString(m_host_distribution_id); ++num_keys_decoded; - } else if (name.equals("os_build")) { + } else if (name == "os_build") { StringExtractor extractor(value); extractor.GetHexByteString(m_os_build); ++num_keys_decoded; - } else if (name.equals("hostname")) { + } else if (name == "hostname") { StringExtractor extractor(value); extractor.GetHexByteString(m_hostname); ++num_keys_decoded; - } else if (name.equals("os_kernel")) { + } else if (name == "os_kernel") { StringExtractor extractor(value); extractor.GetHexByteString(m_os_kernel); ++num_keys_decoded; - } else if (name.equals("ostype")) { + } else if (name == "ostype") { ParseOSType(value, os_name, environment); ++num_keys_decoded; - } else if (name.equals("vendor")) { + } else if (name == "vendor") { vendor_name = std::string(value); ++num_keys_decoded; - } else if (name.equals("endian")) { + } else if (name == "endian") { byte_order = llvm::StringSwitch(value) .Case("little", eByteOrderLittle) .Case("big", eByteOrderBig) @@ -1275,30 +1275,30 @@ bool GDBRemoteCommunicationClient::GetHostInfo(bool force) { .Default(eByteOrderInvalid); if (byte_order != eByteOrderInvalid) ++num_keys_decoded; - } else if (name.equals("ptrsize")) { + } else if (name == "ptrsize") { if (!value.getAsInteger(0, pointer_byte_size)) ++num_keys_decoded; - } else if (name.equals("addressing_bits")) { + } else if (name == "addressing_bits") { if (!value.getAsInteger(0, m_low_mem_addressing_bits)) { ++num_keys_decoded; } - } else if (name.equals("high_mem_addressing_bits")) { + } else if (name == "high_mem_addressing_bits") { if (!value.getAsInteger(0, m_high_mem_addressing_bits)) ++num_keys_decoded; - } else if (name.equals("low_mem_addressing_bits")) { + } else if (name == "low_mem_addressing_bits") { if (!value.getAsInteger(0, m_low_mem_addressing_bits)) ++num_keys_decoded; - } else if (name.equals("os_version") || - name.equals("version")) // Older debugserver binaries used - // the "version" key instead of - // "os_version"... + } else if (name == "os_version" || + name == "version") // Older debugserver binaries used + // the "version" key instead of + // "os_version"... { if (!m_os_version.tryParse(value)) ++num_keys_decoded; - } else if (name.equals("maccatalyst_version")) { + } else if (name == "maccatalyst_version") { if (!m_maccatalyst_version.tryParse(value)) ++num_keys_decoded; - } else if (name.equals("watchpoint_exceptions_received")) { + } else if (name == "watchpoint_exceptions_received") { m_watchpoints_trigger_after_instruction = llvm::StringSwitch(value) .Case("before", eLazyBoolNo) @@ -1306,14 +1306,14 @@ bool GDBRemoteCommunicationClient::GetHostInfo(bool force) { .Default(eLazyBoolCalculate); if (m_watchpoints_trigger_after_instruction != eLazyBoolCalculate) ++num_keys_decoded; - } else if (name.equals("default_packet_timeout")) { + } else if (name == "default_packet_timeout") { uint32_t timeout_seconds; if (!value.getAsInteger(0, timeout_seconds)) { m_default_packet_timeout = seconds(timeout_seconds); SetPacketTimeout(m_default_packet_timeout); ++num_keys_decoded; } - } else if (name.equals("vm-page-size")) { + } else if (name == "vm-page-size") { int page_size; if (!value.getAsInteger(0, page_size)) { m_target_vm_page_size = page_size; @@ -1568,10 +1568,10 @@ Status GDBRemoteCommunicationClient::GetMemoryRegionInfo( bool success = true; bool saw_permissions = false; while (success && response.GetNameColonValue(name, value)) { - if (name.equals("start")) { + if (name == "start") { if (!value.getAsInteger(16, addr_value)) region_info.GetRange().SetRangeBase(addr_value); - } else if (name.equals("size")) { + } else if (name == "size") { if (!value.getAsInteger(16, addr_value)) { region_info.GetRange().SetByteSize(addr_value); if (region_info.GetRange().GetRangeEnd() < @@ -1580,8 +1580,7 @@ Status GDBRemoteCommunicationClient::GetMemoryRegionInfo( region_info.GetRange().SetRangeEnd(LLDB_INVALID_ADDRESS); } } - } else if (name.equals("permissions") && - region_info.GetRange().IsValid()) { + } else if (name == "permissions" && region_info.GetRange().IsValid()) { saw_permissions = true; if (region_info.GetRange().Contains(addr)) { if (value.contains('r')) @@ -1608,12 +1607,12 @@ Status GDBRemoteCommunicationClient::GetMemoryRegionInfo( region_info.SetExecutable(MemoryRegionInfo::eNo); region_info.SetMapped(MemoryRegionInfo::eNo); } - } else if (name.equals("name")) { + } else if (name == "name") { StringExtractorGDBRemote name_extractor(value); std::string name; name_extractor.GetHexByteString(name); region_info.SetName(name.c_str()); - } else if (name.equals("flags")) { + } else if (name == "flags") { region_info.SetMemoryTagged(MemoryRegionInfo::eNo); llvm::StringRef flags = value; @@ -1629,7 +1628,7 @@ Status GDBRemoteCommunicationClient::GetMemoryRegionInfo( } } } - } else if (name.equals("type")) { + } else if (name == "type") { std::string comma_sep_str = value.str(); size_t comma_pos; while ((comma_pos = comma_sep_str.find(',')) != std::string::npos) { @@ -1642,13 +1641,13 @@ Status GDBRemoteCommunicationClient::GetMemoryRegionInfo( if (comma_sep_str == "stack") { region_info.SetIsStackMemory(MemoryRegionInfo::eYes); } - } else if (name.equals("error")) { + } else if (name == "error") { StringExtractorGDBRemote error_extractor(value); std::string error_string; // Now convert the HEX bytes into a string value error_extractor.GetHexByteString(error_string); error.SetErrorString(error_string.c_str()); - } else if (name.equals("dirty-pages")) { + } else if (name == "dirty-pages") { std::vector dirty_page_list; for (llvm::StringRef x : llvm::split(value, ',')) { addr_t page; @@ -1825,7 +1824,7 @@ std::optional GDBRemoteCommunicationClient::GetWatchpointSlotCount() { llvm::StringRef name; llvm::StringRef value; while (response.GetNameColonValue(name, value)) { - if (name.equals("num")) { + if (name == "num") { value.getAsInteger(0, m_num_supported_hardware_watchpoints); num = m_num_supported_hardware_watchpoints; } @@ -2006,43 +2005,43 @@ bool GDBRemoteCommunicationClient::DecodeProcessInfoResponse( std::string os_type; while (response.GetNameColonValue(name, value)) { - if (name.equals("pid")) { + if (name == "pid") { lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; value.getAsInteger(0, pid); process_info.SetProcessID(pid); - } else if (name.equals("ppid")) { + } else if (name == "ppid") { lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; value.getAsInteger(0, pid); process_info.SetParentProcessID(pid); - } else if (name.equals("uid")) { + } else if (name == "uid") { uint32_t uid = UINT32_MAX; value.getAsInteger(0, uid); process_info.SetUserID(uid); - } else if (name.equals("euid")) { + } else if (name == "euid") { uint32_t uid = UINT32_MAX; value.getAsInteger(0, uid); process_info.SetEffectiveUserID(uid); - } else if (name.equals("gid")) { + } else if (name == "gid") { uint32_t gid = UINT32_MAX; value.getAsInteger(0, gid); process_info.SetGroupID(gid); - } else if (name.equals("egid")) { + } else if (name == "egid") { uint32_t gid = UINT32_MAX; value.getAsInteger(0, gid); process_info.SetEffectiveGroupID(gid); - } else if (name.equals("triple")) { + } else if (name == "triple") { StringExtractor extractor(value); std::string triple; extractor.GetHexByteString(triple); process_info.GetArchitecture().SetTriple(triple.c_str()); - } else if (name.equals("name")) { + } else if (name == "name") { StringExtractor extractor(value); // The process name from ASCII hex bytes since we can't control the // characters in a process name std::string name; extractor.GetHexByteString(name); process_info.GetExecutableFile().SetFile(name, FileSpec::Style::native); - } else if (name.equals("args")) { + } else if (name == "args") { llvm::StringRef encoded_args(value), hex_arg; bool is_arg0 = true; @@ -2062,13 +2061,13 @@ bool GDBRemoteCommunicationClient::DecodeProcessInfoResponse( process_info.GetArguments().AppendArgument(arg); is_arg0 = false; } - } else if (name.equals("cputype")) { + } else if (name == "cputype") { value.getAsInteger(0, cpu); - } else if (name.equals("cpusubtype")) { + } else if (name == "cpusubtype") { value.getAsInteger(0, sub); - } else if (name.equals("vendor")) { + } else if (name == "vendor") { vendor = std::string(value); - } else if (name.equals("ostype")) { + } else if (name == "ostype") { os_type = std::string(value); } } @@ -2144,10 +2143,10 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) { uint32_t num_keys_decoded = 0; lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; while (response.GetNameColonValue(name, value)) { - if (name.equals("cputype")) { + if (name == "cputype") { if (!value.getAsInteger(16, cpu)) ++num_keys_decoded; - } else if (name.equals("cpusubtype")) { + } else if (name == "cpusubtype") { if (!value.getAsInteger(16, sub)) { ++num_keys_decoded; // Workaround for pre-2024 Apple debugserver, which always @@ -2162,17 +2161,17 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) { sub = 0; } } - } else if (name.equals("triple")) { + } else if (name == "triple") { StringExtractor extractor(value); extractor.GetHexByteString(triple); ++num_keys_decoded; - } else if (name.equals("ostype")) { + } else if (name == "ostype") { ParseOSType(value, os_name, environment); ++num_keys_decoded; - } else if (name.equals("vendor")) { + } else if (name == "vendor") { vendor_name = std::string(value); ++num_keys_decoded; - } else if (name.equals("endian")) { + } else if (name == "endian") { byte_order = llvm::StringSwitch(value) .Case("little", eByteOrderLittle) .Case("big", eByteOrderBig) @@ -2180,19 +2179,19 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) { .Default(eByteOrderInvalid); if (byte_order != eByteOrderInvalid) ++num_keys_decoded; - } else if (name.equals("ptrsize")) { + } else if (name == "ptrsize") { if (!value.getAsInteger(16, pointer_byte_size)) ++num_keys_decoded; - } else if (name.equals("pid")) { + } else if (name == "pid") { if (!value.getAsInteger(16, pid)) ++num_keys_decoded; - } else if (name.equals("elf_abi")) { + } else if (name == "elf_abi") { elf_abi = std::string(value); ++num_keys_decoded; - } else if (name.equals("main-binary-uuid")) { + } else if (name == "main-binary-uuid") { m_process_standalone_uuid.SetFromStringRef(value); ++num_keys_decoded; - } else if (name.equals("main-binary-slide")) { + } else if (name == "main-binary-slide") { StringExtractor extractor(value); m_process_standalone_value = extractor.GetU64(LLDB_INVALID_ADDRESS, 16); @@ -2200,7 +2199,7 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) { m_process_standalone_value_is_offset = true; ++num_keys_decoded; } - } else if (name.equals("main-binary-address")) { + } else if (name == "main-binary-address") { StringExtractor extractor(value); m_process_standalone_value = extractor.GetU64(LLDB_INVALID_ADDRESS, 16); @@ -2208,7 +2207,7 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) { m_process_standalone_value_is_offset = false; ++num_keys_decoded; } - } else if (name.equals("binary-addresses")) { + } else if (name == "binary-addresses") { m_binary_addresses.clear(); ++num_keys_decoded; for (llvm::StringRef x : llvm::split(value, ',')) { @@ -2647,9 +2646,9 @@ bool GDBRemoteCommunicationClient::LaunchGDBServer( llvm::StringRef name; llvm::StringRef value; while (response.GetNameColonValue(name, value)) { - if (name.equals("port")) + if (name == "port") value.getAsInteger(0, port); - else if (name.equals("pid")) + else if (name == "pid") value.getAsInteger(0, pid); else if (name.compare("socket_name") == 0) { StringExtractor extractor(value); diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp index b4fb5b68dd41..f9d37490e16a 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp @@ -340,13 +340,13 @@ GDBRemoteCommunicationServerCommon::Handle_qfProcessInfo( llvm::StringRef value; while (packet.GetNameColonValue(key, value)) { bool success = true; - if (key.equals("name")) { + if (key == "name") { StringExtractor extractor(value); std::string file; extractor.GetHexByteString(file); match_info.GetProcessInfo().GetExecutableFile().SetFile( file, FileSpec::Style::native); - } else if (key.equals("name_match")) { + } else if (key == "name_match") { NameMatch name_match = llvm::StringSwitch(value) .Case("equals", NameMatch::Equals) .Case("starts_with", NameMatch::StartsWith) @@ -357,40 +357,40 @@ GDBRemoteCommunicationServerCommon::Handle_qfProcessInfo( match_info.SetNameMatchType(name_match); if (name_match == NameMatch::Ignore) return SendErrorResponse(2); - } else if (key.equals("pid")) { + } else if (key == "pid") { lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; if (value.getAsInteger(0, pid)) return SendErrorResponse(2); match_info.GetProcessInfo().SetProcessID(pid); - } else if (key.equals("parent_pid")) { + } else if (key == "parent_pid") { lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; if (value.getAsInteger(0, pid)) return SendErrorResponse(2); match_info.GetProcessInfo().SetParentProcessID(pid); - } else if (key.equals("uid")) { + } else if (key == "uid") { uint32_t uid = UINT32_MAX; if (value.getAsInteger(0, uid)) return SendErrorResponse(2); match_info.GetProcessInfo().SetUserID(uid); - } else if (key.equals("gid")) { + } else if (key == "gid") { uint32_t gid = UINT32_MAX; if (value.getAsInteger(0, gid)) return SendErrorResponse(2); match_info.GetProcessInfo().SetGroupID(gid); - } else if (key.equals("euid")) { + } else if (key == "euid") { uint32_t uid = UINT32_MAX; if (value.getAsInteger(0, uid)) return SendErrorResponse(2); match_info.GetProcessInfo().SetEffectiveUserID(uid); - } else if (key.equals("egid")) { + } else if (key == "egid") { uint32_t gid = UINT32_MAX; if (value.getAsInteger(0, gid)) return SendErrorResponse(2); match_info.GetProcessInfo().SetEffectiveGroupID(gid); - } else if (key.equals("all_users")) { + } else if (key == "all_users") { match_info.SetMatchAllUsers( OptionArgParser::ToBoolean(value, false, &success)); - } else if (key.equals("triple")) { + } else if (key == "triple") { match_info.GetProcessInfo().GetArchitecture() = HostInfo::GetAugmentedArchSpec(value); } else { @@ -472,7 +472,7 @@ GDBRemoteCommunicationServerCommon::Handle_qSpeedTest( llvm::StringRef key; llvm::StringRef value; bool success = packet.GetNameColonValue(key, value); - if (success && key.equals("response_size")) { + if (success && key == "response_size") { uint32_t response_size = 0; if (!value.getAsInteger(0, response_size)) { if (response_size == 0) diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp index 391abdae2752..5285ec1d3db4 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp @@ -239,9 +239,9 @@ GDBRemoteCommunicationServerPlatform::Handle_qLaunchGDBServer( llvm::StringRef value; std::optional port; while (packet.GetNameColonValue(name, value)) { - if (name.equals("host")) + if (name == "host") hostname = std::string(value); - else if (name.equals("port")) { + else if (name == "port") { // Make the Optional valid so we can use its value port = 0; value.getAsInteger(0, *port); diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 871683a60568..a5a731981299 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -448,20 +448,20 @@ void ProcessGDBRemote::BuildDynamicRegisterInfo(bool force) { DynamicRegisterInfo::Register reg_info; while (response.GetNameColonValue(name, value)) { - if (name.equals("name")) { + if (name == "name") { reg_info.name.SetString(value); - } else if (name.equals("alt-name")) { + } else if (name == "alt-name") { reg_info.alt_name.SetString(value); - } else if (name.equals("bitsize")) { + } else if (name == "bitsize") { if (!value.getAsInteger(0, reg_info.byte_size)) reg_info.byte_size /= CHAR_BIT; - } else if (name.equals("offset")) { + } else if (name == "offset") { value.getAsInteger(0, reg_info.byte_offset); - } else if (name.equals("encoding")) { + } else if (name == "encoding") { const Encoding encoding = Args::StringToEncoding(value); if (encoding != eEncodingInvalid) reg_info.encoding = encoding; - } else if (name.equals("format")) { + } else if (name == "format") { if (!OptionArgParser::ToFormat(value.str().c_str(), reg_info.format, nullptr) .Success()) reg_info.format = @@ -480,17 +480,17 @@ void ProcessGDBRemote::BuildDynamicRegisterInfo(bool force) { .Case("vector-uint64", eFormatVectorOfUInt64) .Case("vector-uint128", eFormatVectorOfUInt128) .Default(eFormatInvalid); - } else if (name.equals("set")) { + } else if (name == "set") { reg_info.set_name.SetString(value); - } else if (name.equals("gcc") || name.equals("ehframe")) { + } else if (name == "gcc" || name == "ehframe") { value.getAsInteger(0, reg_info.regnum_ehframe); - } else if (name.equals("dwarf")) { + } else if (name == "dwarf") { value.getAsInteger(0, reg_info.regnum_dwarf); - } else if (name.equals("generic")) { + } else if (name == "generic") { reg_info.regnum_generic = Args::StringToGenericRegister(value); - } else if (name.equals("container-regs")) { + } else if (name == "container-regs") { SplitCommaSeparatedRegisterNumberString(value, reg_info.value_regs, 16); - } else if (name.equals("invalidate-regs")) { + } else if (name == "invalidate-regs") { SplitCommaSeparatedRegisterNumberString(value, reg_info.invalidate_regs, 16); } } @@ -5082,7 +5082,7 @@ std::string ProcessGDBRemote::HarmonizeThreadIdsForProfileData( llvm::StringRef usec_name, usec_value; uint32_t input_file_pos = profileDataExtractor.GetFilePos(); if (profileDataExtractor.GetNameColonValue(usec_name, usec_value)) { - if (usec_name.equals("thread_used_usec")) { + if (usec_name == "thread_used_usec") { has_used_usec = true; usec_value.getAsInteger(0, curr_used_usec); } else { diff --git a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp index e915bff9e4a4..d656ca3facf7 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp @@ -1139,7 +1139,7 @@ PDBASTParser::FindNamespaceDecl(const clang::DeclContext *parent, assert(set); for (clang::NamespaceDecl *namespace_decl : *set) - if (namespace_decl->getName().equals(name)) + if (namespace_decl->getName() == name) return namespace_decl; for (clang::NamespaceDecl *namespace_decl : *set) diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index b26beecc6d12..9a282acae91f 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1141,8 +1141,8 @@ void SymbolFilePDB::FindGlobalVariables( sc.module_sp = m_objfile_sp->GetModule(); lldbassert(sc.module_sp.get()); - if (!name.GetStringRef().equals( - MSVCUndecoratedNameParser::DropScope(pdb_data->getName()))) + if (name.GetStringRef() != + MSVCUndecoratedNameParser::DropScope(pdb_data->getName())) continue; sc.comp_unit = ParseCompileUnitForUID(GetCompilandId(*pdb_data)).get(); diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 17a9c675fbba..582d9eac3e1d 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -6692,7 +6692,7 @@ size_t TypeSystemClang::GetIndexOfChildMemberWithName( return child_indexes.size(); child_indexes.pop_back(); - } else if (field_name.equals(name)) { + } else if (field_name == name) { // We have to add on the number of base classes to this index! child_indexes.push_back( child_idx + TypeSystemClang::GetNumBaseClasses( @@ -6779,7 +6779,7 @@ size_t TypeSystemClang::GetIndexOfChildMemberWithName( ivar_pos != ivar_end; ++ivar_pos, ++child_idx) { const clang::ObjCIvarDecl *ivar_decl = *ivar_pos; - if (ivar_decl->getName().equals(name_sref)) { + if (ivar_decl->getName() == name_sref) { if ((!omit_empty_base_classes && superclass_interface_decl) || (omit_empty_base_classes && ObjCDeclHasIVars(superclass_interface_decl, true))) @@ -6948,7 +6948,7 @@ TypeSystemClang::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++child_idx) { - if (field->getName().equals(name)) + if (field->getName() == name) return child_idx; } } @@ -6975,7 +6975,7 @@ TypeSystemClang::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, ivar_pos != ivar_end; ++ivar_pos, ++child_idx) { const clang::ObjCIvarDecl *ivar_decl = *ivar_pos; - if (ivar_decl->getName().equals(name)) { + if (ivar_decl->getName() == name) { if ((!omit_empty_base_classes && superclass_interface_decl) || (omit_empty_base_classes && ObjCDeclHasIVars(superclass_interface_decl, true))) @@ -6986,7 +6986,7 @@ TypeSystemClang::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, } if (superclass_interface_decl) { - if (superclass_interface_decl->getName().equals(name)) + if (superclass_interface_decl->getName() == name) return 0; } } @@ -9231,15 +9231,14 @@ std::vector TypeSystemClang::DeclContextFindDeclByName( if (clang::NamedDecl *nd = llvm::dyn_cast(target)) { IdentifierInfo *ii = nd->getIdentifier(); - if (ii != nullptr && - ii->getName().equals(name.AsCString(nullptr))) + if (ii != nullptr && ii->getName() == name.AsCString(nullptr)) found_decls.push_back(GetCompilerDecl(nd)); } } } else if (clang::NamedDecl *nd = llvm::dyn_cast(child)) { IdentifierInfo *ii = nd->getIdentifier(); - if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr))) + if (ii != nullptr && ii->getName() == name.AsCString(nullptr)) found_decls.push_back(GetCompilerDecl(nd)); } } @@ -9349,7 +9348,7 @@ uint32_t TypeSystemClang::CountDeclLevels(clang::DeclContext *frame_decl_ctx, // Check names. IdentifierInfo *ii = nd->getIdentifier(); if (ii == nullptr || - !ii->getName().equals(child_name->AsCString(nullptr))) + ii->getName() != child_name->AsCString(nullptr)) continue; // Check types, if one was provided. if (child_type) { diff --git a/lldb/source/Target/PathMappingList.cpp b/lldb/source/Target/PathMappingList.cpp index c369018122a5..9c283b0146fe 100644 --- a/lldb/source/Target/PathMappingList.cpp +++ b/lldb/source/Target/PathMappingList.cpp @@ -86,8 +86,8 @@ bool PathMappingList::AppendUnique(llvm::StringRef path, auto normalized_replacement = NormalizePath(replacement); std::lock_guard lock(m_mutex); for (const auto &pair : m_pairs) { - if (pair.first.GetStringRef().equals(normalized_path) && - pair.second.GetStringRef().equals(normalized_replacement)) + if (pair.first.GetStringRef() == normalized_path && + pair.second.GetStringRef() == normalized_replacement) return false; } Append(path, replacement, notify); -- GitLab From 5d8354c009d5625fa140be47de1f91275f4698d3 Mon Sep 17 00:00:00 2001 From: harishch4 Date: Fri, 17 May 2024 09:20:52 +0530 Subject: [PATCH 0007/1875] [Flang][OpenMP]Missing convert to lhsType in atomic write (#92346) Fixes test.f90 in #83144. This issue is observed only when a boolean constant is assigned to a logical variable. In non-openmp flow, a conversion op is inserted before assigning it to a logical variable. This patch will insert a fir.convert operation when the types are not the same, before generating the atomic write operation. I've proposed another patch(#85059 ) which removes checks at MLIR level and looks like it's too permissive. I'm planning to abandon this patch and address it here. --- flang/lib/Lower/DirectivesCommon.h | 3 +++ flang/test/Lower/OpenMP/atomic-write.f90 | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/flang/lib/Lower/DirectivesCommon.h b/flang/lib/Lower/DirectivesCommon.h index 42bd3868196b..48b090f6d2db 100644 --- a/flang/lib/Lower/DirectivesCommon.h +++ b/flang/lib/Lower/DirectivesCommon.h @@ -180,6 +180,9 @@ static inline void genOmpAccAtomicWriteStatement( // Generate `atomic.write` operation for atomic assignment statements fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); + mlir::Type varType = fir::unwrapRefType(lhsAddr.getType()); + rhsExpr = firOpBuilder.createConvert(loc, varType, rhsExpr); + if constexpr (std::is_same()) { // If no hint clause is specified, the effect is as if diff --git a/flang/test/Lower/OpenMP/atomic-write.f90 b/flang/test/Lower/OpenMP/atomic-write.f90 index 85955af64bbe..e0fa802976d9 100644 --- a/flang/test/Lower/OpenMP/atomic-write.f90 +++ b/flang/test/Lower/OpenMP/atomic-write.f90 @@ -73,3 +73,17 @@ subroutine atomic_write_typed_assign !$omp atomic write r2 = 0 end subroutine + +!CHECK-LABEL: func.func @_QPatomic_write_logical() +!CHECK: %[[L_REF:.*]] = fir.alloca !fir.logical<4> {bindc_name = "l", uniq_name = "_QFatomic_write_logicalEl"} +!CHECK: %[[L_DECL:.*]]:2 = hlfir.declare %[[L_REF]] {uniq_name = "_QFatomic_write_logicalEl"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) +!CHECK: %true = arith.constant true +!CHECK: %[[CVT:.*]] = fir.convert %true : (i1) -> !fir.logical<4> +!CHECK: omp.atomic.write %[[L_DECL]]#1 = %[[CVT]] : !fir.ref>, !fir.logical<4> + +subroutine atomic_write_logical + logical :: l + !$omp atomic write + l = .true. + !$omp end atomic +end -- GitLab From d395b56a52e9809ec3ea1139f5b30698c9f4e247 Mon Sep 17 00:00:00 2001 From: Pavel Samolysov Date: Fri, 17 May 2024 07:46:43 +0300 Subject: [PATCH 0008/1875] [JITLink][AArch64] Implement R_AARCH64_LDR_PREL_LO19 (#82172) This relocation is used for the 32-bit aligned 21-bit immediate in LDR Literal instructions. --- .../llvm/ExecutionEngine/JITLink/aarch64.h | 22 ++++++++++++++----- .../ExecutionEngine/JITLink/ELF_aarch64.cpp | 12 ++++++++++ .../JITLink/AArch64/ELF_relocations.s | 11 ++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h b/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h index 40b9339eb531..c09398f98447 100644 --- a/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h @@ -171,7 +171,14 @@ enum EdgeKind_aarch64 : Edge::Kind { /// /// Fixup expression: /// - /// Fixup <- (Target - Fixup) >> 2 : int19 + /// Fixup <- (Target - Fixup + Addend) >> 2 : int19 + /// + /// Notes: + /// The '19' in the name refers to the number operand bits and follows the + /// naming convention used by the corresponding ELF relocation. + /// Since the low two bits must be zero (because of the 32-bit alignment of + /// the target) the operand is effectively a signed 21-bit number. + /// /// /// Errors: /// - The result of the unshifted part of the fixup expression must be @@ -377,6 +384,11 @@ inline bool isADR(uint32_t Instr) { return (Instr & ADRMask) == 0x10000000; } +inline bool isLDRLiteral(uint32_t Instr) { + constexpr uint32_t LDRLitMask = 0x3b000000; + return (Instr & LDRLitMask) == 0x18000000; +} + // Returns the amount the address operand of LD/ST (imm12) // should be shifted right by. // @@ -494,16 +506,14 @@ inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E) { } case LDRLiteral19: { assert((FixupAddress.getValue() & 0x3) == 0 && "LDR is not 32-bit aligned"); - assert(E.getAddend() == 0 && "LDRLiteral19 with non-zero addend"); uint32_t RawInstr = *(ulittle32_t *)FixupPtr; - assert(RawInstr == 0x58000010 && "RawInstr isn't a 64-bit LDR literal"); - int64_t Delta = E.getTarget().getAddress() - FixupAddress; + assert(isLDRLiteral(RawInstr) && "RawInstr is not an LDR Literal"); + int64_t Delta = E.getTarget().getAddress() + E.getAddend() - FixupAddress; if (Delta & 0x3) return make_error("LDR literal target is not 32-bit " "aligned"); - if (Delta < -(1 << 20) || Delta > ((1 << 20) - 1)) + if (!isInt<21>(Delta)) return makeTargetOutOfRangeError(G, B, E); - uint32_t EncodedImm = ((static_cast(Delta) >> 2) & 0x7ffff) << 5; uint32_t FixedInstr = RawInstr | EncodedImm; *(ulittle32_t *)FixupPtr = FixedInstr; diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp index 6b03bb3c90b2..9ce8aecb717c 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp @@ -49,6 +49,7 @@ class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder { private: enum ELFAArch64RelocationKind : Edge::Kind { ELFCall26 = Edge::FirstRelocation, + ELFLdrLo19, ELFAdrLo21, ELFAdrPage21, ELFAddAbs12, @@ -82,6 +83,8 @@ private: case ELF::R_AARCH64_CALL26: case ELF::R_AARCH64_JUMP26: return ELFCall26; + case ELF::R_AARCH64_LD_PREL_LO19: + return ELFLdrLo19; case ELF::R_AARCH64_ADR_PREL_LO21: return ELFAdrLo21; case ELF::R_AARCH64_ADR_PREL_PG_HI21: @@ -191,6 +194,15 @@ private: Kind = aarch64::Branch26PCRel; break; } + case ELFLdrLo19: { + uint32_t Instr = *(const ulittle32_t *)FixupContent; + if (!aarch64::isLDRLiteral(Instr)) + return make_error( + "R_AARCH64_LDR_PREL_LO19 target is not an LDR Literal instruction"); + + Kind = aarch64::LDRLiteral19; + break; + } case ELFAdrLo21: { uint32_t Instr = *(const ulittle32_t *)FixupContent; if (!aarch64::isADR(Instr)) diff --git a/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_relocations.s b/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_relocations.s index fccef479c2c3..75e367bee80a 100644 --- a/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_relocations.s +++ b/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_relocations.s @@ -51,6 +51,17 @@ test_adr_prel_lo21: ## to test this bit better adr_data = test_adr_prel_lo21 + 0xe46f2 +# Check R_AARCH64_LD_PREL_LO19 relocation of a local symbol +# +# jitlink-check: decode_operand(test_ldr_prel_lo19 + 0, 1)[19:0] = \ +# jitlink-check: (ldr_data - test_ldr_prel_lo19 + 0x4)[21:2] + .globl test_ldr_prel_lo19, ldr_data + .p2align 2 +test_ldr_prel_lo19: + ldr x0, ldr_data + 0x4 + .size test_ldr_prel_lo19, .-test_ldr_prel_lo19 +ldr_data = test_ldr_prel_lo19 + 4 + # Check R_AARCH64_ADR_PREL_PG_HI21 / R_AARCH64_ADD_ABS_LO12_NC relocation of a local symbol # # For the ADR_PREL_PG_HI21/ADRP instruction we have the 21-bit delta to the 4k page -- GitLab From aaa8a8000009890b79effb0d0f3c6f989a3d5563 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Thu, 16 May 2024 21:53:54 -0700 Subject: [PATCH 0009/1875] [CodeGen] Use operator==(StringRef, StringRef) (NFC) The LHS and RHS are of SmallString and StringRef, respectively. We can safely use operator==(StringRef, SringRef) with one implicit conversion from SmallString to StringRef. --- llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp b/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp index 6eef5d2c50a2..fa5464026516 100644 --- a/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp +++ b/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp @@ -170,7 +170,7 @@ Error BasicBlockSectionsProfileReader::ReadV1Profile() { return false; // Return a match if debug-info-filename is not specified. Otherwise, // check for equality. - return DIFilename.empty() || It->second.equals(DIFilename); + return DIFilename.empty() || It->second == DIFilename; }); if (!FunctionFound) { // Skip the following profile by setting the profile iterator (FI) to @@ -317,7 +317,7 @@ Error BasicBlockSectionsProfileReader::ReadV0Profile() { return false; // Return a match if debug-info-filename is not specified. Otherwise, // check for equality. - return DIFilename.empty() || It->second.equals(DIFilename); + return DIFilename.empty() || It->second == DIFilename; }); if (!FunctionFound) { // Skip the following profile by setting the profile iterator (FI) to -- GitLab From a26fbf36a78a703be2da0744131a8d6ecbdb7c67 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Thu, 16 May 2024 22:04:03 -0700 Subject: [PATCH 0010/1875] [Sema] Use SmallString::empty (NFC) --- clang/lib/Sema/SemaDeclAttr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 777171f4f15f..3760a4c917ad 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3645,7 +3645,7 @@ bool Sema::checkTargetClonesAttrString( llvm::sort(CurFeatures); SmallString<64> Res; for (auto &CurFeat : CurFeatures) { - if (!Res.equals("")) + if (!Res.empty()) Res.append("+"); Res.append(CurFeat); } -- GitLab From f4066fa2dd21c65bf0e24a479634c9a2d276cf8e Mon Sep 17 00:00:00 2001 From: Serge Pavlov Date: Fri, 17 May 2024 12:06:34 +0700 Subject: [PATCH 0011/1875] [clang] Use constant rounding mode for floating literals (#90877) Conversion of floating-point literal to binary representation must be made using constant rounding mode, which can be changed using pragma FENV_ROUND. For example, the literal "0.1F" should be representes by either 0.099999994 or 0.100000001 depending on the rounding direction. --- clang/include/clang/Lex/LiteralSupport.h | 10 +-- clang/lib/Lex/LiteralSupport.cpp | 6 +- clang/lib/Sema/SemaExpr.cpp | 5 +- clang/test/AST/const-fpfeatures.c | 6 ++ clang/test/AST/const-fpfeatures.cpp | 105 +++++++++++++++++++++++ 5 files changed, 122 insertions(+), 10 deletions(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index 2ed42d1c5f9a..705021fcfa5b 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -118,12 +118,10 @@ public: /// bits of the result and return true. Otherwise, return false. bool GetIntegerValue(llvm::APInt &Val); - /// GetFloatValue - Convert this numeric literal to a floating value, using - /// the specified APFloat fltSemantics (specifying float, double, etc). - /// The optional bool isExact (passed-by-reference) has its value - /// set to true if the returned APFloat can represent the number in the - /// literal exactly, and false otherwise. - llvm::APFloat::opStatus GetFloatValue(llvm::APFloat &Result); + /// Convert this numeric literal to a floating value, using the specified + /// APFloat fltSemantics (specifying float, double, etc) and rounding mode. + llvm::APFloat::opStatus GetFloatValue(llvm::APFloat &Result, + llvm::RoundingMode RM); /// GetFixedPointValue - Convert this numeric literal value into a /// scaled integer that represents this value. Returns true if an overflow diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 9c0cbea5052c..3df0391bdda7 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -1520,7 +1520,8 @@ bool NumericLiteralParser::GetIntegerValue(llvm::APInt &Val) { } llvm::APFloat::opStatus -NumericLiteralParser::GetFloatValue(llvm::APFloat &Result) { +NumericLiteralParser::GetFloatValue(llvm::APFloat &Result, + llvm::RoundingMode RM) { using llvm::APFloat; unsigned n = std::min(SuffixBegin - ThisTokBegin, ThisTokEnd - ThisTokBegin); @@ -1534,8 +1535,7 @@ NumericLiteralParser::GetFloatValue(llvm::APFloat &Result) { Str = Buffer; } - auto StatusOrErr = - Result.convertFromString(Str, APFloat::rmNearestTiesToEven); + auto StatusOrErr = Result.convertFromString(Str, RM); assert(StatusOrErr && "Invalid floating point representation"); return !errorToBool(StatusOrErr.takeError()) ? *StatusOrErr : APFloat::opInvalidOp; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 274e1fb18353..e0aae6333e1a 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3699,7 +3699,10 @@ static Expr *BuildFloatingLiteral(Sema &S, NumericLiteralParser &Literal, using llvm::APFloat; APFloat Val(Format); - APFloat::opStatus result = Literal.GetFloatValue(Val); + llvm::RoundingMode RM = S.CurFPFeatures.getRoundingMode(); + if (RM == llvm::RoundingMode::Dynamic) + RM = llvm::RoundingMode::NearestTiesToEven; + APFloat::opStatus result = Literal.GetFloatValue(Val, RM); // Overflow is always an error, but underflow is only an error if // we underflowed to zero (APFloat reports denormals as underflow). diff --git a/clang/test/AST/const-fpfeatures.c b/clang/test/AST/const-fpfeatures.c index 083350fdc8ce..8dc3221b0638 100644 --- a/clang/test/AST/const-fpfeatures.c +++ b/clang/test/AST/const-fpfeatures.c @@ -19,6 +19,9 @@ float FI1u = 0xFFFFFFFFU; float _Complex C1u = C0; // CHECK: @C1u = {{.*}} { float, float } { float 0x3FF0000020000000, float 0x3FF0000020000000 } +float FLu = 0.1F; +// CHECK: @FLu = {{.*}} float 0x3FB99999A0000000 + #pragma STDC FENV_ROUND FE_DOWNWARD @@ -35,3 +38,6 @@ float FI1d = 0xFFFFFFFFU; float _Complex C1d = C0; // CHECK: @C1d = {{.*}} { float, float } { float 1.000000e+00, float 1.000000e+00 } + +float FLd = 0.1F; +// CHECK: @FLd = {{.*}} float 0x3FB9999980000000 diff --git a/clang/test/AST/const-fpfeatures.cpp b/clang/test/AST/const-fpfeatures.cpp index 95eb613df7f0..5e903c8c0e87 100644 --- a/clang/test/AST/const-fpfeatures.cpp +++ b/clang/test/AST/const-fpfeatures.cpp @@ -79,3 +79,108 @@ float V7 = []() -> float { 0x0.000001p0F); }(); // CHECK: @V7 = {{.*}} float 1.000000e+00 + +#pragma STDC FENV_ROUND FE_DYNAMIC + +template struct L { + constexpr L() : value(V) {} + float value; +}; + +#pragma STDC FENV_ROUND FE_DOWNWARD +L<0.1F> val_d; +// CHECK: @val_d = {{.*}} { float 0x3FB9999980000000 } + +#pragma STDC FENV_ROUND FE_UPWARD +L<0.1F> val_u; +// CHECK: @val_u = {{.*}} { float 0x3FB99999A0000000 } + + +// Check literals in macros. + +#pragma STDC FENV_ROUND FE_DOWNWARD +#define CONSTANT_0_1 0.1F + +#pragma STDC FENV_ROUND FE_UPWARD +float C1_ru = CONSTANT_0_1; +// CHECK: @C1_ru = {{.*}} float 0x3FB99999A0000000 + +#pragma STDC FENV_ROUND FE_DOWNWARD +float C1_rd = CONSTANT_0_1; +// CHECK: @C1_rd = {{.*}} float 0x3FB9999980000000 + +#pragma STDC FENV_ROUND FE_DOWNWARD +#define PRAGMA(x) _Pragma(#x) +#define CONSTANT_0_1_RM(v, rm) ([](){ PRAGMA(STDC FENV_ROUND rm); return v; }()) + +#pragma STDC FENV_ROUND FE_UPWARD +float C2_rd = CONSTANT_0_1_RM(0.1F, FE_DOWNWARD); +float C2_ru = CONSTANT_0_1_RM(0.1F, FE_UPWARD); +// CHECK: @C2_rd = {{.*}} float 0x3FB9999980000000 +// CHECK: @C2_ru = {{.*}} float 0x3FB99999A0000000 + +#pragma STDC FENV_ROUND FE_DOWNWARD +float C3_rd = CONSTANT_0_1_RM(0.1F, FE_DOWNWARD); +float C3_ru = CONSTANT_0_1_RM(0.1F, FE_UPWARD); +// CHECK: @C3_rd = {{.*}} float 0x3FB9999980000000 +// CHECK: @C3_ru = {{.*}} float 0x3FB99999A0000000 + +// Check literals in template instantiations. + +#pragma STDC FENV_ROUND FE_DYNAMIC + +template +constexpr T foo() { + return C; +} + +#pragma STDC FENV_ROUND FE_DOWNWARD +float var_d = foo(); +// CHECK: @var_d = {{.*}} float 0x3FB9999980000000 + +#pragma STDC FENV_ROUND FE_UPWARD +float var_u = foo(); +// CHECK: @var_u = {{.*}} float 0x3FB99999A0000000 + +#pragma STDC FENV_ROUND FE_DYNAMIC + +template void foo2() { + T Val = f; +} + +void func_01() { + #pragma STDC FENV_ROUND FE_DOWNWARD + foo2(); +} + +void func_02() { + #pragma STDC FENV_ROUND FE_UPWARD + foo2(); +} + +// CHECK-LABEL: define {{.*}} void @_Z4foo2IfTnT_Lf3dccccccEEvv() +// CHECK: store float 0x3FB9999980000000, ptr + +// CHECK-LABEL: define {{.*}} void @_Z4foo2IfTnT_Lf3dcccccdEEvv() +// CHECK: store float 0x3FB99999A0000000, ptr + + +#pragma STDC FENV_ROUND FE_DOWNWARD +template +float tfunc_01() { + return 0.1F; // Must be 0x3FB9999980000000 in all instantiations. +} +template float tfunc_01<0>(); +// CHECK-LABEL: define {{.*}} float @_Z8tfunc_01ILi0EEfv() +// CHECK: ret float 0x3FB9999980000000 + +#pragma STDC FENV_ROUND FE_UPWARD +template float tfunc_01<1>(); +// CHECK-LABEL: define {{.*}} float @_Z8tfunc_01ILi1EEfv() +// CHECK: ret float 0x3FB9999980000000 + +template<> float tfunc_01<2>() { + return 0.1F; +} +// CHECK-LABEL: define {{.*}} float @_Z8tfunc_01ILi2EEfv() +// CHECK: ret float 0x3FB99999A0000000 -- GitLab From 14030d71693b046784ff19cc157074e4db23e74f Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Thu, 16 May 2024 22:18:45 -0700 Subject: [PATCH 0012/1875] [llvm] Drop explicit conversions of string literals to StringRef (NFC) We routinely rely on implicit conversions of string literals to StringRef so that we can use operator==(StringRef, StringRef). --- llvm/lib/Frontend/OpenMP/OMPContext.cpp | 2 +- llvm/lib/Object/MachOObjectFile.cpp | 4 ++-- llvm/lib/Target/Mips/MipsISelLowering.cpp | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Frontend/OpenMP/OMPContext.cpp b/llvm/lib/Frontend/OpenMP/OMPContext.cpp index 37936d6000c8..ad794d8345cf 100644 --- a/llvm/lib/Frontend/OpenMP/OMPContext.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPContext.cpp @@ -63,7 +63,7 @@ OMPContext::OMPContext(bool IsDeviceCompilation, Triple TargetTriple) { if (TraitSelector::TraitSelectorEnum == TraitSelector::device_arch) { \ if (TargetTriple.getArch() == TargetTriple.getArchTypeForLLVMName(Str)) \ ActiveTraits.set(unsigned(TraitProperty::Enum)); \ - if (StringRef(Str) == StringRef("x86_64") && \ + if (StringRef(Str) == "x86_64" && \ TargetTriple.getArch() == Triple::x86_64) \ ActiveTraits.set(unsigned(TraitProperty::Enum)); \ } diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index ef390ceca218..863bc1219e7a 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -3256,13 +3256,13 @@ MachOAbstractFixupEntry::MachOAbstractFixupEntry(Error *E, for (const auto &Command : O->load_commands()) { if (Command.C.cmd == MachO::LC_SEGMENT) { MachO::segment_command SLC = O->getSegmentLoadCommand(Command); - if (StringRef(SLC.segname) == StringRef("__TEXT")) { + if (StringRef(SLC.segname) == "__TEXT") { TextAddress = SLC.vmaddr; break; } } else if (Command.C.cmd == MachO::LC_SEGMENT_64) { MachO::segment_command_64 SLC_64 = O->getSegment64LoadCommand(Command); - if (StringRef(SLC_64.segname) == StringRef("__TEXT")) { + if (StringRef(SLC_64.segname) == "__TEXT") { TextAddress = SLC_64.vmaddr; break; } diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp index 8f7c47370ee5..459164fa7a29 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp @@ -3234,8 +3234,7 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, // Note: The check on the calling convention below must match // MipsABIInfo::GetCalleeAllocdArgSizeInBytes(). - bool MemcpyInByVal = ES && - StringRef(ES->getSymbol()) == StringRef("memcpy") && + bool MemcpyInByVal = ES && StringRef(ES->getSymbol()) == "memcpy" && CallConv != CallingConv::Fast && Chain.getOpcode() == ISD::CALLSEQ_START; -- GitLab From f71749c5ef8667e3fc23820e8e94864653ea9ac9 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Thu, 16 May 2024 22:32:06 -0700 Subject: [PATCH 0013/1875] [clang] Drop explicit conversions of string literals to StringRef (NFC) We routinely rely on implicit conversions of string literals to StringRef so that we can use operator==(StringRef, StringRef). The LHS here are all known to be of StringRef. --- clang/lib/Analysis/ThreadSafetyCommon.cpp | 2 +- clang/lib/Sema/SemaDeclAttr.cpp | 2 +- clang/lib/Serialization/ASTWriter.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp index 33f1f466df24..a3b378c42df3 100644 --- a/clang/lib/Analysis/ThreadSafetyCommon.cpp +++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp @@ -177,7 +177,7 @@ CapabilityExpr SExprBuilder::translateAttrExpr(const Expr *AttrExp, return CapabilityExpr(); if (const auto* SLit = dyn_cast(AttrExp)) { - if (SLit->getString() == StringRef("*")) + if (SLit->getString() == "*") // The "*" expr is a universal lock, which essentially turns off // checks until it is removed from the lockset. return CapabilityExpr(new (Arena) til::Wildcard(), StringRef("wildcard"), diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 3760a4c917ad..30776ff537fb 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -640,7 +640,7 @@ static void checkAttrArgsAreCapabilityObjs(Sema &S, Decl *D, if (const auto *StrLit = dyn_cast(ArgExp)) { if (StrLit->getLength() == 0 || - (StrLit->isOrdinary() && StrLit->getString() == StringRef("*"))) { + (StrLit->isOrdinary() && StrLit->getString() == "*")) { // Pass empty strings to the analyzer without warnings. // Treat "*" as the universal lock. Args.push_back(ArgExp); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 129bc337c892..dd5d65b2eb20 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1460,7 +1460,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, (!PP.getHeaderSearchInfo() .getHeaderSearchOpts() .ModuleMapFileHomeIsCwd || - WritingModule->Directory->getName() != StringRef("."))) { + WritingModule->Directory->getName() != ".")) { // Module directory. auto Abbrev = std::make_shared(); Abbrev->Add(BitCodeAbbrevOp(MODULE_DIRECTORY)); -- GitLab From 9bffe790499e99a4110a33988100ba45835e905e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Sch=C3=BCtt?= Date: Fri, 17 May 2024 07:32:18 +0200 Subject: [PATCH 0014/1875] [GlobalIsel] Speedup select to integer min/max (#92378) https://github.com/llvm/llvm-project/issues/92309 --- .../llvm/CodeGen/GlobalISel/CombinerHelper.h | 6 +- .../include/llvm/Target/GlobalISel/Combine.td | 9 +- .../lib/CodeGen/GlobalISel/CombinerHelper.cpp | 100 +++++++----------- .../AArch64/GlobalISel/combine-select.mir | 28 +++++ 4 files changed, 78 insertions(+), 65 deletions(-) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h index 87cff154b4eb..a9a33c7617d7 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h @@ -822,6 +822,9 @@ public: // Given a binop \p MI, commute operands 1 and 2. void applyCommuteBinOpOperands(MachineInstr &MI); + /// Combine select to integer min/max. + bool matchSelectIMinMax(const MachineOperand &MO, BuildFnTy &MatchInfo); + /// Combine selects. bool matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo); @@ -962,9 +965,6 @@ private: bool tryFoldSelectOfConstants(GSelect *Select, BuildFnTy &MatchInfo); - /// Try to fold (icmp X, Y) ? X : Y -> integer minmax. - bool tryFoldSelectToIntMinMax(GSelect *Select, BuildFnTy &MatchInfo); - bool isOneOrOneSplat(Register Src, bool AllowUndefs); bool isZeroOrZeroSplat(Register Src, bool AllowUndefs); bool isConstantSplatVector(Register Src, int64_t SplatValue, diff --git a/llvm/include/llvm/Target/GlobalISel/Combine.td b/llvm/include/llvm/Target/GlobalISel/Combine.td index d61a5759d5a9..a1d39d910bc8 100644 --- a/llvm/include/llvm/Target/GlobalISel/Combine.td +++ b/llvm/include/llvm/Target/GlobalISel/Combine.td @@ -1307,6 +1307,13 @@ def select_to_minmax: GICombineRule< [{ return Helper.matchSimplifySelectToMinMax(*${root}, ${info}); }]), (apply [{ Helper.applyBuildFn(*${root}, ${info}); }])>; +def select_to_iminmax: GICombineRule< + (defs root:$root, build_fn_matchinfo:$info), + (match (G_ICMP $tst, $tst1, $x, $y), + (G_SELECT $root, $tst, $x, $y), + [{ return Helper.matchSelectIMinMax(${root}, ${info}); }]), + (apply [{ Helper.applyBuildFnMO(${root}, ${info}); }])>; + def match_selects : GICombineRule< (defs root:$root, build_fn_matchinfo:$matchinfo), (match (wip_match_opcode G_SELECT):$root, @@ -1670,7 +1677,7 @@ def phi_combines : GICombineGroup<[extend_through_phis]>; def bitreverse_shift : GICombineGroup<[bitreverse_shl, bitreverse_lshr]>; def select_combines : GICombineGroup<[select_undef_cmp, select_constant_cmp, - match_selects]>; + select_to_iminmax, match_selects]>; def trivial_combines : GICombineGroup<[copy_prop, mul_to_shl, add_p2i_to_ptradd, mul_by_neg_one, idempotent_prop]>; diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp index 809f13abcadd..a87a26d72b45 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -6749,10 +6749,12 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select, return false; } -bool CombinerHelper::tryFoldSelectToIntMinMax(GSelect *Select, - BuildFnTy &MatchInfo) { +bool CombinerHelper::matchSelectIMinMax(const MachineOperand &MO, + BuildFnTy &MatchInfo) { + GSelect *Select = cast(MRI.getVRegDef(MO.getReg())); + GICmp *Cmp = cast(MRI.getVRegDef(Select->getCondReg())); + Register DstReg = Select->getReg(0); - Register Cond = Select->getCondReg(); Register True = Select->getTrueReg(); Register False = Select->getFalseReg(); LLT DstTy = MRI.getType(DstReg); @@ -6760,11 +6762,6 @@ bool CombinerHelper::tryFoldSelectToIntMinMax(GSelect *Select, if (DstTy.isPointer()) return false; - // We need an G_ICMP on the condition register. - GICmp *Cmp = getOpcodeDef(Cond, MRI); - if (!Cmp) - return false; - // We want to fold the icmp and replace the select. if (!MRI.hasOneNonDBGUse(Cmp->getReg(0))) return false; @@ -6775,62 +6772,46 @@ bool CombinerHelper::tryFoldSelectToIntMinMax(GSelect *Select, if (CmpInst::isEquality(Pred)) return false; - Register CmpLHS = Cmp->getLHSReg(); - Register CmpRHS = Cmp->getRHSReg(); - - // We can swap CmpLHS and CmpRHS for higher hitrate. - if (True == CmpRHS && False == CmpLHS) { - std::swap(CmpLHS, CmpRHS); - Pred = CmpInst::getSwappedPredicate(Pred); - } + [[maybe_unused]] Register CmpLHS = Cmp->getLHSReg(); + [[maybe_unused]] Register CmpRHS = Cmp->getRHSReg(); // (icmp X, Y) ? X : Y -> integer minmax. // see matchSelectPattern in ValueTracking. // Legality between G_SELECT and integer minmax can differ. - if (True == CmpLHS && False == CmpRHS) { - switch (Pred) { - case ICmpInst::ICMP_UGT: - case ICmpInst::ICMP_UGE: { - if (!isLegalOrBeforeLegalizer({TargetOpcode::G_UMAX, DstTy})) - return false; - MatchInfo = [=](MachineIRBuilder &B) { - B.buildUMax(DstReg, True, False); - }; - return true; - } - case ICmpInst::ICMP_SGT: - case ICmpInst::ICMP_SGE: { - if (!isLegalOrBeforeLegalizer({TargetOpcode::G_SMAX, DstTy})) - return false; - MatchInfo = [=](MachineIRBuilder &B) { - B.buildSMax(DstReg, True, False); - }; - return true; - } - case ICmpInst::ICMP_ULT: - case ICmpInst::ICMP_ULE: { - if (!isLegalOrBeforeLegalizer({TargetOpcode::G_UMIN, DstTy})) - return false; - MatchInfo = [=](MachineIRBuilder &B) { - B.buildUMin(DstReg, True, False); - }; - return true; - } - case ICmpInst::ICMP_SLT: - case ICmpInst::ICMP_SLE: { - if (!isLegalOrBeforeLegalizer({TargetOpcode::G_SMIN, DstTy})) - return false; - MatchInfo = [=](MachineIRBuilder &B) { - B.buildSMin(DstReg, True, False); - }; - return true; - } - default: + assert(True == CmpLHS && False == CmpRHS && "unexpected MIR pattern"); + + switch (Pred) { + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_UGE: { + if (!isLegalOrBeforeLegalizer({TargetOpcode::G_UMAX, DstTy})) return false; - } + MatchInfo = [=](MachineIRBuilder &B) { B.buildUMax(DstReg, True, False); }; + return true; + } + case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_SGE: { + if (!isLegalOrBeforeLegalizer({TargetOpcode::G_SMAX, DstTy})) + return false; + MatchInfo = [=](MachineIRBuilder &B) { B.buildSMax(DstReg, True, False); }; + return true; + } + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_ULE: { + if (!isLegalOrBeforeLegalizer({TargetOpcode::G_UMIN, DstTy})) + return false; + MatchInfo = [=](MachineIRBuilder &B) { B.buildUMin(DstReg, True, False); }; + return true; + } + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_SLE: { + if (!isLegalOrBeforeLegalizer({TargetOpcode::G_SMIN, DstTy})) + return false; + MatchInfo = [=](MachineIRBuilder &B) { B.buildSMin(DstReg, True, False); }; + return true; + } + default: + return false; } - - return false; } bool CombinerHelper::matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo) { @@ -6842,9 +6823,6 @@ bool CombinerHelper::matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo) { if (tryFoldBoolSelectToLogic(Select, MatchInfo)) return true; - if (tryFoldSelectToIntMinMax(Select, MatchInfo)) - return true; - return false; } diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/combine-select.mir b/llvm/test/CodeGen/AArch64/GlobalISel/combine-select.mir index 2bf7e84a379b..8d9ad8d7caca 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/combine-select.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/combine-select.mir @@ -896,3 +896,31 @@ body: | RET_ReallyLR ... +--- +# test failed select icmp_slef,t_t_f --> smin(t,f) +name: select_icmp_sle_f_t_t_f_smin_t_f +body: | + bb.1: + liveins: $x0, $x1, $x2 + ; CHECK-LABEL: name: select_icmp_sle_f_t_t_f_smin_t_f + ; CHECK: liveins: $x0, $x1, $x2 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 + ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64) + ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64) + ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32) + ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32) + ; CHECK-NEXT: %c:_(<4 x s32>) = G_ICMP intpred(sle), %f(<4 x s32>), %t + ; CHECK-NEXT: %sel:_(<4 x s32>) = exact G_SELECT %c(<4 x s32>), %t, %f + ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>) + %0:_(s64) = COPY $x0 + %1:_(s64) = COPY $x1 + %t1:_(s32) = G_TRUNC %0 + %f1:_(s32) = G_TRUNC %1 + %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1 + %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1 + %c:_(<4 x s32>) = G_ICMP intpred(sle), %f(<4 x s32>), %t(<4 x s32>) + %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f + $q0 = COPY %sel(<4 x s32>) +... -- GitLab From bc9823cf60bf91cc8b45248c4205cd2c67b2a3d5 Mon Sep 17 00:00:00 2001 From: Phoebe Wang Date: Fri, 17 May 2024 13:37:20 +0800 Subject: [PATCH 0015/1875] [X86][BF16] Change MVT to EVT in combineFP_EXTEND Fixes: #92471 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 4 +- llvm/test/CodeGen/X86/bfloat.ll | 53 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index cd252c54887a..5d0846453685 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -56802,12 +56802,12 @@ static SDValue combineFP_EXTEND(SDNode *N, SelectionDAG &DAG, assert(!IsStrict && "Strict FP doesn't support BF16"); if (VT.getVectorElementType() == MVT::f64) { - MVT TmpVT = VT.getSimpleVT().changeVectorElementType(MVT::f32); + EVT TmpVT = VT.changeVectorElementType(MVT::f32); return DAG.getNode(ISD::FP_EXTEND, dl, VT, DAG.getNode(ISD::FP_EXTEND, dl, TmpVT, Src)); } assert(VT.getVectorElementType() == MVT::f32 && "Unexpected fpext"); - MVT NVT = SrcVT.getSimpleVT().changeVectorElementType(MVT::i32); + EVT NVT = SrcVT.changeVectorElementType(MVT::i32); Src = DAG.getBitcast(SrcVT.changeTypeToInteger(), Src); Src = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Src); Src = DAG.getNode(ISD::SHL, dl, NVT, Src, DAG.getConstant(16, dl, NVT)); diff --git a/llvm/test/CodeGen/X86/bfloat.ll b/llvm/test/CodeGen/X86/bfloat.ll index b3e04590075f..8b5ca57df27e 100644 --- a/llvm/test/CodeGen/X86/bfloat.ll +++ b/llvm/test/CodeGen/X86/bfloat.ll @@ -2464,3 +2464,56 @@ define float @trunc_ext(float %a) nounwind { %c = fpext bfloat %b to float ret float %c } + +define void @PR92471(ptr %0, ptr %1) nounwind { +; X86-LABEL: PR92471: +; X86: # %bb.0: +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-NEXT: vpinsrd $1, 4(%ecx), %xmm0, %xmm0 +; X86-NEXT: vpinsrd $2, 8(%ecx), %xmm0, %xmm0 +; X86-NEXT: vpinsrw $6, 12(%ecx), %xmm0, %xmm0 +; X86-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero +; X86-NEXT: vpslld $16, %ymm0, %ymm0 +; X86-NEXT: vextracti128 $1, %ymm0, %xmm1 +; X86-NEXT: vpextrd $2, %xmm1, 24(%eax) +; X86-NEXT: vpextrd $1, %xmm1, 20(%eax) +; X86-NEXT: vmovd %xmm1, 16(%eax) +; X86-NEXT: vmovdqu %xmm0, (%eax) +; X86-NEXT: vzeroupper +; X86-NEXT: retl +; +; SSE2-LABEL: PR92471: +; SSE2: # %bb.0: +; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero +; SSE2-NEXT: pinsrw $2, 12(%rdi), %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm3, %xmm3 +; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3] +; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3] +; SSE2-NEXT: movdqu %xmm2, (%rsi) +; SSE2-NEXT: movq %xmm3, 16(%rsi) +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3] +; SSE2-NEXT: movd %xmm0, 24(%rsi) +; SSE2-NEXT: retq +; +; AVX-LABEL: PR92471: +; AVX: # %bb.0: +; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; AVX-NEXT: vpinsrd $2, 8(%rdi), %xmm0, %xmm0 +; AVX-NEXT: vpinsrw $6, 12(%rdi), %xmm0, %xmm0 +; AVX-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero +; AVX-NEXT: vpslld $16, %ymm0, %ymm0 +; AVX-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX-NEXT: vpextrd $2, %xmm1, 24(%rsi) +; AVX-NEXT: vmovq %xmm1, 16(%rsi) +; AVX-NEXT: vmovdqu %xmm0, (%rsi) +; AVX-NEXT: vzeroupper +; AVX-NEXT: retq + %3 = load <7 x bfloat>, ptr %0, align 2 + %4 = fpext <7 x bfloat> %3 to <7 x float> + store <7 x float> %4, ptr %1, align 4 + ret void +} -- GitLab From f43deca2538b717f5669ce8116cc4c040bde87c8 Mon Sep 17 00:00:00 2001 From: Johannes Reifferscheid Date: Fri, 17 May 2024 08:44:07 +0200 Subject: [PATCH 0016/1875] Fix Tan inaccuracies on extreme complex inputs. (#92443) Specifically, those with small/large absolute values. This ports https://github.com/openxla/xla/pull/10525 and was verified with XLA's test suite. --- .../ComplexToStandard/ComplexToStandard.cpp | 43 ++- .../convert-to-standard.mlir | 335 ++++-------------- 2 files changed, 98 insertions(+), 280 deletions(-) diff --git a/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp b/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp index c2a83f90bcbe..edca8eaecbff 100644 --- a/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp +++ b/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp @@ -956,27 +956,12 @@ struct SignOpConversion : public OpConversionPattern { } }; -struct TanOpConversion : public OpConversionPattern { - using OpConversionPattern::OpConversionPattern; +template +struct TanTanhOpConversion : public OpConversionPattern { + using OpConversionPattern::OpConversionPattern; LogicalResult - matchAndRewrite(complex::TanOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const override { - auto loc = op.getLoc(); - arith::FastMathFlagsAttr fmf = op.getFastMathFlagsAttr(); - - Value cos = rewriter.create(loc, adaptor.getComplex(), fmf); - Value sin = rewriter.create(loc, adaptor.getComplex(), fmf); - rewriter.replaceOpWithNewOp(op, sin, cos, fmf); - return success(); - } -}; - -struct TanhOpConversion : public OpConversionPattern { - using OpConversionPattern::OpConversionPattern; - - LogicalResult - matchAndRewrite(complex::TanhOp op, OpAdaptor adaptor, + matchAndRewrite(Op op, Op::Adaptor adaptor, ConversionPatternRewriter &rewriter) const override { ImplicitLocOpBuilder b(op.getLoc(), rewriter); auto loc = op.getLoc(); @@ -989,14 +974,20 @@ struct TanhOpConversion : public OpConversionPattern { b.create(loc, elementType, adaptor.getComplex()); Value imag = b.create(loc, elementType, adaptor.getComplex()); + Value negOne = b.create( + elementType, b.getFloatAttr(elementType, -1.0)); + + if constexpr (std::is_same_v) { + // tan(x+yi) = -i*tanh(-y + xi) + std::swap(real, imag); + real = b.create(real, negOne, fmf); + } auto cst = [&](APFloat v) { return b.create(elementType, b.getFloatAttr(elementType, v)); }; Value inf = cst(APFloat::getInf(floatSemantics)); - Value negOne = b.create( - elementType, b.getFloatAttr(elementType, -1.0)); Value four = b.create(elementType, b.getFloatAttr(elementType, 4.0)); Value twoReal = b.create(real, real, fmf); @@ -1054,6 +1045,12 @@ struct TanhOpConversion : public OpConversionPattern { b.create(resultImagIsZero, zero, resultImag); } + if constexpr (std::is_same_v) { + // tan(x+yi) = -i*tanh(-y + xi) + std::swap(resultReal, resultImag); + resultImag = b.create(resultImag, negOne, fmf); + } + rewriter.replaceOpWithNewOp(op, type, resultReal, resultImag); return success(); @@ -1327,8 +1324,8 @@ void mlir::populateComplexToStandardConversionPatterns( SignOpConversion, SinOpConversion, SqrtOpConversion, - TanOpConversion, - TanhOpConversion, + TanTanhOpConversion, + TanTanhOpConversion, PowOpConversion, RsqrtOpConversion >(patterns.getContext()); diff --git a/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir b/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir index 827ae940165c..6dafe29e2e5f 100644 --- a/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir +++ b/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir @@ -538,135 +538,46 @@ func.func @complex_tan(%arg: complex) -> complex { %tan = complex.tan %arg: complex return %tan : complex } -// CHECK-DAG: %[[REAL:.*]] = complex.re %[[ARG]] -// CHECK-DAG: %[[IMAG:.*]] = complex.im %[[ARG]] -// CHECK-DAG: %[[HALF:.*]] = arith.constant 5.000000e-01 : f32 -// CHECK-DAG: %[[EXP:.*]] = math.exp %[[IMAG]] : f32 -// CHECK-DAG: %[[HALF_EXP:.*]] = arith.mulf %[[HALF]], %[[EXP]] -// CHECK-DAG: %[[HALF_REXP:.*]] = arith.divf %[[HALF]], %[[EXP]] -// CHECK-DAG: %[[SIN:.*]] = math.sin %[[REAL]] : f32 -// CHECK-DAG: %[[COS:.*]] = math.cos %[[REAL]] : f32 -// CHECK-DAG: %[[EXP_SUM:.*]] = arith.addf %[[HALF_REXP]], %[[HALF_EXP]] -// CHECK-DAG: %[[COS_REAL:.*]] = arith.mulf %[[EXP_SUM]], %[[COS]] -// CHECK-DAG: %[[EXP_DIFF:.*]] = arith.subf %[[HALF_REXP]], %[[HALF_EXP]] -// CHECK-DAG: %[[COS_IMAG:.*]] = arith.mulf %[[EXP_DIFF]], %[[SIN]] -// CHECK-DAG: %[[COS_COMP:.*]] = complex.create %[[COS_REAL]], %[[COS_IMAG]] : complex -// CHECK-DAG: %[[REAL:.*]] = complex.re %[[ARG]] -// CHECK-DAG: %[[IMAG:.*]] = complex.im %[[ARG]] -// CHECK-DAG: %[[HALF:.*]] = arith.constant 5.000000e-01 : f32 -// CHECK-DAG: %[[EXP:.*]] = math.exp %[[IMAG]] : f32 -// CHECK-DAG: %[[HALF_EXP:.*]] = arith.mulf %[[HALF]], %[[EXP]] -// CHECK-DAG: %[[HALF_REXP:.*]] = arith.divf %[[HALF]], %[[EXP]] -// CHECK-DAG: %[[SIN:.*]] = math.sin %[[REAL]] : f32 -// CHECK-DAG: %[[COS:.*]] = math.cos %[[REAL]] : f32 -// CHECK-DAG: %[[EXP_SUM:.*]] = arith.addf %[[HALF_EXP]], %[[HALF_REXP]] -// CHECK-DAG: %[[SIN_REAL:.*]] = arith.mulf %[[EXP_SUM]], %[[SIN]] -// CHECK-DAG: %[[EXP_DIFF:.*]] = arith.subf %[[HALF_EXP]], %[[HALF_REXP]] -// CHECK-DAG: %[[SIN_IMAG:.*]] = arith.mulf %[[EXP_DIFF]], %[[COS]] -// CHECK-DAG: %[[SIN_COMP:.*]] = complex.create %[[SIN_REAL]], %[[SIN_IMAG]] : complex - -// CHECK: %[[LHS_REAL:.*]] = complex.re %[[SIN_COMP]] : complex -// CHECK: %[[LHS_IMAG:.*]] = complex.im %[[SIN_COMP]] : complex -// CHECK: %[[RHS_REAL:.*]] = complex.re %[[COS_COMP]] : complex -// CHECK: %[[RHS_IMAG:.*]] = complex.im %[[COS_COMP]] : complex - -// CHECK: %[[RHS_REAL_IMAG_RATIO:.*]] = arith.divf %[[RHS_REAL]], %[[RHS_IMAG]] : f32 -// CHECK: %[[RHS_REAL_TIMES_RHS_REAL_IMAG_RATIO:.*]] = arith.mulf %[[RHS_REAL_IMAG_RATIO]], %[[RHS_REAL]] : f32 -// CHECK: %[[RHS_REAL_IMAG_DENOM:.*]] = arith.addf %[[RHS_IMAG]], %[[RHS_REAL_TIMES_RHS_REAL_IMAG_RATIO]] : f32 -// CHECK: %[[LHS_REAL_TIMES_RHS_REAL_IMAG_RATIO:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_REAL_IMAG_RATIO]] : f32 -// CHECK: %[[REAL_NUMERATOR_1:.*]] = arith.addf %[[LHS_REAL_TIMES_RHS_REAL_IMAG_RATIO]], %[[LHS_IMAG]] : f32 -// CHECK: %[[RESULT_REAL_1:.*]] = arith.divf %[[REAL_NUMERATOR_1]], %[[RHS_REAL_IMAG_DENOM]] : f32 -// CHECK: %[[LHS_IMAG_TIMES_RHS_REAL_IMAG_RATIO:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_REAL_IMAG_RATIO]] : f32 -// CHECK: %[[IMAG_NUMERATOR_1:.*]] = arith.subf %[[LHS_IMAG_TIMES_RHS_REAL_IMAG_RATIO]], %[[LHS_REAL]] : f32 -// CHECK: %[[RESULT_IMAG_1:.*]] = arith.divf %[[IMAG_NUMERATOR_1]], %[[RHS_REAL_IMAG_DENOM]] : f32 - -// CHECK: %[[RHS_IMAG_REAL_RATIO:.*]] = arith.divf %[[RHS_IMAG]], %[[RHS_REAL]] : f32 -// CHECK: %[[RHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO:.*]] = arith.mulf %[[RHS_IMAG_REAL_RATIO]], %[[RHS_IMAG]] : f32 -// CHECK: %[[RHS_IMAG_REAL_DENOM:.*]] = arith.addf %[[RHS_REAL]], %[[RHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO]] : f32 -// CHECK: %[[LHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_IMAG_REAL_RATIO]] : f32 -// CHECK: %[[REAL_NUMERATOR_2:.*]] = arith.addf %[[LHS_REAL]], %[[LHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO]] : f32 -// CHECK: %[[RESULT_REAL_2:.*]] = arith.divf %[[REAL_NUMERATOR_2]], %[[RHS_IMAG_REAL_DENOM]] : f32 -// CHECK: %[[LHS_REAL_TIMES_RHS_IMAG_REAL_RATIO:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_IMAG_REAL_RATIO]] : f32 -// CHECK: %[[IMAG_NUMERATOR_2:.*]] = arith.subf %[[LHS_IMAG]], %[[LHS_REAL_TIMES_RHS_IMAG_REAL_RATIO]] : f32 -// CHECK: %[[RESULT_IMAG_2:.*]] = arith.divf %[[IMAG_NUMERATOR_2]], %[[RHS_IMAG_REAL_DENOM]] : f32 - -// Case 1. Zero denominator, numerator contains at most one NaN value. -// CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f32 -// CHECK: %[[RHS_REAL_ABS:.*]] = math.absf %[[RHS_REAL]] : f32 -// CHECK: %[[RHS_REAL_ABS_IS_ZERO:.*]] = arith.cmpf oeq, %[[RHS_REAL_ABS]], %[[ZERO]] : f32 -// CHECK: %[[RHS_IMAG_ABS:.*]] = math.absf %[[RHS_IMAG]] : f32 -// CHECK: %[[RHS_IMAG_ABS_IS_ZERO:.*]] = arith.cmpf oeq, %[[RHS_IMAG_ABS]], %[[ZERO]] : f32 -// CHECK: %[[LHS_REAL_IS_NOT_NAN:.*]] = arith.cmpf ord, %[[LHS_REAL]], %[[ZERO]] : f32 -// CHECK: %[[LHS_IMAG_IS_NOT_NAN:.*]] = arith.cmpf ord, %[[LHS_IMAG]], %[[ZERO]] : f32 -// CHECK: %[[LHS_CONTAINS_NOT_NAN_VALUE:.*]] = arith.ori %[[LHS_REAL_IS_NOT_NAN]], %[[LHS_IMAG_IS_NOT_NAN]] : i1 -// CHECK: %[[RHS_IS_ZERO:.*]] = arith.andi %[[RHS_REAL_ABS_IS_ZERO]], %[[RHS_IMAG_ABS_IS_ZERO]] : i1 -// CHECK: %[[RESULT_IS_INFINITY:.*]] = arith.andi %[[LHS_CONTAINS_NOT_NAN_VALUE]], %[[RHS_IS_ZERO]] : i1 +// CHECK: %[[IMAG:.*]] = complex.re %[[ARG]] : complex +// CHECK: %[[V0:.*]] = complex.im %[[ARG]] : complex +// CHECK: %[[NEG_ONE:.*]] = arith.constant -1.000000e+00 : f32 +// CHECK: %[[REAL:.*]] = arith.mulf %[[V0]], %[[NEG_ONE]] : f32 // CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32 -// CHECK: %[[INF_WITH_SIGN_OF_RHS_REAL:.*]] = math.copysign %[[INF]], %[[RHS_REAL]] : f32 -// CHECK: %[[INFINITY_RESULT_REAL:.*]] = arith.mulf %[[INF_WITH_SIGN_OF_RHS_REAL]], %[[LHS_REAL]] : f32 -// CHECK: %[[INFINITY_RESULT_IMAG:.*]] = arith.mulf %[[INF_WITH_SIGN_OF_RHS_REAL]], %[[LHS_IMAG]] : f32 - -// Case 2. Infinite numerator, finite denominator. -// CHECK: %[[RHS_REAL_FINITE:.*]] = arith.cmpf one, %[[RHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IMAG_FINITE:.*]] = arith.cmpf one, %[[RHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IS_FINITE:.*]] = arith.andi %[[RHS_REAL_FINITE]], %[[RHS_IMAG_FINITE]] : i1 -// CHECK: %[[LHS_REAL_ABS:.*]] = math.absf %[[LHS_REAL]] : f32 -// CHECK: %[[LHS_REAL_INFINITE:.*]] = arith.cmpf oeq, %[[LHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IMAG_ABS:.*]] = math.absf %[[LHS_IMAG]] : f32 -// CHECK: %[[LHS_IMAG_INFINITE:.*]] = arith.cmpf oeq, %[[LHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IS_INFINITE:.*]] = arith.ori %[[LHS_REAL_INFINITE]], %[[LHS_IMAG_INFINITE]] : i1 -// CHECK: %[[INF_NUM_FINITE_DENOM:.*]] = arith.andi %[[LHS_IS_INFINITE]], %[[RHS_IS_FINITE]] : i1 -// CHECK: %[[ONE:.*]] = arith.constant 1.000000e+00 : f32 -// CHECK: %[[LHS_REAL_IS_INF:.*]] = arith.select %[[LHS_REAL_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[LHS_REAL_IS_INF_WITH_SIGN:.*]] = math.copysign %[[LHS_REAL_IS_INF]], %[[LHS_REAL]] : f32 -// CHECK: %[[LHS_IMAG_IS_INF:.*]] = arith.select %[[LHS_IMAG_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[LHS_IMAG_IS_INF_WITH_SIGN:.*]] = math.copysign %[[LHS_IMAG_IS_INF]], %[[LHS_IMAG]] : f32 -// CHECK: %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_REAL:.*]] = arith.mulf %[[LHS_REAL_IS_INF_WITH_SIGN]], %[[RHS_REAL]] : f32 -// CHECK: %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_IMAG:.*]] = arith.mulf %[[LHS_IMAG_IS_INF_WITH_SIGN]], %[[RHS_IMAG]] : f32 -// CHECK: %[[INF_MULTIPLICATOR_1:.*]] = arith.addf %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_REAL]], %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_IMAG]] : f32 -// CHECK: %[[RESULT_REAL_3:.*]] = arith.mulf %[[INF]], %[[INF_MULTIPLICATOR_1]] : f32 -// CHECK: %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_IMAG:.*]] = arith.mulf %[[LHS_REAL_IS_INF_WITH_SIGN]], %[[RHS_IMAG]] : f32 -// CHECK: %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_REAL:.*]] = arith.mulf %[[LHS_IMAG_IS_INF_WITH_SIGN]], %[[RHS_REAL]] : f32 -// CHECK: %[[INF_MULTIPLICATOR_2:.*]] = arith.subf %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_REAL]], %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_IMAG]] : f32 -// CHECK: %[[RESULT_IMAG_3:.*]] = arith.mulf %[[INF]], %[[INF_MULTIPLICATOR_2]] : f32 - -// Case 3. Finite numerator, infinite denominator. -// CHECK: %[[LHS_REAL_FINITE:.*]] = arith.cmpf one, %[[LHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IMAG_FINITE:.*]] = arith.cmpf one, %[[LHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IS_FINITE:.*]] = arith.andi %[[LHS_REAL_FINITE]], %[[LHS_IMAG_FINITE]] : i1 -// CHECK: %[[RHS_REAL_INFINITE:.*]] = arith.cmpf oeq, %[[RHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IMAG_INFINITE:.*]] = arith.cmpf oeq, %[[RHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IS_INFINITE:.*]] = arith.ori %[[RHS_REAL_INFINITE]], %[[RHS_IMAG_INFINITE]] : i1 -// CHECK: %[[FINITE_NUM_INFINITE_DENOM:.*]] = arith.andi %[[LHS_IS_FINITE]], %[[RHS_IS_INFINITE]] : i1 -// CHECK: %[[RHS_REAL_IS_INF:.*]] = arith.select %[[RHS_REAL_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[RHS_REAL_IS_INF_WITH_SIGN:.*]] = math.copysign %[[RHS_REAL_IS_INF]], %[[RHS_REAL]] : f32 -// CHECK: %[[RHS_IMAG_IS_INF:.*]] = arith.select %[[RHS_IMAG_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[RHS_IMAG_IS_INF_WITH_SIGN:.*]] = math.copysign %[[RHS_IMAG_IS_INF]], %[[RHS_IMAG]] : f32 -// CHECK: %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_REAL:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_REAL_IS_INF_WITH_SIGN]] : f32 -// CHECK: %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_IMAG:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_IMAG_IS_INF_WITH_SIGN]] : f32 -// CHECK: %[[ZERO_MULTIPLICATOR_1:.*]] = arith.addf %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_REAL]], %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_IMAG]] : f32 -// CHECK: %[[RESULT_REAL_4:.*]] = arith.mulf %[[ZERO]], %[[ZERO_MULTIPLICATOR_1]] : f32 -// CHECK: %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_IMAG:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_REAL_IS_INF_WITH_SIGN]] : f32 -// CHECK: %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_REAL:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_IMAG_IS_INF_WITH_SIGN]] : f32 -// CHECK: %[[ZERO_MULTIPLICATOR_2:.*]] = arith.subf %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_IMAG]], %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_REAL]] : f32 -// CHECK: %[[RESULT_IMAG_4:.*]] = arith.mulf %[[ZERO]], %[[ZERO_MULTIPLICATOR_2]] : f32 - -// CHECK: %[[REAL_ABS_SMALLER_THAN_IMAG_ABS:.*]] = arith.cmpf olt, %[[RHS_REAL_ABS]], %[[RHS_IMAG_ABS]] : f32 -// CHECK: %[[RESULT_REAL:.*]] = arith.select %[[REAL_ABS_SMALLER_THAN_IMAG_ABS]], %[[RESULT_REAL_1]], %[[RESULT_REAL_2]] : f32 -// CHECK: %[[RESULT_IMAG:.*]] = arith.select %[[REAL_ABS_SMALLER_THAN_IMAG_ABS]], %[[RESULT_IMAG_1]], %[[RESULT_IMAG_2]] : f32 -// CHECK: %[[RESULT_REAL_SPECIAL_CASE_3:.*]] = arith.select %[[FINITE_NUM_INFINITE_DENOM]], %[[RESULT_REAL_4]], %[[RESULT_REAL]] : f32 -// CHECK: %[[RESULT_IMAG_SPECIAL_CASE_3:.*]] = arith.select %[[FINITE_NUM_INFINITE_DENOM]], %[[RESULT_IMAG_4]], %[[RESULT_IMAG]] : f32 -// CHECK: %[[RESULT_REAL_SPECIAL_CASE_2:.*]] = arith.select %[[INF_NUM_FINITE_DENOM]], %[[RESULT_REAL_3]], %[[RESULT_REAL_SPECIAL_CASE_3]] : f32 -// CHECK: %[[RESULT_IMAG_SPECIAL_CASE_2:.*]] = arith.select %[[INF_NUM_FINITE_DENOM]], %[[RESULT_IMAG_3]], %[[RESULT_IMAG_SPECIAL_CASE_3]] : f32 -// CHECK: %[[RESULT_REAL_SPECIAL_CASE_1:.*]] = arith.select %[[RESULT_IS_INFINITY]], %[[INFINITY_RESULT_REAL]], %[[RESULT_REAL_SPECIAL_CASE_2]] : f32 -// CHECK: %[[RESULT_IMAG_SPECIAL_CASE_1:.*]] = arith.select %[[RESULT_IS_INFINITY]], %[[INFINITY_RESULT_IMAG]], %[[RESULT_IMAG_SPECIAL_CASE_2]] : f32 -// CHECK: %[[RESULT_REAL_IS_NAN:.*]] = arith.cmpf uno, %[[RESULT_REAL]], %[[ZERO]] : f32 -// CHECK: %[[RESULT_IMAG_IS_NAN:.*]] = arith.cmpf uno, %[[RESULT_IMAG]], %[[ZERO]] : f32 -// CHECK: %[[RESULT_IS_NAN:.*]] = arith.andi %[[RESULT_REAL_IS_NAN]], %[[RESULT_IMAG_IS_NAN]] : i1 -// CHECK: %[[RESULT_REAL_WITH_SPECIAL_CASES:.*]] = arith.select %[[RESULT_IS_NAN]], %[[RESULT_REAL_SPECIAL_CASE_1]], %[[RESULT_REAL]] : f32 -// CHECK: %[[RESULT_IMAG_WITH_SPECIAL_CASES:.*]] = arith.select %[[RESULT_IS_NAN]], %[[RESULT_IMAG_SPECIAL_CASE_1]], %[[RESULT_IMAG]] : f32 -// CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL_WITH_SPECIAL_CASES]], %[[RESULT_IMAG_WITH_SPECIAL_CASES]] : complex +// CHECK: %[[FOUR:.*]] = arith.constant 4.000000e+00 : f32 +// CHECK: %[[TWO_REAL:.*]] = arith.addf %[[REAL]], %[[REAL]] : f32 +// CHECK: %[[NEG_TWO_REAL:.*]] = arith.mulf %[[NEG_ONE]], %[[TWO_REAL]] : f32 +// CHECK: %[[EXPM1:.*]] = math.expm1 %[[TWO_REAL]] : f32 +// CHECK: %[[EXPM1_2:.*]] = math.expm1 %[[NEG_TWO_REAL]] : f32 +// CHECK: %[[REAL_NUM:.*]] = arith.subf %[[EXPM1]], %[[EXPM1_2]] : f32 +// CHECK: %[[COS:.*]] = math.cos %[[IMAG]] : f32 +// CHECK: %[[COS_SQ:.*]] = arith.mulf %[[COS]], %[[COS]] : f32 +// CHECK: %[[FOUR_COS_SQ:.*]] = arith.mulf %[[COS_SQ]], %[[FOUR]] : f32 +// CHECK: %[[SIN:.*]] = math.sin %[[IMAG]] : f32 +// CHECK: %[[MUL:.*]] = arith.mulf %[[COS]], %[[SIN]] : f32 +// CHECK: %[[IMAG_NUM:.*]] = arith.mulf %[[FOUR]], %[[MUL]] : f32 +// CHECK: %[[ADD:.*]] = arith.addf %[[EXPM1]], %[[EXPM1_2]] : f32 +// CHECK: %[[DENOM:.*]] = arith.addf %[[ADD]], %[[FOUR_COS_SQ]] : f32 +// CHECK: %[[IS_INF:.*]] = arith.cmpf oeq, %[[ADD]], %[[INF]] : f32 +// CHECK: %[[LIMIT:.*]] = math.copysign %[[NEG_ONE]], %[[REAL]] : f32 +// CHECK: %[[RESULT_REAL:.*]] = arith.divf %[[REAL_NUM]], %[[DENOM]] : f32 +// CHECK: %[[RESULT_REAL2:.*]] = arith.select %[[IS_INF]], %[[LIMIT]], %[[RESULT_REAL]] : f32 +// CHECK: %[[RESULT_IMAG:.*]] = arith.divf %[[IMAG_NUM]], %[[DENOM]] : f32 +// CHECK: %[[ABS_REAL:.*]] = math.absf %[[REAL]] : f32 +// CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f32 +// CHECK: %[[NAN:.*]] = arith.constant 0x7FC00000 : f32 +// CHECK: %[[ABS_REAL_INF:.*]] = arith.cmpf oeq, %[[ABS_REAL]], %[[INF]] : f32 +// CHECK: %[[IMAG_ZERO:.*]] = arith.cmpf oeq, %[[IMAG]], %[[ZERO]] : f32 +// CHECK: %true = arith.constant true +// CHECK: %[[ABS_REAL_NOT_INF:.*]] = arith.xori %[[ABS_REAL_INF]], %true : i1 +// CHECK: %[[IMAG_IS_NAN:.*]] = arith.cmpf uno, %[[IMAG_NUM]], %[[IMAG_NUM]] : f32 +// CHECK: %[[REAL_IS_NAN:.*]] = arith.andi %[[IMAG_IS_NAN]], %[[ABS_REAL_NOT_INF]] : i1 +// CHECK: %[[AND:.*]] = arith.andi %[[ABS_REAL_INF]], %[[IMAG_IS_NAN]] : i1 +// CHECK: %[[IMAG_IS_NAN2:.*]] = arith.ori %[[IMAG_ZERO]], %[[AND]] : i1 +// CHECK: %[[RESULT_REAL3:.*]] = arith.select %[[REAL_IS_NAN]], %[[NAN]], %[[RESULT_REAL2]] : f32 +// CHECK: %[[RESULT_REAL:.*]] = arith.select %[[IMAG_IS_NAN2]], %[[ZERO]], %[[RESULT_IMAG]] : f32 +// CHECK: %[[RESULT_IMAG:.*]] = arith.mulf %[[RESULT_REAL3]], %[[NEG_ONE]] +// CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL]], %[[RESULT_IMAG]] : complex // CHECK: return %[[RESULT]] : complex // ----- @@ -679,8 +590,8 @@ func.func @complex_tanh(%arg: complex) -> complex { } // CHECK: %[[REAL:.*]] = complex.re %[[ARG]] : complex // CHECK: %[[IMAG:.*]] = complex.im %[[ARG]] : complex -// CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32 // CHECK: %[[NEG_ONE:.*]] = arith.constant -1.000000e+00 : f32 +// CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32 // CHECK: %[[FOUR:.*]] = arith.constant 4.000000e+00 : f32 // CHECK: %[[TWO_REAL:.*]] = arith.addf %[[REAL]], %[[REAL]] : f32 // CHECK: %[[NEG_TWO_REAL:.*]] = arith.mulf %[[NEG_ONE]], %[[TWO_REAL]] : f32 @@ -1997,135 +1908,45 @@ func.func @complex_tan_with_fmf(%arg: complex) -> complex { return %tan : complex } -// CHECK-DAG: %[[REAL:.*]] = complex.re %[[ARG]] -// CHECK-DAG: %[[IMAG:.*]] = complex.im %[[ARG]] -// CHECK-DAG: %[[HALF:.*]] = arith.constant 5.000000e-01 : f32 -// CHECK-DAG: %[[EXP:.*]] = math.exp %[[IMAG]] fastmath : f32 -// CHECK-DAG: %[[HALF_EXP:.*]] = arith.mulf %[[HALF]], %[[EXP]] fastmath -// CHECK-DAG: %[[HALF_REXP:.*]] = arith.divf %[[HALF]], %[[EXP]] fastmath -// CHECK-DAG: %[[SIN:.*]] = math.sin %[[REAL]] fastmath : f32 -// CHECK-DAG: %[[COS:.*]] = math.cos %[[REAL]] fastmath : f32 -// CHECK-DAG: %[[EXP_SUM:.*]] = arith.addf %[[HALF_REXP]], %[[HALF_EXP]] fastmath -// CHECK-DAG: %[[COS_REAL:.*]] = arith.mulf %[[EXP_SUM]], %[[COS]] fastmath -// CHECK-DAG: %[[EXP_DIFF:.*]] = arith.subf %[[HALF_REXP]], %[[HALF_EXP]] fastmath -// CHECK-DAG: %[[COS_IMAG:.*]] = arith.mulf %[[EXP_DIFF]], %[[SIN]] fastmath -// CHECK-DAG: %[[COS_COMP:.*]] = complex.create %[[COS_REAL]], %[[COS_IMAG]] : complex - -// CHECK-DAG: %[[REAL:.*]] = complex.re %[[ARG]] -// CHECK-DAG: %[[IMAG:.*]] = complex.im %[[ARG]] -// CHECK-DAG: %[[HALF:.*]] = arith.constant 5.000000e-01 : f32 -// CHECK-DAG: %[[EXP:.*]] = math.exp %[[IMAG]] fastmath : f32 -// CHECK-DAG: %[[HALF_EXP:.*]] = arith.mulf %[[HALF]], %[[EXP]] fastmath -// CHECK-DAG: %[[HALF_REXP:.*]] = arith.divf %[[HALF]], %[[EXP]] fastmath -// CHECK-DAG: %[[SIN:.*]] = math.sin %[[REAL]] fastmath : f32 -// CHECK-DAG: %[[COS:.*]] = math.cos %[[REAL]] fastmath : f32 -// CHECK-DAG: %[[EXP_SUM:.*]] = arith.addf %[[HALF_EXP]], %[[HALF_REXP]] fastmath -// CHECK-DAG: %[[SIN_REAL:.*]] = arith.mulf %[[EXP_SUM]], %[[SIN]] fastmath -// CHECK-DAG: %[[EXP_DIFF:.*]] = arith.subf %[[HALF_EXP]], %[[HALF_REXP]] fastmath -// CHECK-DAG: %[[SIN_IMAG:.*]] = arith.mulf %[[EXP_DIFF]], %[[COS]] fastmath -// CHECK-DAG: %[[SIN_COMP:.*]] = complex.create %[[SIN_REAL]], %[[SIN_IMAG]] : complex - -// CHECK: %[[LHS_REAL:.*]] = complex.re %[[SIN_COMP]] : complex -// CHECK: %[[LHS_IMAG:.*]] = complex.im %[[SIN_COMP]] : complex -// CHECK: %[[RHS_REAL:.*]] = complex.re %[[COS_COMP]] : complex -// CHECK: %[[RHS_IMAG:.*]] = complex.im %[[COS_COMP]] : complex - -// CHECK: %[[RHS_REAL_IMAG_RATIO:.*]] = arith.divf %[[RHS_REAL]], %[[RHS_IMAG]] fastmath : f32 -// CHECK: %[[RHS_REAL_TIMES_RHS_REAL_IMAG_RATIO:.*]] = arith.mulf %[[RHS_REAL_IMAG_RATIO]], %[[RHS_REAL]] fastmath : f32 -// CHECK: %[[RHS_REAL_IMAG_DENOM:.*]] = arith.addf %[[RHS_IMAG]], %[[RHS_REAL_TIMES_RHS_REAL_IMAG_RATIO]] fastmath : f32 -// CHECK: %[[LHS_REAL_TIMES_RHS_REAL_IMAG_RATIO:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_REAL_IMAG_RATIO]] fastmath : f32 -// CHECK: %[[REAL_NUMERATOR_1:.*]] = arith.addf %[[LHS_REAL_TIMES_RHS_REAL_IMAG_RATIO]], %[[LHS_IMAG]] fastmath : f32 -// CHECK: %[[RESULT_REAL_1:.*]] = arith.divf %[[REAL_NUMERATOR_1]], %[[RHS_REAL_IMAG_DENOM]] fastmath : f32 -// CHECK: %[[LHS_IMAG_TIMES_RHS_REAL_IMAG_RATIO:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_REAL_IMAG_RATIO]] fastmath : f32 -// CHECK: %[[IMAG_NUMERATOR_1:.*]] = arith.subf %[[LHS_IMAG_TIMES_RHS_REAL_IMAG_RATIO]], %[[LHS_REAL]] fastmath : f32 -// CHECK: %[[RESULT_IMAG_1:.*]] = arith.divf %[[IMAG_NUMERATOR_1]], %[[RHS_REAL_IMAG_DENOM]] fastmath : f32 - -// CHECK: %[[RHS_IMAG_REAL_RATIO:.*]] = arith.divf %[[RHS_IMAG]], %[[RHS_REAL]] fastmath : f32 -// CHECK: %[[RHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO:.*]] = arith.mulf %[[RHS_IMAG_REAL_RATIO]], %[[RHS_IMAG]] fastmath : f32 -// CHECK: %[[RHS_IMAG_REAL_DENOM:.*]] = arith.addf %[[RHS_REAL]], %[[RHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO]] fastmath : f32 -// CHECK: %[[LHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_IMAG_REAL_RATIO]] fastmath : f32 -// CHECK: %[[REAL_NUMERATOR_2:.*]] = arith.addf %[[LHS_REAL]], %[[LHS_IMAG_TIMES_RHS_IMAG_REAL_RATIO]] fastmath : f32 -// CHECK: %[[RESULT_REAL_2:.*]] = arith.divf %[[REAL_NUMERATOR_2]], %[[RHS_IMAG_REAL_DENOM]] fastmath : f32 -// CHECK: %[[LHS_REAL_TIMES_RHS_IMAG_REAL_RATIO:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_IMAG_REAL_RATIO]] fastmath : f32 -// CHECK: %[[IMAG_NUMERATOR_2:.*]] = arith.subf %[[LHS_IMAG]], %[[LHS_REAL_TIMES_RHS_IMAG_REAL_RATIO]] fastmath : f32 -// CHECK: %[[RESULT_IMAG_2:.*]] = arith.divf %[[IMAG_NUMERATOR_2]], %[[RHS_IMAG_REAL_DENOM]] fastmath : f32 - -// Case 1. Zero denominator, numerator contains at most one NaN value. -// CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f32 -// CHECK: %[[RHS_REAL_ABS:.*]] = math.absf %[[RHS_REAL]] fastmath : f32 -// CHECK: %[[RHS_REAL_ABS_IS_ZERO:.*]] = arith.cmpf oeq, %[[RHS_REAL_ABS]], %[[ZERO]] : f32 -// CHECK: %[[RHS_IMAG_ABS:.*]] = math.absf %[[RHS_IMAG]] fastmath : f32 -// CHECK: %[[RHS_IMAG_ABS_IS_ZERO:.*]] = arith.cmpf oeq, %[[RHS_IMAG_ABS]], %[[ZERO]] : f32 -// CHECK: %[[LHS_REAL_IS_NOT_NAN:.*]] = arith.cmpf ord, %[[LHS_REAL]], %[[ZERO]] : f32 -// CHECK: %[[LHS_IMAG_IS_NOT_NAN:.*]] = arith.cmpf ord, %[[LHS_IMAG]], %[[ZERO]] : f32 -// CHECK: %[[LHS_CONTAINS_NOT_NAN_VALUE:.*]] = arith.ori %[[LHS_REAL_IS_NOT_NAN]], %[[LHS_IMAG_IS_NOT_NAN]] : i1 -// CHECK: %[[RHS_IS_ZERO:.*]] = arith.andi %[[RHS_REAL_ABS_IS_ZERO]], %[[RHS_IMAG_ABS_IS_ZERO]] : i1 -// CHECK: %[[RESULT_IS_INFINITY:.*]] = arith.andi %[[LHS_CONTAINS_NOT_NAN_VALUE]], %[[RHS_IS_ZERO]] : i1 +// CHECK: %[[IMAG:.*]] = complex.re %[[ARG]] : complex +// CHECK: %[[V0:.*]] = complex.im %[[ARG]] : complex +// CHECK: %[[NEG_ONE:.*]] = arith.constant -1.000000e+00 : f32 +// CHECK: %[[REAL:.*]] = arith.mulf %[[V0]], %cst fastmath : f32 // CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32 -// CHECK: %[[INF_WITH_SIGN_OF_RHS_REAL:.*]] = math.copysign %[[INF]], %[[RHS_REAL]] : f32 -// CHECK: %[[INFINITY_RESULT_REAL:.*]] = arith.mulf %[[INF_WITH_SIGN_OF_RHS_REAL]], %[[LHS_REAL]] fastmath : f32 -// CHECK: %[[INFINITY_RESULT_IMAG:.*]] = arith.mulf %[[INF_WITH_SIGN_OF_RHS_REAL]], %[[LHS_IMAG]] fastmath : f32 - -// Case 2. Infinite numerator, finite denominator. -// CHECK: %[[RHS_REAL_FINITE:.*]] = arith.cmpf one, %[[RHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IMAG_FINITE:.*]] = arith.cmpf one, %[[RHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IS_FINITE:.*]] = arith.andi %[[RHS_REAL_FINITE]], %[[RHS_IMAG_FINITE]] : i1 -// CHECK: %[[LHS_REAL_ABS:.*]] = math.absf %[[LHS_REAL]] fastmath : f32 -// CHECK: %[[LHS_REAL_INFINITE:.*]] = arith.cmpf oeq, %[[LHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IMAG_ABS:.*]] = math.absf %[[LHS_IMAG]] fastmath : f32 -// CHECK: %[[LHS_IMAG_INFINITE:.*]] = arith.cmpf oeq, %[[LHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IS_INFINITE:.*]] = arith.ori %[[LHS_REAL_INFINITE]], %[[LHS_IMAG_INFINITE]] : i1 -// CHECK: %[[INF_NUM_FINITE_DENOM:.*]] = arith.andi %[[LHS_IS_INFINITE]], %[[RHS_IS_FINITE]] : i1 -// CHECK: %[[ONE:.*]] = arith.constant 1.000000e+00 : f32 -// CHECK: %[[LHS_REAL_IS_INF:.*]] = arith.select %[[LHS_REAL_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[LHS_REAL_IS_INF_WITH_SIGN:.*]] = math.copysign %[[LHS_REAL_IS_INF]], %[[LHS_REAL]] : f32 -// CHECK: %[[LHS_IMAG_IS_INF:.*]] = arith.select %[[LHS_IMAG_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[LHS_IMAG_IS_INF_WITH_SIGN:.*]] = math.copysign %[[LHS_IMAG_IS_INF]], %[[LHS_IMAG]] : f32 -// CHECK: %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_REAL:.*]] = arith.mulf %[[LHS_REAL_IS_INF_WITH_SIGN]], %[[RHS_REAL]] fastmath : f32 -// CHECK: %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_IMAG:.*]] = arith.mulf %[[LHS_IMAG_IS_INF_WITH_SIGN]], %[[RHS_IMAG]] fastmath : f32 -// CHECK: %[[INF_MULTIPLICATOR_1:.*]] = arith.addf %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_REAL]], %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_IMAG]] fastmath : f32 -// CHECK: %[[RESULT_REAL_3:.*]] = arith.mulf %[[INF]], %[[INF_MULTIPLICATOR_1]] fastmath : f32 -// CHECK: %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_IMAG:.*]] = arith.mulf %[[LHS_REAL_IS_INF_WITH_SIGN]], %[[RHS_IMAG]] fastmath : f32 -// CHECK: %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_REAL:.*]] = arith.mulf %[[LHS_IMAG_IS_INF_WITH_SIGN]], %[[RHS_REAL]] fastmath : f32 -// CHECK: %[[INF_MULTIPLICATOR_2:.*]] = arith.subf %[[LHS_IMAG_IS_INF_WITH_SIGN_TIMES_RHS_REAL]], %[[LHS_REAL_IS_INF_WITH_SIGN_TIMES_RHS_IMAG]] fastmath : f32 -// CHECK: %[[RESULT_IMAG_3:.*]] = arith.mulf %[[INF]], %[[INF_MULTIPLICATOR_2]] fastmath : f32 - -// Case 3. Finite numerator, infinite denominator. -// CHECK: %[[LHS_REAL_FINITE:.*]] = arith.cmpf one, %[[LHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IMAG_FINITE:.*]] = arith.cmpf one, %[[LHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[LHS_IS_FINITE:.*]] = arith.andi %[[LHS_REAL_FINITE]], %[[LHS_IMAG_FINITE]] : i1 -// CHECK: %[[RHS_REAL_INFINITE:.*]] = arith.cmpf oeq, %[[RHS_REAL_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IMAG_INFINITE:.*]] = arith.cmpf oeq, %[[RHS_IMAG_ABS]], %[[INF]] : f32 -// CHECK: %[[RHS_IS_INFINITE:.*]] = arith.ori %[[RHS_REAL_INFINITE]], %[[RHS_IMAG_INFINITE]] : i1 -// CHECK: %[[FINITE_NUM_INFINITE_DENOM:.*]] = arith.andi %[[LHS_IS_FINITE]], %[[RHS_IS_INFINITE]] : i1 -// CHECK: %[[RHS_REAL_IS_INF:.*]] = arith.select %[[RHS_REAL_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[RHS_REAL_IS_INF_WITH_SIGN:.*]] = math.copysign %[[RHS_REAL_IS_INF]], %[[RHS_REAL]] : f32 -// CHECK: %[[RHS_IMAG_IS_INF:.*]] = arith.select %[[RHS_IMAG_INFINITE]], %[[ONE]], %[[ZERO]] : f32 -// CHECK: %[[RHS_IMAG_IS_INF_WITH_SIGN:.*]] = math.copysign %[[RHS_IMAG_IS_INF]], %[[RHS_IMAG]] : f32 -// CHECK: %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_REAL:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_REAL_IS_INF_WITH_SIGN]] fastmath : f32 -// CHECK: %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_IMAG:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_IMAG_IS_INF_WITH_SIGN]] fastmath : f32 -// CHECK: %[[ZERO_MULTIPLICATOR_1:.*]] = arith.addf %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_REAL]], %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_IMAG]] fastmath : f32 -// CHECK: %[[RESULT_REAL_4:.*]] = arith.mulf %[[ZERO]], %[[ZERO_MULTIPLICATOR_1]] fastmath : f32 -// CHECK: %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_IMAG:.*]] = arith.mulf %[[LHS_IMAG]], %[[RHS_REAL_IS_INF_WITH_SIGN]] fastmath : f32 -// CHECK: %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_REAL:.*]] = arith.mulf %[[LHS_REAL]], %[[RHS_IMAG_IS_INF_WITH_SIGN]] fastmath : f32 -// CHECK: %[[ZERO_MULTIPLICATOR_2:.*]] = arith.subf %[[RHS_REAL_IS_INF_WITH_SIGN_TIMES_LHS_IMAG]], %[[RHS_IMAG_IS_INF_WITH_SIGN_TIMES_LHS_REAL]] fastmath : f32 -// CHECK: %[[RESULT_IMAG_4:.*]] = arith.mulf %[[ZERO]], %[[ZERO_MULTIPLICATOR_2]] fastmath : f32 - -// CHECK: %[[REAL_ABS_SMALLER_THAN_IMAG_ABS:.*]] = arith.cmpf olt, %[[RHS_REAL_ABS]], %[[RHS_IMAG_ABS]] : f32 -// CHECK: %[[RESULT_REAL:.*]] = arith.select %[[REAL_ABS_SMALLER_THAN_IMAG_ABS]], %[[RESULT_REAL_1]], %[[RESULT_REAL_2]] : f32 -// CHECK: %[[RESULT_IMAG:.*]] = arith.select %[[REAL_ABS_SMALLER_THAN_IMAG_ABS]], %[[RESULT_IMAG_1]], %[[RESULT_IMAG_2]] : f32 -// CHECK: %[[RESULT_REAL_SPECIAL_CASE_3:.*]] = arith.select %[[FINITE_NUM_INFINITE_DENOM]], %[[RESULT_REAL_4]], %[[RESULT_REAL]] : f32 -// CHECK: %[[RESULT_IMAG_SPECIAL_CASE_3:.*]] = arith.select %[[FINITE_NUM_INFINITE_DENOM]], %[[RESULT_IMAG_4]], %[[RESULT_IMAG]] : f32 -// CHECK: %[[RESULT_REAL_SPECIAL_CASE_2:.*]] = arith.select %[[INF_NUM_FINITE_DENOM]], %[[RESULT_REAL_3]], %[[RESULT_REAL_SPECIAL_CASE_3]] : f32 -// CHECK: %[[RESULT_IMAG_SPECIAL_CASE_2:.*]] = arith.select %[[INF_NUM_FINITE_DENOM]], %[[RESULT_IMAG_3]], %[[RESULT_IMAG_SPECIAL_CASE_3]] : f32 -// CHECK: %[[RESULT_REAL_SPECIAL_CASE_1:.*]] = arith.select %[[RESULT_IS_INFINITY]], %[[INFINITY_RESULT_REAL]], %[[RESULT_REAL_SPECIAL_CASE_2]] : f32 -// CHECK: %[[RESULT_IMAG_SPECIAL_CASE_1:.*]] = arith.select %[[RESULT_IS_INFINITY]], %[[INFINITY_RESULT_IMAG]], %[[RESULT_IMAG_SPECIAL_CASE_2]] : f32 -// CHECK: %[[RESULT_REAL_IS_NAN:.*]] = arith.cmpf uno, %[[RESULT_REAL]], %[[ZERO]] : f32 -// CHECK: %[[RESULT_IMAG_IS_NAN:.*]] = arith.cmpf uno, %[[RESULT_IMAG]], %[[ZERO]] : f32 -// CHECK: %[[RESULT_IS_NAN:.*]] = arith.andi %[[RESULT_REAL_IS_NAN]], %[[RESULT_IMAG_IS_NAN]] : i1 -// CHECK: %[[RESULT_REAL_WITH_SPECIAL_CASES:.*]] = arith.select %[[RESULT_IS_NAN]], %[[RESULT_REAL_SPECIAL_CASE_1]], %[[RESULT_REAL]] : f32 -// CHECK: %[[RESULT_IMAG_WITH_SPECIAL_CASES:.*]] = arith.select %[[RESULT_IS_NAN]], %[[RESULT_IMAG_SPECIAL_CASE_1]], %[[RESULT_IMAG]] : f32 -// CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL_WITH_SPECIAL_CASES]], %[[RESULT_IMAG_WITH_SPECIAL_CASES]] : complex +// CHECK: %[[FOUR:.*]] = arith.constant 4.000000e+00 : f32 +// CHECK: %[[TWO_REAL:.*]] = arith.addf %[[REAL]], %[[REAL]] fastmath : f32 +// CHECK: %[[NEG_TWO_REAL:.*]] = arith.mulf %[[NEG_ONE]], %[[TWO_REAL]] fastmath : f32 +// CHECK: %[[EXPM1:.*]] = math.expm1 %[[TWO_REAL]] fastmath : f32 +// CHECK: %[[EXPM1_2:.*]] = math.expm1 %[[NEG_TWO_REAL]] fastmath : f32 +// CHECK: %[[REAL_NUM:.*]] = arith.subf %[[EXPM1]], %[[EXPM1_2]] fastmath : f32 +// CHECK: %[[COS:.*]] = math.cos %[[IMAG]] fastmath : f32 +// CHECK: %[[COS_SQ:.*]] = arith.mulf %[[COS]], %[[COS]] fastmath : f32 +// CHECK: %[[FOUR_COS_SQ:.*]] = arith.mulf %[[COS_SQ]], %[[FOUR]] fastmath : f32 +// CHECK: %[[SIN:.*]] = math.sin %[[IMAG]] fastmath : f32 +// CHECK: %[[MUL:.*]] = arith.mulf %[[COS]], %[[SIN]] fastmath : f32 +// CHECK: %[[IMAG_NUM:.*]] = arith.mulf %[[FOUR]], %[[MUL]] fastmath : f32 +// CHECK: %[[ADD:.*]] = arith.addf %[[EXPM1]], %[[EXPM1_2]] fastmath : f32 +// CHECK: %[[DENOM:.*]] = arith.addf %[[ADD]], %[[FOUR_COS_SQ]] fastmath : f32 +// CHECK: %[[IS_INF:.*]] = arith.cmpf oeq, %[[ADD]], %[[INF]] fastmath : f32 +// CHECK: %[[LIMIT:.*]] = math.copysign %[[NEG_ONE]], %[[REAL]] fastmath : f32 +// CHECK: %[[RESULT_REAL:.*]] = arith.divf %[[REAL_NUM]], %[[DENOM]] fastmath : f32 +// CHECK: %[[RESULT_REAL2:.*]] = arith.select %[[IS_INF]], %[[LIMIT]], %[[RESULT_REAL]] : f32 +// CHECK: %[[RESULT_IMAG:.*]] = arith.divf %[[IMAG_NUM]], %[[DENOM]] fastmath : f32 +// CHECK: %[[ABS_REAL:.*]] = math.absf %[[REAL]] fastmath : f32 +// CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f32 +// CHECK: %[[NAN:.*]] = arith.constant 0x7FC00000 : f32 +// CHECK: %[[ABS_REAL_INF:.*]] = arith.cmpf oeq, %[[ABS_REAL]], %[[INF]] fastmath : f32 +// CHECK: %[[IMAG_ZERO:.*]] = arith.cmpf oeq, %[[IMAG]], %[[ZERO]] fastmath : f32 +// CHECK: %true = arith.constant true +// CHECK: %[[ABS_REAL_NOT_INF:.*]] = arith.xori %[[ABS_REAL_INF]], %true : i1 +// CHECK: %[[IMAG_IS_NAN:.*]] = arith.cmpf uno, %[[IMAG_NUM]], %[[IMAG_NUM]] fastmath : f32 +// CHECK: %[[REAL_IS_NAN:.*]] = arith.andi %[[IMAG_IS_NAN]], %[[ABS_REAL_NOT_INF]] : i1 +// CHECK: %[[AND:.*]] = arith.andi %[[ABS_REAL_INF]], %[[IMAG_IS_NAN]] : i1 +// CHECK: %[[IMAG_IS_NAN2:.*]] = arith.ori %[[IMAG_ZERO]], %[[AND]] : i1 +// CHECK: %[[RESULT_REAL3:.*]] = arith.select %[[REAL_IS_NAN]], %[[NAN]], %[[RESULT_REAL2]] : f32 +// CHECK: %[[RESULT_REAL:.*]] = arith.select %[[IMAG_IS_NAN2]], %[[ZERO]], %[[RESULT_IMAG]] : f32 +// CHECK: %[[RESULT_IMAG:.*]] = arith.mulf %[[RESULT_REAL3]], %[[NEG_ONE]] fastmath : f32 +// CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL]], %[[RESULT_IMAG]] : complex // CHECK: return %[[RESULT]] : complex // ----- @@ -2139,8 +1960,8 @@ func.func @complex_tanh_with_fmf(%arg: complex) -> complex { // CHECK: %[[REAL:.*]] = complex.re %[[ARG]] : complex // CHECK: %[[IMAG:.*]] = complex.im %[[ARG]] : complex -// CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32 // CHECK: %[[NEG_ONE:.*]] = arith.constant -1.000000e+00 : f32 +// CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32 // CHECK: %[[FOUR:.*]] = arith.constant 4.000000e+00 : f32 // CHECK: %[[TWO_REAL:.*]] = arith.addf %[[REAL]], %[[REAL]] fastmath : f32 // CHECK: %[[NEG_TWO_REAL:.*]] = arith.mulf %[[NEG_ONE]], %[[TWO_REAL]] fastmath : f32 -- GitLab From 5b7088c3619e95eaa8e154765470ddb4d3859fa4 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 17 May 2024 08:45:00 +0200 Subject: [PATCH 0017/1875] TargetLibraryInfo: Assume no libcalls in the default constructor (#92400) The only tricky point here is PlaceSafepoints has an awful hack where it's creating a legacy PassManager inside it's runImpl, which was not propagating the incoming TLI. This means there's an implicit bug fix, where PlaceSafepoints would have been treating too many calls as builtins. I'm trying to delete the default constructor altogether, but this seems to be more difficult. --- llvm/lib/Analysis/TargetLibraryInfo.cpp | 51 +++++++++++++++---------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp index 684b0759f315..7ce42447b630 100644 --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -160,11 +160,28 @@ bool TargetLibraryInfoImpl::isCallingConvCCompatible(Function *F) { F->getFunctionType()); } +static void initializeBase(TargetLibraryInfoImpl &TLI, const Triple &T) { + bool ShouldExtI32Param, ShouldExtI32Return; + bool ShouldSignExtI32Param, ShouldSignExtI32Return; + TargetLibraryInfo::initExtensionsForTriple( + ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param, + ShouldSignExtI32Return, T); + TLI.setShouldExtI32Param(ShouldExtI32Param); + TLI.setShouldExtI32Return(ShouldExtI32Return); + TLI.setShouldSignExtI32Param(ShouldSignExtI32Param); + TLI.setShouldSignExtI32Return(ShouldSignExtI32Return); + + // Let's assume by default that the size of int is 32 bits, unless the target + // is a 16-bit architecture because then it most likely is 16 bits. If that + // isn't true for a target those defaults should be overridden below. + TLI.setIntSize(T.isArch16Bit() ? 16 : 32); +} + /// Initialize the set of available library functions based on the specified /// target triple. This should be carefully written so that a missing target /// triple gets a sane set of defaults. -static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, - ArrayRef StandardNames) { +static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T, + ArrayRef StandardNames) { // Set IO unlocked variants as unavailable // Set them as available per system below TLI.setUnavailable(LibFunc_getc_unlocked); @@ -178,20 +195,6 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, TLI.setUnavailable(LibFunc_fputs_unlocked); TLI.setUnavailable(LibFunc_fgets_unlocked); - bool ShouldExtI32Param, ShouldExtI32Return; - bool ShouldSignExtI32Param, ShouldSignExtI32Return; - TargetLibraryInfo::initExtensionsForTriple(ShouldExtI32Param, - ShouldExtI32Return, ShouldSignExtI32Param, ShouldSignExtI32Return, T); - TLI.setShouldExtI32Param(ShouldExtI32Param); - TLI.setShouldExtI32Return(ShouldExtI32Return); - TLI.setShouldSignExtI32Param(ShouldSignExtI32Param); - TLI.setShouldSignExtI32Return(ShouldSignExtI32Return); - - // Let's assume by default that the size of int is 32 bits, unless the target - // is a 16-bit architecture because then it most likely is 16 bits. If that - // isn't true for a target those defaults should be overridden below. - TLI.setIntSize(T.isArch16Bit() ? 16 : 32); - // There is really no runtime library on AMDGPU, apart from // __kmpc_alloc/free_shared. if (T.isAMDGPU()) { @@ -882,11 +885,19 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary, T); } -TargetLibraryInfoImpl::TargetLibraryInfoImpl() { - // Default to everything being available. - memset(AvailableArray, -1, sizeof(AvailableArray)); +/// Initialize the set of available library functions based on the specified +/// target triple. This should be carefully written so that a missing target +/// triple gets a sane set of defaults. +static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, + ArrayRef StandardNames) { + initializeBase(TLI, T); + initializeLibCalls(TLI, T, StandardNames); +} - initialize(*this, Triple(), StandardNames); +TargetLibraryInfoImpl::TargetLibraryInfoImpl() { + // Default to nothing being available. + memset(AvailableArray, 0, sizeof(AvailableArray)); + initializeBase(*this, Triple()); } TargetLibraryInfoImpl::TargetLibraryInfoImpl(const Triple &T) { -- GitLab From 37d00635c4ff1b656a49635e826aeff8063dc1e8 Mon Sep 17 00:00:00 2001 From: Vyacheslav Levytskyy Date: Fri, 17 May 2024 09:01:29 +0200 Subject: [PATCH 0018/1875] [SPIR-V] Ensure that internal intrinsic functions for PHI's operand are inserted at the correct positions (#92316) This PR is to ensure that internal intrinsic functions for PHI's operand are inserted at the correct positions and don't break rules of instruction domination and PHI nodes grouping at top of basic block. --- llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp | 4 +- llvm/test/CodeGen/SPIRV/phi-insert-point.ll | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/SPIRV/phi-insert-point.ll diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp index c00066f5dca6..d90249f7c2e6 100644 --- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp @@ -174,7 +174,7 @@ static bool isAggrToReplace(const Value *V) { static void setInsertPointSkippingPhis(IRBuilder<> &B, Instruction *I) { if (isa(I)) - B.SetInsertPoint(I->getParent(), I->getParent()->getFirstInsertionPt()); + B.SetInsertPoint(I->getParent()->getFirstNonPHIOrDbgOrAlloca()); else B.SetInsertPoint(I); } @@ -491,7 +491,7 @@ void SPIRVEmitIntrinsics::deduceOperandElementType(Instruction *I) { if (Instruction *User = dyn_cast(Op->use_begin()->get())) setInsertPointSkippingPhis(B, User->getNextNode()); else - B.SetInsertPoint(I); + setInsertPointSkippingPhis(B, I); Value *OpTyVal = Constant::getNullValue(KnownElemTy); Type *OpTy = Op->getType(); if (!Ty) { diff --git a/llvm/test/CodeGen/SPIRV/phi-insert-point.ll b/llvm/test/CodeGen/SPIRV/phi-insert-point.ll new file mode 100644 index 000000000000..41cc514f4dba --- /dev/null +++ b/llvm/test/CodeGen/SPIRV/phi-insert-point.ll @@ -0,0 +1,59 @@ +; The goal of the test is to check that internal intrinsic functions for PHI's +; operand are inserted at the correct positions, and don't break rules of +; instruction domination and PHI nodes grouping at top of basic block. + +; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} + +; CHECK-DAG: OpName %[[#Foo:]] "foo" +; CHECK-DAG: OpName %[[#Bar:]] "bar" +; CHECK: %[[#Foo]] = OpFunction +; CHECK: OpPhi +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpPhi +; CHECK: %[[#Bar]] = OpFunction +; CHECK: OpPhi +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpPhi + +%struct = type { i64, i64 } + +define spir_kernel void @foo(i64 %arg_val, ptr addrspace(4) byval(%struct) %arg_ptr) { +entry: + %fl = icmp eq i64 %arg_val, 0 + br i1 %fl, label %ok, label %err + +err: + br label %ok + +ok: + %r1 = phi i64 [ undef, %err ], [ %arg_val, %entry ] + %r2 = phi i64 [ undef, %err ], [ %arg_val, %entry ] + %r3 = phi ptr addrspace(4) [ undef, %err ], [ %arg_ptr, %entry ] + %r4 = phi ptr addrspace(4) [ undef, %err ], [ %arg_ptr, %entry ] + br label %exit + +exit: + ret void +} + +define spir_kernel void @bar(i64 %arg_val, i64 %arg_val_def, ptr addrspace(4) byval(%struct) %arg_ptr, ptr addrspace(4) %arg_ptr_def) { +entry: + %fl = icmp eq i64 %arg_val, 0 + br i1 %fl, label %ok, label %err + +err: + br label %ok + +ok: + %r1 = phi i64 [ %arg_val_def, %err ], [ %arg_val, %entry ] + %r2 = phi i64 [ %arg_val_def, %err ], [ %arg_val, %entry ] + %r3 = phi ptr addrspace(4) [ %arg_ptr_def, %err ], [ %arg_ptr, %entry ] + %r4 = phi ptr addrspace(4) [ %arg_ptr_def, %err ], [ %arg_ptr, %entry ] + br label %exit + +exit: + ret void +} -- GitLab From e0a293d12f3fe1c2a284e2e116cfa77d894da49f Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Fri, 17 May 2024 00:10:00 -0700 Subject: [PATCH 0019/1875] [mlir] Fix a warning This patch fixes: mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp:964:26: error: missing 'typename' prior to dependent type name Op::Adaptor; implicit 'typename' is a C++20 extension [-Werror,-Wc++20-extensions] --- mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp b/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp index edca8eaecbff..d8150aeb828a 100644 --- a/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp +++ b/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp @@ -961,7 +961,7 @@ struct TanTanhOpConversion : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; LogicalResult - matchAndRewrite(Op op, Op::Adaptor adaptor, + matchAndRewrite(Op op, typename Op::Adaptor adaptor, ConversionPatternRewriter &rewriter) const override { ImplicitLocOpBuilder b(op.getLoc(), rewriter); auto loc = op.getLoc(); -- GitLab From b27eb0ae8280675fc8fb249d39f1ccafa3ee2187 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Fri, 17 May 2024 07:32:02 +0000 Subject: [PATCH 0020/1875] [lldb] Avoid modifying the source tree in TestCompletion.py This was a side-effect of the "optimization" in #92281. Deoptimize the code slightly. --- .../completion/TestCompletion.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lldb/test/API/functionalities/completion/TestCompletion.py b/lldb/test/API/functionalities/completion/TestCompletion.py index 63842487fc33..15aeaf8d0e89 100644 --- a/lldb/test/API/functionalities/completion/TestCompletion.py +++ b/lldb/test/API/functionalities/completion/TestCompletion.py @@ -108,15 +108,17 @@ class CommandLineCompletionTestCase(TestBase): ) err = lldb.SBError() local_spec = lldb.SBFileSpec(self.getBuildArtifact("libshared.so")) - remote_spec = ( - lldb.SBFileSpec( - lldbutil.append_to_process_working_directory(self, "libshared.so"), - False, + if lldb.remote_platform: + self.process().LoadImage( + local_spec, + lldb.SBFileSpec( + lldbutil.append_to_process_working_directory(self, "libshared.so"), + False, + ), + err, ) - if lldb.remote_platform - else lldb.SBFileSpec() - ) - self.process().LoadImage(local_spec, remote_spec, err) + else: + self.process().LoadImage(local_spec, err) self.assertSuccess(err) self.complete_from_to("process unload ", "process unload 0") -- GitLab From c4bac7f7dcd931a5e561604e95656a24c3d1c9d9 Mon Sep 17 00:00:00 2001 From: CarolineConcatto Date: Fri, 17 May 2024 09:25:21 +0100 Subject: [PATCH 0021/1875] =?UTF-8?q?[LLVM][AArch64]Use=20load/store=20wit?= =?UTF-8?q?h=20consecutive=20registers=20in=20SME2=20or=20S=E2=80=A6=20(#7?= =?UTF-8?q?7665)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …VE2.1 for spill/fill When possible the spill/fill register in Frame Lowering uses the ld/st consecutive pairs available in sme or sve2.1. --- .../Target/AArch64/AArch64FrameLowering.cpp | 204 ++- .../AArch64/AArch64MachineFunctionInfo.h | 11 + .../CodeGen/AArch64/sme2-intrinsics-ld1.ll | 1488 ++++++----------- .../CodeGen/AArch64/sme2-intrinsics-ldnt1.ll | 1488 ++++++----------- .../AArch64/sve-callee-save-restore-pairs.ll | 556 ++++++ 5 files changed, 1815 insertions(+), 1932 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/sve-callee-save-restore-pairs.ll diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp index c86c98eed24f..239862756fc4 100644 --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -1508,6 +1508,9 @@ static bool IsSVECalleeSave(MachineBasicBlock::iterator I) { switch (I->getOpcode()) { default: return false; + case AArch64::PTRUE_C_B: + case AArch64::LD1B_2Z_IMM: + case AArch64::ST1B_2Z_IMM: case AArch64::STR_ZXI: case AArch64::STR_PXI: case AArch64::LDR_ZXI: @@ -2781,6 +2784,16 @@ struct RegPairInfo { } // end anonymous namespace +unsigned findFreePredicateReg(BitVector &SavedRegs) { + for (unsigned PReg = AArch64::P8; PReg <= AArch64::P15; ++PReg) { + if (SavedRegs.test(PReg)) { + unsigned PNReg = PReg - AArch64::P0 + AArch64::PN0; + return PNReg; + } + } + return AArch64::NoRegister; +} + static void computeCalleeSaveRegisterPairs( MachineFunction &MF, ArrayRef CSI, const TargetRegisterInfo *TRI, SmallVectorImpl &RegPairs, @@ -2859,7 +2872,11 @@ static void computeCalleeSaveRegisterPairs( RPI.Reg2 = NextReg; break; case RegPairInfo::PPR: + break; case RegPairInfo::ZPR: + if (AFI->getPredicateRegForFillSpill() != 0) + if (((RPI.Reg1 - AArch64::Z0) & 1) == 0 && (NextReg == RPI.Reg1 + 1)) + RPI.Reg2 = NextReg; break; } } @@ -2897,14 +2914,13 @@ static void computeCalleeSaveRegisterPairs( if (NeedsWinCFI && RPI.isPaired()) // RPI.FrameIdx must be the lower index of the pair RPI.FrameIdx = CSI[i + RegInc].getFrameIdx(); - int Scale = RPI.getScale(); int OffsetPre = RPI.isScalable() ? ScalableByteOffset : ByteOffset; assert(OffsetPre % Scale == 0); if (RPI.isScalable()) - ScalableByteOffset += StackFillDir * Scale; + ScalableByteOffset += StackFillDir * (RPI.isPaired() ? 2 * Scale : Scale); else ByteOffset += StackFillDir * (RPI.isPaired() ? 2 * Scale : Scale); @@ -2915,9 +2931,6 @@ static void computeCalleeSaveRegisterPairs( (IsWindows && RPI.Reg2 == AArch64::LR))) ByteOffset += StackFillDir * 8; - assert(!(RPI.isScalable() && RPI.isPaired()) && - "Paired spill/fill instructions don't exist for SVE vectors"); - // Round up size of non-pair to pair size if we need to pad the // callee-save area to ensure 16-byte alignment. if (NeedGapToAlignStack && !NeedsWinCFI && @@ -3004,6 +3017,7 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters( } return true; } + bool PTrueCreated = false; for (const RegPairInfo &RPI : llvm::reverse(RegPairs)) { unsigned Reg1 = RPI.Reg1; unsigned Reg2 = RPI.Reg2; @@ -3038,10 +3052,10 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters( Alignment = Align(16); break; case RegPairInfo::ZPR: - StrOpc = AArch64::STR_ZXI; - Size = 16; - Alignment = Align(16); - break; + StrOpc = RPI.isPaired() ? AArch64::ST1B_2Z_IMM : AArch64::STR_ZXI; + Size = 16; + Alignment = Align(16); + break; case RegPairInfo::PPR: StrOpc = AArch64::STR_PXI; Size = 2; @@ -3065,33 +3079,79 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters( std::swap(Reg1, Reg2); std::swap(FrameIdxReg1, FrameIdxReg2); } - MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(StrOpc)); - if (!MRI.isReserved(Reg1)) - MBB.addLiveIn(Reg1); - if (RPI.isPaired()) { + + if (RPI.isPaired() && RPI.isScalable()) { + const AArch64Subtarget &Subtarget = MF.getSubtarget(); + AArch64FunctionInfo *AFI = MF.getInfo(); + unsigned PnReg = AFI->getPredicateRegForFillSpill(); + assert(((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) && PnReg != 0) && + "Expects SVE2.1 or SME2 target and a predicate register"); +#ifdef EXPENSIVE_CHECKS + auto IsPPR = [](const RegPairInfo &c) { + return c.Reg1 == RegPairInfo::PPR; + }; + auto PPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsPPR); + auto IsZPR = [](const RegPairInfo &c) { + return c.Type == RegPairInfo::ZPR; + }; + auto ZPRBegin = std::find_if(RegPairs.begin(), RegPairs.end(), IsZPR); + assert(!(PPRBegin < ZPRBegin) && + "Expected callee save predicate to be handled first"); +#endif + if (!PTrueCreated) { + PTrueCreated = true; + BuildMI(MBB, MI, DL, TII.get(AArch64::PTRUE_C_B), PnReg) + .setMIFlags(MachineInstr::FrameSetup); + } + MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(StrOpc)); + if (!MRI.isReserved(Reg1)) + MBB.addLiveIn(Reg1); if (!MRI.isReserved(Reg2)) MBB.addLiveIn(Reg2); - MIB.addReg(Reg2, getPrologueDeath(MF, Reg2)); + MIB.addReg(/*PairRegs*/ AArch64::Z0_Z1 + (RPI.Reg1 - AArch64::Z0)); MIB.addMemOperand(MF.getMachineMemOperand( MachinePointerInfo::getFixedStack(MF, FrameIdxReg2), MachineMemOperand::MOStore, Size, Alignment)); + MIB.addReg(PnReg); + MIB.addReg(AArch64::SP) + .addImm(RPI.Offset) // [sp, #offset*scale], + // where factor*scale is implicit + .setMIFlag(MachineInstr::FrameSetup); + MIB.addMemOperand(MF.getMachineMemOperand( + MachinePointerInfo::getFixedStack(MF, FrameIdxReg1), + MachineMemOperand::MOStore, Size, Alignment)); + if (NeedsWinCFI) + InsertSEH(MIB, TII, MachineInstr::FrameSetup); + } else { // The code when the pair of ZReg is not present + MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(StrOpc)); + if (!MRI.isReserved(Reg1)) + MBB.addLiveIn(Reg1); + if (RPI.isPaired()) { + if (!MRI.isReserved(Reg2)) + MBB.addLiveIn(Reg2); + MIB.addReg(Reg2, getPrologueDeath(MF, Reg2)); + MIB.addMemOperand(MF.getMachineMemOperand( + MachinePointerInfo::getFixedStack(MF, FrameIdxReg2), + MachineMemOperand::MOStore, Size, Alignment)); + } + MIB.addReg(Reg1, getPrologueDeath(MF, Reg1)) + .addReg(AArch64::SP) + .addImm(RPI.Offset) // [sp, #offset*scale], + // where factor*scale is implicit + .setMIFlag(MachineInstr::FrameSetup); + MIB.addMemOperand(MF.getMachineMemOperand( + MachinePointerInfo::getFixedStack(MF, FrameIdxReg1), + MachineMemOperand::MOStore, Size, Alignment)); + if (NeedsWinCFI) + InsertSEH(MIB, TII, MachineInstr::FrameSetup); } - MIB.addReg(Reg1, getPrologueDeath(MF, Reg1)) - .addReg(AArch64::SP) - .addImm(RPI.Offset) // [sp, #offset*scale], - // where factor*scale is implicit - .setMIFlag(MachineInstr::FrameSetup); - MIB.addMemOperand(MF.getMachineMemOperand( - MachinePointerInfo::getFixedStack(MF, FrameIdxReg1), - MachineMemOperand::MOStore, Size, Alignment)); - if (NeedsWinCFI) - InsertSEH(MIB, TII, MachineInstr::FrameSetup); - // Update the StackIDs of the SVE stack slots. MachineFrameInfo &MFI = MF.getFrameInfo(); - if (RPI.Type == RegPairInfo::ZPR || RPI.Type == RegPairInfo::PPR) - MFI.setStackID(RPI.FrameIdx, TargetStackID::ScalableVector); - + if (RPI.Type == RegPairInfo::ZPR || RPI.Type == RegPairInfo::PPR) { + MFI.setStackID(FrameIdxReg1, TargetStackID::ScalableVector); + if (RPI.isPaired()) + MFI.setStackID(FrameIdxReg2, TargetStackID::ScalableVector); + } } return true; } @@ -3109,7 +3169,6 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters( DL = MBBI->getDebugLoc(); computeCalleeSaveRegisterPairs(MF, CSI, TRI, RegPairs, hasFP(MF)); - if (homogeneousPrologEpilog(MF, &MBB)) { auto MIB = BuildMI(MBB, MBBI, DL, TII.get(AArch64::HOM_Epilog)) .setMIFlag(MachineInstr::FrameDestroy); @@ -3130,6 +3189,7 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters( auto ZPREnd = std::find_if_not(ZPRBegin, RegPairs.end(), IsZPR); std::reverse(ZPRBegin, ZPREnd); + bool PTrueCreated = false; for (const RegPairInfo &RPI : RegPairs) { unsigned Reg1 = RPI.Reg1; unsigned Reg2 = RPI.Reg2; @@ -3162,7 +3222,7 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters( Alignment = Align(16); break; case RegPairInfo::ZPR: - LdrOpc = AArch64::LDR_ZXI; + LdrOpc = RPI.isPaired() ? AArch64::LD1B_2Z_IMM : AArch64::LDR_ZXI; Size = 16; Alignment = Align(16); break; @@ -3187,25 +3247,58 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters( std::swap(Reg1, Reg2); std::swap(FrameIdxReg1, FrameIdxReg2); } - MachineInstrBuilder MIB = BuildMI(MBB, MBBI, DL, TII.get(LdrOpc)); - if (RPI.isPaired()) { - MIB.addReg(Reg2, getDefRegState(true)); + + AArch64FunctionInfo *AFI = MF.getInfo(); + if (RPI.isPaired() && RPI.isScalable()) { + const AArch64Subtarget &Subtarget = MF.getSubtarget(); + unsigned PnReg = AFI->getPredicateRegForFillSpill(); + assert(((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) && PnReg != 0) && + "Expects SVE2.1 or SME2 target and a predicate register"); +#ifdef EXPENSIVE_CHECKS + assert(!(PPRBegin < ZPRBegin) && + "Expected callee save predicate to be handled first"); +#endif + if (!PTrueCreated) { + PTrueCreated = true; + BuildMI(MBB, MBBI, DL, TII.get(AArch64::PTRUE_C_B), PnReg) + .setMIFlags(MachineInstr::FrameDestroy); + } + MachineInstrBuilder MIB = BuildMI(MBB, MBBI, DL, TII.get(LdrOpc)); + MIB.addReg(/*PairRegs*/ AArch64::Z0_Z1 + (RPI.Reg1 - AArch64::Z0), + getDefRegState(true)); MIB.addMemOperand(MF.getMachineMemOperand( MachinePointerInfo::getFixedStack(MF, FrameIdxReg2), MachineMemOperand::MOLoad, Size, Alignment)); + MIB.addReg(PnReg); + MIB.addReg(AArch64::SP) + .addImm(RPI.Offset) // [sp, #offset*scale] + // where factor*scale is implicit + .setMIFlag(MachineInstr::FrameDestroy); + MIB.addMemOperand(MF.getMachineMemOperand( + MachinePointerInfo::getFixedStack(MF, FrameIdxReg1), + MachineMemOperand::MOLoad, Size, Alignment)); + if (NeedsWinCFI) + InsertSEH(MIB, TII, MachineInstr::FrameDestroy); + } else { + MachineInstrBuilder MIB = BuildMI(MBB, MBBI, DL, TII.get(LdrOpc)); + if (RPI.isPaired()) { + MIB.addReg(Reg2, getDefRegState(true)); + MIB.addMemOperand(MF.getMachineMemOperand( + MachinePointerInfo::getFixedStack(MF, FrameIdxReg2), + MachineMemOperand::MOLoad, Size, Alignment)); + } + MIB.addReg(Reg1, getDefRegState(true)); + MIB.addReg(AArch64::SP) + .addImm(RPI.Offset) // [sp, #offset*scale] + // where factor*scale is implicit + .setMIFlag(MachineInstr::FrameDestroy); + MIB.addMemOperand(MF.getMachineMemOperand( + MachinePointerInfo::getFixedStack(MF, FrameIdxReg1), + MachineMemOperand::MOLoad, Size, Alignment)); + if (NeedsWinCFI) + InsertSEH(MIB, TII, MachineInstr::FrameDestroy); } - MIB.addReg(Reg1, getDefRegState(true)) - .addReg(AArch64::SP) - .addImm(RPI.Offset) // [sp, #offset*scale] - // where factor*scale is implicit - .setMIFlag(MachineInstr::FrameDestroy); - MIB.addMemOperand(MF.getMachineMemOperand( - MachinePointerInfo::getFixedStack(MF, FrameIdxReg1), - MachineMemOperand::MOLoad, Size, Alignment)); - if (NeedsWinCFI) - InsertSEH(MIB, TII, MachineInstr::FrameDestroy); } - return true; } @@ -3234,6 +3327,7 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF, unsigned ExtraCSSpill = 0; bool HasUnpairedGPR64 = false; + bool HasPairZReg = false; // Figure out which callee-saved registers to save/restore. for (unsigned i = 0; CSRegs[i]; ++i) { const unsigned Reg = CSRegs[i]; @@ -3287,6 +3381,28 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF, !RegInfo->isReservedReg(MF, PairedReg)) ExtraCSSpill = PairedReg; } + // Check if there is a pair of ZRegs, so it can select PReg for spill/fill + HasPairZReg |= (AArch64::ZPRRegClass.contains(Reg, CSRegs[i ^ 1]) && + SavedRegs.test(CSRegs[i ^ 1])); + } + + if (HasPairZReg && (Subtarget.hasSVE2p1() || Subtarget.hasSME2())) { + AArch64FunctionInfo *AFI = MF.getInfo(); + // Find a suitable predicate register for the multi-vector spill/fill + // instructions. + unsigned PnReg = findFreePredicateReg(SavedRegs); + if (PnReg != AArch64::NoRegister) + AFI->setPredicateRegForFillSpill(PnReg); + // If no free callee-save has been found assign one. + if (!AFI->getPredicateRegForFillSpill() && + MF.getFunction().getCallingConv() == + CallingConv::AArch64_SVE_VectorCall) { + SavedRegs.set(AArch64::P8); + AFI->setPredicateRegForFillSpill(AArch64::PN8); + } + + assert(!RegInfo->isReservedReg(MF, AFI->getPredicateRegForFillSpill()) && + "Predicate cannot be a reserved register"); } if (MF.getFunction().getCallingConv() == CallingConv::Win64 && diff --git a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h index d5941e628411..df09fc5592ed 100644 --- a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h +++ b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h @@ -212,6 +212,10 @@ class AArch64FunctionInfo final : public MachineFunctionInfo { // on function entry to record the initial pstate of a function. Register PStateSMReg = MCRegister::NoRegister; + // Has the PNReg used to build PTRUE instruction. + // The PTRUE is used for the LD/ST of ZReg pairs in save and restore. + unsigned PredicateRegForFillSpill = 0; + public: AArch64FunctionInfo(const Function &F, const AArch64Subtarget *STI); @@ -220,6 +224,13 @@ public: const DenseMap &Src2DstMBB) const override; + void setPredicateRegForFillSpill(unsigned Reg) { + PredicateRegForFillSpill = Reg; + } + unsigned getPredicateRegForFillSpill() const { + return PredicateRegForFillSpill; + } + Register getPStateSMReg() const { return PStateSMReg; }; void setPStateSMReg(Register Reg) { PStateSMReg = Reg; }; diff --git a/llvm/test/CodeGen/AArch64/sme2-intrinsics-ld1.ll b/llvm/test/CodeGen/AArch64/sme2-intrinsics-ld1.ll index ea7808d73093..3a94b0333e26 100644 --- a/llvm/test/CodeGen/AArch64/sme2-intrinsics-ld1.ll +++ b/llvm/test/CodeGen/AArch64/sme2-intrinsics-ld1.ll @@ -55,45 +55,31 @@ define @ld1_x2_i8_z0_z8( %unused, @ld1_x2_i8_z0_z8( %unused, @ld1_x2_i8_z0_z8( %unused, @ld1_x2_i8_z0_z8_scalar( %unused, @ld1_x2_i8_z0_z8_scalar( %unused, @ld1_x2_i8_z0_z8_scalar( %unused, @ld1_x2_i16_z0_z8( %unused, @ld1_x2_i16_z0_z8( %unused, @ld1_x2_i16_z0_z8( %unused, @ld1_x2_i16_z0_z8_scalar( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1h { z0.h, z8.h }, pn8/z, [x0, x1, lsl #1] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z8.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; STRIDED-NEXT: ret @@ -569,20 +477,14 @@ define @ld1_x2_i16_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-16 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-2 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -595,21 +497,15 @@ define @ld1_x2_i16_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: ldr z0, [sp] ; CONTIGUOUS-NEXT: ldr z1, [sp, #1, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #2 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #16 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -677,45 +573,31 @@ define @ld1_x2_i32_z0_z8( %unused, @ld1_x2_i32_z0_z8( %unused, @ld1_x2_i32_z0_z8( %unused, @ld1_x2_i32_z0_z8_scalar( %unused, < ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1w { z0.s, z8.s }, pn8/z, [x0, x1, lsl #2] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z8.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; STRIDED-NEXT: ret @@ -880,20 +736,14 @@ define @ld1_x2_i32_z0_z8_scalar( %unused, < ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-16 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-2 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -906,21 +756,15 @@ define @ld1_x2_i32_z0_z8_scalar( %unused, < ; CONTIGUOUS-NEXT: ldr z0, [sp] ; CONTIGUOUS-NEXT: ldr z1, [sp, #1, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #2 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #16 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -988,45 +832,31 @@ define @ld1_x2_i64_z0_z8( %unused, @ld1_x2_i64_z0_z8( %unused, @ld1_x2_i64_z0_z8( %unused, @ld1_x2_i64_z0_z8_scalar( %unused, < ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1d { z0.d, z8.d }, pn8/z, [x0, x1, lsl #3] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z8.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; STRIDED-NEXT: ret @@ -1191,20 +995,14 @@ define @ld1_x2_i64_z0_z8_scalar( %unused, < ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-16 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-2 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1217,21 +1015,15 @@ define @ld1_x2_i64_z0_z8_scalar( %unused, < ; CONTIGUOUS-NEXT: ldr z0, [sp] ; CONTIGUOUS-NEXT: ldr z1, [sp, #1, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #2 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #16 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1301,46 +1093,32 @@ define @ld1_x4_i8_z0_z4_z8_z12( %unused, @ld1_x4_i8_z0_z4_z8_z12( %unused, @ld1_x4_i8_z0_z4_z8_z12( %unused, @ld1_x4_i8_z0_z4_z8_z12_scalar( %unu ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1b { z0.b, z4.b, z8.b, z12.b }, pn8/z, [x0, x1] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1516,19 +1270,14 @@ define @ld1_x4_i8_z0_z4_z8_z12_scalar( %unu ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1545,20 +1294,15 @@ define @ld1_x4_i8_z0_z4_z8_z12_scalar( %unu ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1632,46 +1376,32 @@ define @ld1_x4_i16_z0_z4_z8_z12( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1h { z0.h, z4.h, z8.h, z12.h }, pn8/z, [x0] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1682,19 +1412,14 @@ define @ld1_x4_i16_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1711,20 +1436,15 @@ define @ld1_x4_i16_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1798,46 +1518,32 @@ define @ld1_x4_i16_z0_z4_z8_z12_scalar( %u ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1h { z0.h, z4.h, z8.h, z12.h }, pn8/z, [x0, x1, lsl #1] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1848,19 +1554,14 @@ define @ld1_x4_i16_z0_z4_z8_z12_scalar( %u ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1877,20 +1578,15 @@ define @ld1_x4_i16_z0_z4_z8_z12_scalar( %u ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1964,46 +1660,32 @@ define @ld1_x4_i32_z0_z4_z8_z12( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1w { z0.s, z4.s, z8.s, z12.s }, pn8/z, [x0] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -2014,19 +1696,14 @@ define @ld1_x4_i32_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -2043,20 +1720,15 @@ define @ld1_x4_i32_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -2130,46 +1802,32 @@ define @ld1_x4_i32_z0_z4_z8_z12_scalar( %u ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1w { z0.s, z4.s, z8.s, z12.s }, pn8/z, [x0, x1, lsl #2] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -2180,19 +1838,14 @@ define @ld1_x4_i32_z0_z4_z8_z12_scalar( %u ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -2209,20 +1862,15 @@ define @ld1_x4_i32_z0_z4_z8_z12_scalar( %u ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -2296,46 +1944,32 @@ define @ld1_x4_i64_z0_z4_z8_z12( %unused, < ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1d { z0.d, z4.d, z8.d, z12.d }, pn8/z, [x0] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -2346,19 +1980,14 @@ define @ld1_x4_i64_z0_z4_z8_z12( %unused, < ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -2375,20 +2004,15 @@ define @ld1_x4_i64_z0_z4_z8_z12( %unused, < ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -2462,46 +2086,32 @@ define @ld1_x4_i64_z0_z4_z8_z12_scalar( %un ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ld1d { z0.d, z4.d, z8.d, z12.d }, pn8/z, [x0, x1, lsl #3] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -2512,19 +2122,14 @@ define @ld1_x4_i64_z0_z4_z8_z12_scalar( %un ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -2541,20 +2146,15 @@ define @ld1_x4_i64_z0_z4_z8_z12_scalar( %un ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload diff --git a/llvm/test/CodeGen/AArch64/sme2-intrinsics-ldnt1.ll b/llvm/test/CodeGen/AArch64/sme2-intrinsics-ldnt1.ll index 7e2d28fbf798..8ecb7c858c6a 100644 --- a/llvm/test/CodeGen/AArch64/sme2-intrinsics-ldnt1.ll +++ b/llvm/test/CodeGen/AArch64/sme2-intrinsics-ldnt1.ll @@ -8,45 +8,31 @@ define @ldnt1_x2_i8_z0_z8( %unused, @ldnt1_x2_i8_z0_z8( %unused, @ldnt1_x2_i8_z0_z8( %unused, @ldnt1_x2_i8_z0_z8_scalar( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1b { z0.b, z8.b }, pn8/z, [x0, x1] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z8.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; STRIDED-NEXT: ret @@ -164,20 +124,14 @@ define @ldnt1_x2_i8_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-16 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-2 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -190,21 +144,15 @@ define @ldnt1_x2_i8_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: ldr z0, [sp] ; CONTIGUOUS-NEXT: ldr z1, [sp, #1, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #2 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #16 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -225,45 +173,31 @@ define @ldnt1_x2_i16_z0_z8( %unused, @ldnt1_x2_i16_z0_z8( %unused, @ldnt1_x2_i16_z0_z8( %unused, @ldnt1_x2_i16_z0_z8_scalar( %unused ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1h { z0.h, z8.h }, pn8/z, [x0, x1, lsl #1] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z8.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; STRIDED-NEXT: ret @@ -381,20 +289,14 @@ define @ldnt1_x2_i16_z0_z8_scalar( %unused ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-16 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-2 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -407,21 +309,15 @@ define @ldnt1_x2_i16_z0_z8_scalar( %unused ; CONTIGUOUS-NEXT: ldr z0, [sp] ; CONTIGUOUS-NEXT: ldr z1, [sp, #1, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #2 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #16 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -442,45 +338,31 @@ define @ldnt1_x2_i32_z0_z8( %unused, @ldnt1_x2_i32_z0_z8( %unused, @ldnt1_x2_i32_z0_z8( %unused, @ldnt1_x2_i32_z0_z8_scalar( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1w { z0.s, z8.s }, pn8/z, [x0, x1, lsl #2] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z8.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; STRIDED-NEXT: ret @@ -598,20 +454,14 @@ define @ldnt1_x2_i32_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-16 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-2 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -624,21 +474,15 @@ define @ldnt1_x2_i32_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: ldr z0, [sp] ; CONTIGUOUS-NEXT: ldr z1, [sp, #1, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #2 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #16 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -659,45 +503,31 @@ define @ldnt1_x2_i64_z0_z8( %unused, @ldnt1_x2_i64_z0_z8( %unused, @ldnt1_x2_i64_z0_z8( %unused, @ldnt1_x2_i64_z0_z8_scalar( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1d { z0.d, z8.d }, pn8/z, [x0, x1, lsl #3] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z8.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload ; STRIDED-NEXT: ret @@ -815,20 +619,14 @@ define @ldnt1_x2_i64_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-16 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-2 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -841,21 +639,15 @@ define @ldnt1_x2_i64_z0_z8_scalar( %unused, ; CONTIGUOUS-NEXT: ldr z0, [sp] ; CONTIGUOUS-NEXT: ldr z1, [sp, #1, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #2 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #16 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -876,46 +668,32 @@ define @ldnt1_x4_i8_z0_z4_z8_z12( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1b { z0.b, z4.b, z8.b, z12.b }, pn8/z, [x0] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -926,19 +704,14 @@ define @ldnt1_x4_i8_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -955,20 +728,15 @@ define @ldnt1_x4_i8_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -992,46 +760,32 @@ define @ldnt1_x4_i8_z0_z4_z8_z12_scalar( %u ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1b { z0.b, z4.b, z8.b, z12.b }, pn8/z, [x0, x1] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1042,19 +796,14 @@ define @ldnt1_x4_i8_z0_z4_z8_z12_scalar( %u ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1071,20 +820,15 @@ define @ldnt1_x4_i8_z0_z4_z8_z12_scalar( %u ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1109,46 +853,32 @@ define @ldnt1_x4_i16_z0_z4_z8_z12( %unused ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1h { z0.h, z4.h, z8.h, z12.h }, pn8/z, [x0] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1159,19 +889,14 @@ define @ldnt1_x4_i16_z0_z4_z8_z12( %unused ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1188,20 +913,15 @@ define @ldnt1_x4_i16_z0_z4_z8_z12( %unused ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1225,46 +945,32 @@ define @ldnt1_x4_i16_z0_z4_z8_z12_scalar( ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1h { z0.h, z4.h, z8.h, z12.h }, pn8/z, [x0, x1, lsl #1] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1275,19 +981,14 @@ define @ldnt1_x4_i16_z0_z4_z8_z12_scalar( ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1304,20 +1005,15 @@ define @ldnt1_x4_i16_z0_z4_z8_z12_scalar( ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1342,46 +1038,32 @@ define @ldnt1_x4_i32_z0_z4_z8_z12( %unused ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1w { z0.s, z4.s, z8.s, z12.s }, pn8/z, [x0] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1392,19 +1074,14 @@ define @ldnt1_x4_i32_z0_z4_z8_z12( %unused ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1421,20 +1098,15 @@ define @ldnt1_x4_i32_z0_z4_z8_z12( %unused ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1458,46 +1130,32 @@ define @ldnt1_x4_i32_z0_z4_z8_z12_scalar( ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1w { z0.s, z4.s, z8.s, z12.s }, pn8/z, [x0, x1, lsl #2] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1508,19 +1166,14 @@ define @ldnt1_x4_i32_z0_z4_z8_z12_scalar( ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1537,20 +1190,15 @@ define @ldnt1_x4_i32_z0_z4_z8_z12_scalar( ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1575,46 +1223,32 @@ define @ldnt1_x4_i64_z0_z4_z8_z12( %unused, ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1d { z0.d, z4.d, z8.d, z12.d }, pn8/z, [x0] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1625,19 +1259,14 @@ define @ldnt1_x4_i64_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1654,20 +1283,15 @@ define @ldnt1_x4_i64_z0_z4_z8_z12( %unused, ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1691,46 +1315,32 @@ define @ldnt1_x4_i64_z0_z4_z8_z12_scalar( % ; STRIDED-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; STRIDED-NEXT: addvl sp, sp, #-17 ; STRIDED-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #22, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #26, mul vl] // 32-byte Folded Spill +; STRIDED-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #30, mul vl] // 32-byte Folded Spill ; STRIDED-NEXT: mov p8.b, p0.b -; STRIDED-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z12, [sp, #12, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z11, [sp, #13, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z10, [sp, #14, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z9, [sp, #15, mul vl] // 16-byte Folded Spill -; STRIDED-NEXT: str z8, [sp, #16, mul vl] // 16-byte Folded Spill ; STRIDED-NEXT: ldnt1d { z0.d, z4.d, z8.d, z12.d }, pn8/z, [x0, x1, lsl #3] ; STRIDED-NEXT: //APP ; STRIDED-NEXT: nop ; STRIDED-NEXT: //NO_APP -; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload -; STRIDED-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ptrue pn8.b +; STRIDED-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #26, mul vl] // 32-byte Folded Reload ; STRIDED-NEXT: mov z2.d, z8.d ; STRIDED-NEXT: mov z3.d, z12.d -; STRIDED-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z12, [sp, #12, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z11, [sp, #13, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z10, [sp, #14, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z9, [sp, #15, mul vl] // 16-byte Folded Reload -; STRIDED-NEXT: ldr z8, [sp, #16, mul vl] // 16-byte Folded Reload +; STRIDED-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #22, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #30, mul vl] // 32-byte Folded Reload +; STRIDED-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; STRIDED-NEXT: mov z1.d, z4.d ; STRIDED-NEXT: addvl sp, sp, #17 ; STRIDED-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload @@ -1741,19 +1351,14 @@ define @ldnt1_x4_i64_z0_z4_z8_z12_scalar( % ; CONTIGUOUS-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-15 ; CONTIGUOUS-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill -; CONTIGUOUS-NEXT: str z23, [sp, #1, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z22, [sp, #2, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z21, [sp, #3, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z20, [sp, #4, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z19, [sp, #5, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z18, [sp, #6, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z17, [sp, #7, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z16, [sp, #8, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z15, [sp, #9, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z14, [sp, #10, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: ptrue pn8.b +; CONTIGUOUS-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #6, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #10, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #14, mul vl] // 32-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #18, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z13, [sp, #11, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill -; CONTIGUOUS-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill +; CONTIGUOUS-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill ; CONTIGUOUS-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill ; CONTIGUOUS-NEXT: addvl sp, sp, #-4 ; CONTIGUOUS-NEXT: mov p8.b, p0.b @@ -1770,20 +1375,15 @@ define @ldnt1_x4_i64_z0_z4_z8_z12_scalar( % ; CONTIGUOUS-NEXT: ldr z2, [sp, #2, mul vl] ; CONTIGUOUS-NEXT: ldr z3, [sp, #3, mul vl] ; CONTIGUOUS-NEXT: addvl sp, sp, #4 -; CONTIGUOUS-NEXT: ldr z23, [sp, #1, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z22, [sp, #2, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z21, [sp, #3, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z20, [sp, #4, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z19, [sp, #5, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z18, [sp, #6, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z17, [sp, #7, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z16, [sp, #8, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z15, [sp, #9, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z14, [sp, #10, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ptrue pn8.b ; CONTIGUOUS-NEXT: ldr z13, [sp, #11, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload -; CONTIGUOUS-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload ; CONTIGUOUS-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #6, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #10, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #14, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #18, mul vl] // 32-byte Folded Reload +; CONTIGUOUS-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload ; CONTIGUOUS-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload ; CONTIGUOUS-NEXT: addvl sp, sp, #15 ; CONTIGUOUS-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload diff --git a/llvm/test/CodeGen/AArch64/sve-callee-save-restore-pairs.ll b/llvm/test/CodeGen/AArch64/sve-callee-save-restore-pairs.ll new file mode 100644 index 000000000000..c62016d8ea01 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/sve-callee-save-restore-pairs.ll @@ -0,0 +1,556 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -verify-machineinstrs < %s | FileCheck %s --check-prefixes=NOPAIR +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=NOPAIR +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=PAIR +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2p1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=PAIR + + +declare void @my_func() + +define void @fbyte( %v) { +; NOPAIR-LABEL: fbyte: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; NOPAIR-NEXT: addvl sp, sp, #-18 +; NOPAIR-NEXT: str p15, [sp, #4, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p14, [sp, #5, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p13, [sp, #6, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p12, [sp, #7, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p11, [sp, #8, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p10, [sp, #9, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p9, [sp, #10, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p8, [sp, #11, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p7, [sp, #12, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p6, [sp, #13, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p5, [sp, #14, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p4, [sp, #15, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 144 * VG +; NOPAIR-NEXT: .cfi_offset w30, -8 +; NOPAIR-NEXT: .cfi_offset w29, -16 +; NOPAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11 @ cfa - 16 - 32 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12 @ cfa - 16 - 40 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13 @ cfa - 16 - 48 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14 @ cfa - 16 - 56 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15 @ cfa - 16 - 64 * VG +; NOPAIR-NEXT: bl my_func +; NOPAIR-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: addvl sp, sp, #18 +; NOPAIR-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: fbyte: +; PAIR: // %bb.0: +; PAIR-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; PAIR-NEXT: addvl sp, sp, #-18 +; PAIR-NEXT: str p8, [sp, #11, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: str p15, [sp, #4, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #4, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #8, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p14, [sp, #5, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #12, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #16, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p13, [sp, #6, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #20, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p12, [sp, #7, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #28, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p11, [sp, #8, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p10, [sp, #9, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p9, [sp, #10, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p7, [sp, #12, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p6, [sp, #13, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p5, [sp, #14, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p4, [sp, #15, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #32, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 144 * VG +; PAIR-NEXT: .cfi_offset w30, -8 +; PAIR-NEXT: .cfi_offset w29, -16 +; PAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11 @ cfa - 16 - 32 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12 @ cfa - 16 - 40 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13 @ cfa - 16 - 48 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14 @ cfa - 16 - 56 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15 @ cfa - 16 - 64 * VG +; PAIR-NEXT: bl my_func +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #4, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #8, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #12, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #16, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #20, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #28, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #32, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: addvl sp, sp, #18 +; PAIR-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; PAIR-NEXT: ret + call void @my_func() + ret void +} + +define void @fhalf( %v) { +; NOPAIR-LABEL: fhalf: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; NOPAIR-NEXT: addvl sp, sp, #-18 +; NOPAIR-NEXT: str p15, [sp, #4, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p14, [sp, #5, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p13, [sp, #6, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p12, [sp, #7, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p11, [sp, #8, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p10, [sp, #9, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p9, [sp, #10, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p8, [sp, #11, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p7, [sp, #12, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p6, [sp, #13, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p5, [sp, #14, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p4, [sp, #15, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 144 * VG +; NOPAIR-NEXT: .cfi_offset w30, -8 +; NOPAIR-NEXT: .cfi_offset w29, -16 +; NOPAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11 @ cfa - 16 - 32 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12 @ cfa - 16 - 40 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13 @ cfa - 16 - 48 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14 @ cfa - 16 - 56 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15 @ cfa - 16 - 64 * VG +; NOPAIR-NEXT: bl my_func +; NOPAIR-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: addvl sp, sp, #18 +; NOPAIR-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: fhalf: +; PAIR: // %bb.0: +; PAIR-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; PAIR-NEXT: addvl sp, sp, #-18 +; PAIR-NEXT: str p8, [sp, #11, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: str p15, [sp, #4, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z22.b, z23.b }, pn8, [sp, #4, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: st1b { z20.b, z21.b }, pn8, [sp, #8, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p14, [sp, #5, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z18.b, z19.b }, pn8, [sp, #12, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: st1b { z16.b, z17.b }, pn8, [sp, #16, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p13, [sp, #6, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z14.b, z15.b }, pn8, [sp, #20, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: st1b { z12.b, z13.b }, pn8, [sp, #24, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p12, [sp, #7, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z10.b, z11.b }, pn8, [sp, #28, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: str p11, [sp, #8, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p10, [sp, #9, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p9, [sp, #10, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p7, [sp, #12, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p6, [sp, #13, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p5, [sp, #14, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p4, [sp, #15, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #32, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 144 * VG +; PAIR-NEXT: .cfi_offset w30, -8 +; PAIR-NEXT: .cfi_offset w29, -16 +; PAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11 @ cfa - 16 - 32 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12 @ cfa - 16 - 40 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13 @ cfa - 16 - 48 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14 @ cfa - 16 - 56 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15 @ cfa - 16 - 64 * VG +; PAIR-NEXT: bl my_func +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ld1b { z22.b, z23.b }, pn8/z, [sp, #4, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z20.b, z21.b }, pn8/z, [sp, #8, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z18.b, z19.b }, pn8/z, [sp, #12, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z16.b, z17.b }, pn8/z, [sp, #16, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z14.b, z15.b }, pn8/z, [sp, #20, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z12.b, z13.b }, pn8/z, [sp, #24, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z10.b, z11.b }, pn8/z, [sp, #28, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #32, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: addvl sp, sp, #18 +; PAIR-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; PAIR-NEXT: ret + call void @my_func() + ret void +} + +;; Do NOT group Z10 +;; DO group Z8 and Z9 and save P8 +define aarch64_sve_vector_pcs void @test_clobbers_z_p_regs() { +; NOPAIR-LABEL: test_clobbers_z_p_regs: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; NOPAIR-NEXT: addvl sp, sp, #-4 +; NOPAIR-NEXT: str p5, [sp, #6, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p4, [sp, #7, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str z10, [sp, #1, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z9, [sp, #2, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z8, [sp, #3, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 32 * VG +; NOPAIR-NEXT: .cfi_offset w29, -16 +; NOPAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; NOPAIR-NEXT: //APP +; NOPAIR-NEXT: //NO_APP +; NOPAIR-NEXT: ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z9, [sp, #2, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z8, [sp, #3, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: addvl sp, sp, #4 +; NOPAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: test_clobbers_z_p_regs: +; PAIR: // %bb.0: +; PAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; PAIR-NEXT: addvl sp, sp, #-4 +; PAIR-NEXT: str p8, [sp, #5, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: str p5, [sp, #6, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str p4, [sp, #7, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str z10, [sp, #1, mul vl] // 16-byte Folded Spill +; PAIR-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #4, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 32 * VG +; PAIR-NEXT: .cfi_offset w29, -16 +; PAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; PAIR-NEXT: //APP +; PAIR-NEXT: //NO_APP +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload +; PAIR-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #4, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ldr p8, [sp, #5, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: addvl sp, sp, #4 +; PAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; PAIR-NEXT: ret + call void asm sideeffect "", "~{p4},~{p5},~{z8},~{z9},~{z10}"() + ret void +} + +;; Do NOT group Z10 +;; DO group Z8 and Z9 and use P9 +define aarch64_sve_vector_pcs void @test_clobbers_z_p_regs2() { +; NOPAIR-LABEL: test_clobbers_z_p_regs2: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; NOPAIR-NEXT: addvl sp, sp, #-4 +; NOPAIR-NEXT: str p10, [sp, #6, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str p9, [sp, #7, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: str z10, [sp, #1, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z9, [sp, #2, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: str z8, [sp, #3, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 32 * VG +; NOPAIR-NEXT: .cfi_offset w29, -16 +; NOPAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; NOPAIR-NEXT: //APP +; NOPAIR-NEXT: //NO_APP +; NOPAIR-NEXT: ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z9, [sp, #2, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z8, [sp, #3, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr p10, [sp, #6, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: ldr p9, [sp, #7, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: addvl sp, sp, #4 +; NOPAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: test_clobbers_z_p_regs2: +; PAIR: // %bb.0: +; PAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; PAIR-NEXT: addvl sp, sp, #-4 +; PAIR-NEXT: str p9, [sp, #7, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: ptrue pn9.b +; PAIR-NEXT: str p10, [sp, #6, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: str z10, [sp, #1, mul vl] // 16-byte Folded Spill +; PAIR-NEXT: st1b { z8.b, z9.b }, pn9, [sp, #4, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 32 * VG +; PAIR-NEXT: .cfi_offset w29, -16 +; PAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG +; PAIR-NEXT: //APP +; PAIR-NEXT: //NO_APP +; PAIR-NEXT: ptrue pn9.b +; PAIR-NEXT: ldr z10, [sp, #1, mul vl] // 16-byte Folded Reload +; PAIR-NEXT: ldr p10, [sp, #6, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: ld1b { z8.b, z9.b }, pn9/z, [sp, #4, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ldr p9, [sp, #7, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: addvl sp, sp, #4 +; PAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; PAIR-NEXT: ret + call void asm sideeffect "", "~{p9},~{p10},~{z8},~{z9},~{z10}"() + ret void +} + + +;; Test order of PRegs and ZRegs when there is no PReg being clobbered +define aarch64_sve_vector_pcs void @test_clobbers_z_regs() { +; NOPAIR-LABEL: test_clobbers_z_regs: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; NOPAIR-NEXT: addvl sp, sp, #-2 +; NOPAIR-NEXT: str z9, [sp] // 16-byte Folded Spill +; NOPAIR-NEXT: str z8, [sp, #1, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 16 * VG +; NOPAIR-NEXT: .cfi_offset w29, -16 +; NOPAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; NOPAIR-NEXT: //APP +; NOPAIR-NEXT: //NO_APP +; NOPAIR-NEXT: ldr z9, [sp] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z8, [sp, #1, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: addvl sp, sp, #2 +; NOPAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: test_clobbers_z_regs: +; PAIR: // %bb.0: +; PAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; PAIR-NEXT: addvl sp, sp, #-3 +; PAIR-NEXT: str p8, [sp, #7, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: st1b { z8.b, z9.b }, pn8, [sp, #2, mul vl] // 32-byte Folded Spill +; PAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG +; PAIR-NEXT: .cfi_offset w29, -16 +; PAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG +; PAIR-NEXT: //APP +; PAIR-NEXT: //NO_APP +; PAIR-NEXT: ptrue pn8.b +; PAIR-NEXT: ld1b { z8.b, z9.b }, pn8/z, [sp, #2, mul vl] // 32-byte Folded Reload +; PAIR-NEXT: ldr p8, [sp, #7, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: addvl sp, sp, #3 +; PAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; PAIR-NEXT: ret + call void asm sideeffect "", "~{z8},~{z9}"() + ret void +} + +;; DO NOT group Z8 and Z9 and +;; DO NOT save P8 +;; It does not belong to the allowed calling conventions +;; NOPAIR and PAIR should have the same assembly +define void @test_clobbers_z_regs_negative() { +; NOPAIR-LABEL: test_clobbers_z_regs_negative: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: stp d9, d8, [sp, #-16]! // 16-byte Folded Spill +; NOPAIR-NEXT: .cfi_def_cfa_offset 16 +; NOPAIR-NEXT: .cfi_offset b8, -8 +; NOPAIR-NEXT: .cfi_offset b9, -16 +; NOPAIR-NEXT: //APP +; NOPAIR-NEXT: //NO_APP +; NOPAIR-NEXT: ldp d9, d8, [sp], #16 // 16-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: test_clobbers_z_regs_negative: +; PAIR: // %bb.0: +; PAIR-NEXT: stp d9, d8, [sp, #-16]! // 16-byte Folded Spill +; PAIR-NEXT: .cfi_def_cfa_offset 16 +; PAIR-NEXT: .cfi_offset b8, -8 +; PAIR-NEXT: .cfi_offset b9, -16 +; PAIR-NEXT: //APP +; PAIR-NEXT: //NO_APP +; PAIR-NEXT: ldp d9, d8, [sp], #16 // 16-byte Folded Reload +; PAIR-NEXT: ret + call void asm sideeffect "", "~{z8},~{z9}"() + ret void +} + +;; Do NOT save P8 and NOT group any Z8 and Z10 register +define aarch64_sve_vector_pcs void @test_clobbers_2_z_regs_negative() { +; NOPAIR-LABEL: test_clobbers_2_z_regs_negative: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; NOPAIR-NEXT: addvl sp, sp, #-2 +; NOPAIR-NEXT: str z10, [sp] // 16-byte Folded Spill +; NOPAIR-NEXT: str z8, [sp, #1, mul vl] // 16-byte Folded Spill +; NOPAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 16 * VG +; NOPAIR-NEXT: .cfi_offset w29, -16 +; NOPAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; NOPAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 16 * VG +; NOPAIR-NEXT: //APP +; NOPAIR-NEXT: //NO_APP +; NOPAIR-NEXT: ldr z10, [sp] // 16-byte Folded Reload +; NOPAIR-NEXT: ldr z8, [sp, #1, mul vl] // 16-byte Folded Reload +; NOPAIR-NEXT: addvl sp, sp, #2 +; NOPAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: test_clobbers_2_z_regs_negative: +; PAIR: // %bb.0: +; PAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; PAIR-NEXT: addvl sp, sp, #-2 +; PAIR-NEXT: str z10, [sp] // 16-byte Folded Spill +; PAIR-NEXT: str z8, [sp, #1, mul vl] // 16-byte Folded Spill +; PAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 16 * VG +; PAIR-NEXT: .cfi_offset w29, -16 +; PAIR-NEXT: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG +; PAIR-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 16 * VG +; PAIR-NEXT: //APP +; PAIR-NEXT: //NO_APP +; PAIR-NEXT: ldr z10, [sp] // 16-byte Folded Reload +; PAIR-NEXT: ldr z8, [sp, #1, mul vl] // 16-byte Folded Reload +; PAIR-NEXT: addvl sp, sp, #2 +; PAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; PAIR-NEXT: ret + call void asm sideeffect "", "~{z8},~{z10}"() + ret void +} + + +;; NOTHING TO DO HERE +;; There is no ZReg pairs to save +define aarch64_sve_vector_pcs void @test_clobbers_p_reg_negative() { +; NOPAIR-LABEL: test_clobbers_p_reg_negative: +; NOPAIR: // %bb.0: +; NOPAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; NOPAIR-NEXT: addvl sp, sp, #-1 +; NOPAIR-NEXT: str p10, [sp, #7, mul vl] // 2-byte Folded Spill +; NOPAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG +; NOPAIR-NEXT: .cfi_offset w29, -16 +; NOPAIR-NEXT: //APP +; NOPAIR-NEXT: //NO_APP +; NOPAIR-NEXT: ldr p10, [sp, #7, mul vl] // 2-byte Folded Reload +; NOPAIR-NEXT: addvl sp, sp, #1 +; NOPAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; NOPAIR-NEXT: ret +; +; PAIR-LABEL: test_clobbers_p_reg_negative: +; PAIR: // %bb.0: +; PAIR-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill +; PAIR-NEXT: addvl sp, sp, #-1 +; PAIR-NEXT: str p10, [sp, #7, mul vl] // 2-byte Folded Spill +; PAIR-NEXT: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG +; PAIR-NEXT: .cfi_offset w29, -16 +; PAIR-NEXT: //APP +; PAIR-NEXT: //NO_APP +; PAIR-NEXT: ldr p10, [sp, #7, mul vl] // 2-byte Folded Reload +; PAIR-NEXT: addvl sp, sp, #1 +; PAIR-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload +; PAIR-NEXT: ret + call void asm sideeffect "", "~{p10}"() + ret void +} -- GitLab From 5a20a07fce88d54cf01cafde489bfc2fc447acc0 Mon Sep 17 00:00:00 2001 From: Jie Fu Date: Fri, 17 May 2024 16:37:43 +0800 Subject: [PATCH 0022/1875] [AArch64] Fix -Wunused-variable in AArch64FrameLowering.cpp (NFC) llvm-project/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp:3084:31: error: unused variable 'Subtarget' [-Werror,-Wunused-variable] const AArch64Subtarget &Subtarget = MF.getSubtarget(); ^ llvm-project/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp:3253:31: error: unused variable 'Subtarget' [-Werror,-Wunused-variable] const AArch64Subtarget &Subtarget = MF.getSubtarget(); ^ 2 errors generated. --- llvm/lib/Target/AArch64/AArch64FrameLowering.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp index 239862756fc4..dc7759367687 100644 --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -3081,7 +3081,8 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters( } if (RPI.isPaired() && RPI.isScalable()) { - const AArch64Subtarget &Subtarget = MF.getSubtarget(); + [[maybe_unused]] const AArch64Subtarget &Subtarget = + MF.getSubtarget(); AArch64FunctionInfo *AFI = MF.getInfo(); unsigned PnReg = AFI->getPredicateRegForFillSpill(); assert(((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) && PnReg != 0) && @@ -3250,7 +3251,8 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters( AArch64FunctionInfo *AFI = MF.getInfo(); if (RPI.isPaired() && RPI.isScalable()) { - const AArch64Subtarget &Subtarget = MF.getSubtarget(); + [[maybe_unused]] const AArch64Subtarget &Subtarget = + MF.getSubtarget(); unsigned PnReg = AFI->getPredicateRegForFillSpill(); assert(((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) && PnReg != 0) && "Expects SVE2.1 or SME2 target and a predicate register"); -- GitLab From ee54c86ef70d7809e7d67cd44de2d3153b31c46e Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov Date: Fri, 17 May 2024 13:01:37 +0400 Subject: [PATCH 0023/1875] [clang][NFC] Improve const-correctness in `SourceManager` (#92436) This patch adds several const-qualified variants of existing member functions to `SourceManager`. I started with removing const qualification from `setNumCreatedFIDsForFileID`, and removing `const_cast` in the body of this function, as I think it doesn't make sense to const-qualify setters. --- clang/include/clang/Basic/SourceManager.h | 44 +++++++++++++++++++++-- clang/lib/Basic/SourceManager.cpp | 4 +++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h index 5258bab584f4..ce3342355103 100644 --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -497,6 +497,10 @@ public: bool isFile() const { return !isExpansion(); } const FileInfo &getFile() const { + return const_cast(this)->getFile(); + } + + FileInfo &getFile() { assert(isFile() && "Not a file SLocEntry!"); return File; } @@ -1120,12 +1124,12 @@ public: /// Set the number of FileIDs (files and macros) that were created /// during preprocessing of \p FID, including it. void setNumCreatedFIDsForFileID(FileID FID, unsigned NumFIDs, - bool Force = false) const { + bool Force = false) { auto *Entry = getSLocEntryForFile(FID); if (!Entry) return; assert((Force || Entry->getFile().NumCreatedFIDs == 0) && "Already set!"); - const_cast(Entry->getFile()).NumCreatedFIDs = NumFIDs; + Entry->getFile().NumCreatedFIDs = NumFIDs; } //===--------------------------------------------------------------------===// @@ -1730,6 +1734,11 @@ public: /// Get a local SLocEntry. This is exposed for indexing. const SrcMgr::SLocEntry &getLocalSLocEntry(unsigned Index) const { + return const_cast(this)->getLocalSLocEntry(Index); + } + + /// Get a local SLocEntry. This is exposed for indexing. + SrcMgr::SLocEntry &getLocalSLocEntry(unsigned Index) { assert(Index < LocalSLocEntryTable.size() && "Invalid index"); return LocalSLocEntryTable[Index]; } @@ -1740,6 +1749,13 @@ public: /// Get a loaded SLocEntry. This is exposed for indexing. const SrcMgr::SLocEntry &getLoadedSLocEntry(unsigned Index, bool *Invalid = nullptr) const { + return const_cast(this)->getLoadedSLocEntry(Index, + Invalid); + } + + /// Get a loaded SLocEntry. This is exposed for indexing. + SrcMgr::SLocEntry &getLoadedSLocEntry(unsigned Index, + bool *Invalid = nullptr) { assert(Index < LoadedSLocEntryTable.size() && "Invalid index"); if (SLocEntryLoaded[Index]) return LoadedSLocEntryTable[Index]; @@ -1748,6 +1764,10 @@ public: const SrcMgr::SLocEntry &getSLocEntry(FileID FID, bool *Invalid = nullptr) const { + return const_cast(this)->getSLocEntry(FID, Invalid); + } + + SrcMgr::SLocEntry &getSLocEntry(FileID FID, bool *Invalid = nullptr) { if (FID.ID == 0 || FID.ID == -1) { if (Invalid) *Invalid = true; return LocalSLocEntryTable[0]; @@ -1821,14 +1841,23 @@ private: SrcMgr::ContentCache &getFakeContentCacheForRecovery() const; const SrcMgr::SLocEntry &loadSLocEntry(unsigned Index, bool *Invalid) const; + SrcMgr::SLocEntry &loadSLocEntry(unsigned Index, bool *Invalid); const SrcMgr::SLocEntry *getSLocEntryOrNull(FileID FID) const { + return const_cast(this)->getSLocEntryOrNull(FID); + } + + SrcMgr::SLocEntry *getSLocEntryOrNull(FileID FID) { bool Invalid = false; - const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid); + SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid); return Invalid ? nullptr : &Entry; } const SrcMgr::SLocEntry *getSLocEntryForFile(FileID FID) const { + return const_cast(this)->getSLocEntryForFile(FID); + } + + SrcMgr::SLocEntry *getSLocEntryForFile(FileID FID) { if (auto *Entry = getSLocEntryOrNull(FID)) if (Entry->isFile()) return Entry; @@ -1839,6 +1868,10 @@ private: /// Invalid will not be modified for Local IDs. const SrcMgr::SLocEntry &getSLocEntryByID(int ID, bool *Invalid = nullptr) const { + return const_cast(this)->getSLocEntryByID(ID, Invalid); + } + + SrcMgr::SLocEntry &getSLocEntryByID(int ID, bool *Invalid = nullptr) { assert(ID != -1 && "Using FileID sentinel value"); if (ID < 0) return getLoadedSLocEntryByID(ID, Invalid); @@ -1847,6 +1880,11 @@ private: const SrcMgr::SLocEntry & getLoadedSLocEntryByID(int ID, bool *Invalid = nullptr) const { + return const_cast(this)->getLoadedSLocEntryByID(ID, + Invalid); + } + + SrcMgr::SLocEntry &getLoadedSLocEntryByID(int ID, bool *Invalid = nullptr) { return getLoadedSLocEntry(static_cast(-ID - 2), Invalid); } diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index 37734d3b10e7..afdb5b0e92d6 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -431,6 +431,10 @@ ContentCache &SourceManager::createMemBufferContentCache( const SrcMgr::SLocEntry &SourceManager::loadSLocEntry(unsigned Index, bool *Invalid) const { + return const_cast(this)->loadSLocEntry(Index, Invalid); +} + +SrcMgr::SLocEntry &SourceManager::loadSLocEntry(unsigned Index, bool *Invalid) { assert(!SLocEntryLoaded[Index]); if (ExternalSLocEntries->ReadSLocEntry(-(static_cast(Index) + 2))) { if (Invalid) -- GitLab From 33bf08ec36efc2fc2df8217eddd751cef9bc6be6 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Fri, 17 May 2024 11:24:20 +0200 Subject: [PATCH 0024/1875] [lldb-dap] Correctly detect alias commands with arguments in repl (#92137) ResolveCommand will not succeed for an alias command with arguments, and the code wasn't providing any. Replace that with explicit query(ies) for the existence of a command with the given name. --- .../API/tools/lldb-dap/repl-mode/Makefile | 3 + .../repl-mode/TestDAP_repl_mode_detection.py | 55 +++++++++++++++++++ .../API/tools/lldb-dap/repl-mode/main.cpp | 15 +++++ lldb/tools/lldb-dap/DAP.cpp | 8 ++- 4 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 lldb/test/API/tools/lldb-dap/repl-mode/Makefile create mode 100644 lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py create mode 100644 lldb/test/API/tools/lldb-dap/repl-mode/main.cpp diff --git a/lldb/test/API/tools/lldb-dap/repl-mode/Makefile b/lldb/test/API/tools/lldb-dap/repl-mode/Makefile new file mode 100644 index 000000000000..99998b20bcb0 --- /dev/null +++ b/lldb/test/API/tools/lldb-dap/repl-mode/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules diff --git a/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py b/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py new file mode 100644 index 000000000000..7c77fc8541b9 --- /dev/null +++ b/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py @@ -0,0 +1,55 @@ +""" +Test lldb-dap repl mode detection +""" + +import lldbdap_testcase +import dap_server +from lldbsuite.test import lldbutil +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + + +class TestDAP_repl_mode_detection(lldbdap_testcase.DAPTestCaseBase): + def assertEvaluate(self, expression, regex): + self.assertRegex( + self.dap_server.request_evaluate(expression, context="repl")["body"][ + "result" + ], + regex, + ) + + def test_completions(self): + program = self.getBuildArtifact("a.out") + self.build_and_launch(program) + + source = "main.cpp" + breakpoint1_line = line_number(source, "// breakpoint 1") + breakpoint2_line = line_number(source, "// breakpoint 2") + + self.set_source_breakpoints(source, [breakpoint1_line, breakpoint2_line]) + + self.assertEvaluate( + "`command regex user_command s/^$/platform/", r"\(lldb\) command regex" + ) + self.assertEvaluate( + "`command alias alias_command platform", r"\(lldb\) command alias" + ) + self.assertEvaluate( + "`command alias alias_command_with_arg platform select --sysroot %1 remote-linux", + r"\(lldb\) command alias", + ) + + self.continue_to_next_stop() + self.assertEvaluate("user_command", "474747") + self.assertEvaluate("alias_command", "474747") + self.assertEvaluate("alias_command_with_arg", "474747") + self.assertEvaluate("platform", "474747") + + self.continue_to_next_stop() + platform_help_needle = "Commands to manage and create platforms" + self.assertEvaluate("user_command", platform_help_needle) + self.assertEvaluate("alias_command", platform_help_needle) + self.assertEvaluate( + "alias_command_with_arg " + self.getBuildDir(), "Platform: remote-linux" + ) + self.assertEvaluate("platform", platform_help_needle) diff --git a/lldb/test/API/tools/lldb-dap/repl-mode/main.cpp b/lldb/test/API/tools/lldb-dap/repl-mode/main.cpp new file mode 100644 index 000000000000..52561d3471ab --- /dev/null +++ b/lldb/test/API/tools/lldb-dap/repl-mode/main.cpp @@ -0,0 +1,15 @@ +void noop() {} + +void fun() { + int user_command = 474747; + int alias_command = 474747; + int alias_command_with_arg = 474747; + int platform = 474747; // built-in command + noop(); // breakpoint 1 +} + +int main() { + fun(); + noop(); // breakpoint 2 + return 0; +} diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp index 55ff1493c101..c7eb3db4304a 100644 --- a/lldb/tools/lldb-dap/DAP.cpp +++ b/lldb/tools/lldb-dap/DAP.cpp @@ -14,6 +14,7 @@ #include "DAP.h" #include "LLDBUtils.h" +#include "lldb/API/SBCommandInterpreter.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/FormatVariadic.h" @@ -405,9 +406,10 @@ ExpressionContext DAP::DetectExpressionContext(lldb::SBFrame frame, std::pair token = llvm::getToken(expression); std::string term = token.first.str(); - lldb::SBCommandReturnObject result; - debugger.GetCommandInterpreter().ResolveCommand(term.c_str(), result); - bool term_is_command = result.Succeeded(); + lldb::SBCommandInterpreter interpreter = debugger.GetCommandInterpreter(); + bool term_is_command = interpreter.CommandExists(term.c_str()) || + interpreter.UserCommandExists(term.c_str()) || + interpreter.AliasExists(term.c_str()); bool term_is_variable = frame.FindVariable(term.c_str()).IsValid(); // If we have both a variable and command, warn the user about the conflict. -- GitLab From 7a6747939218efbe3b1d2cc0f896dfa97c0ff40f Mon Sep 17 00:00:00 2001 From: Daniel Grumberg Date: Fri, 17 May 2024 10:33:31 +0100 Subject: [PATCH 0025/1875] [clang][ExtractAPI] Correctly generate declaration fragments for non-type template parameters (#91958) Previously we only generated declaration fragments for template type parameters/arguments, this adds supports for most other possible template parameters/arguments. rdar://127732598 --- clang/lib/ExtractAPI/DeclarationFragments.cpp | 226 ++++++++++--- clang/test/ExtractAPI/class_template.cpp | 2 +- .../class_template_param_inheritance.cpp | 2 +- .../class_template_partial_spec.cpp | 4 +- clang/test/ExtractAPI/class_template_spec.cpp | 4 +- clang/test/ExtractAPI/concept.cpp | 2 +- clang/test/ExtractAPI/field_template.cpp | 2 +- .../test/ExtractAPI/global_func_template.cpp | 4 +- .../ExtractAPI/global_func_template_spec.cpp | 4 +- clang/test/ExtractAPI/global_var_template.cpp | 2 +- .../global_var_template_partial_spec.cpp | 4 +- .../ExtractAPI/global_var_template_spec.cpp | 4 +- clang/test/ExtractAPI/method_template.cpp | 2 +- .../test/ExtractAPI/method_template_spec.cpp | 4 +- clang/test/ExtractAPI/non_type_template.cpp | 313 ++++++++++++++++++ 15 files changed, 522 insertions(+), 57 deletions(-) create mode 100644 clang/test/ExtractAPI/non_type_template.cpp diff --git a/clang/lib/ExtractAPI/DeclarationFragments.cpp b/clang/lib/ExtractAPI/DeclarationFragments.cpp index 9bf7950888db..98b9343924a8 100644 --- a/clang/lib/ExtractAPI/DeclarationFragments.cpp +++ b/clang/lib/ExtractAPI/DeclarationFragments.cpp @@ -12,13 +12,19 @@ //===----------------------------------------------------------------------===// #include "clang/ExtractAPI/DeclarationFragments.h" +#include "clang/AST/ASTFwd.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" +#include "clang/AST/TemplateBase.h" +#include "clang/AST/TemplateName.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" #include "clang/ExtractAPI/TypedefUnderlyingTypeResolver.h" #include "clang/Index/USRGeneration.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/raw_ostream.h" +#include using namespace clang::extractapi; using namespace llvm; @@ -386,6 +392,25 @@ DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForType( getFragmentsForType(AT->getElementType(), Context, After)); } + if (const TemplateSpecializationType *TemplSpecTy = + dyn_cast(T)) { + const auto TemplName = TemplSpecTy->getTemplateName(); + std::string Str; + raw_string_ostream Stream(Str); + TemplName.print(Stream, Context.getPrintingPolicy(), + TemplateName::Qualified::AsWritten); + SmallString<64> USR(""); + if (const auto *TemplDecl = TemplName.getAsTemplateDecl()) + index::generateUSRForDecl(TemplDecl, USR); + + return Fragments + .append(Str, DeclarationFragments::FragmentKind::TypeIdentifier, USR) + .append("<", DeclarationFragments::FragmentKind::Text) + .append(getFragmentsForTemplateArguments( + TemplSpecTy->template_arguments(), Context, std::nullopt)) + .append(">", DeclarationFragments::FragmentKind::Text); + } + // Everything we care about has been handled now, reduce to the canonical // unqualified base type. QualType Base = T->getCanonicalTypeUnqualified(); @@ -650,7 +675,6 @@ DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForBlock( DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForFunction(const FunctionDecl *Func) { DeclarationFragments Fragments; - // FIXME: Handle template specialization switch (Func->getStorageClass()) { case SC_None: case SC_PrivateExtern: @@ -952,27 +976,84 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateParameters( Fragments.append(",", DeclarationFragments::FragmentKind::Text) .appendSpace(); - const auto *TemplateParam = - dyn_cast(ParameterArray[i]); - if (!TemplateParam) - continue; - if (TemplateParam->hasTypeConstraint()) - Fragments.append(TemplateParam->getTypeConstraint() - ->getNamedConcept() - ->getName() - .str(), - DeclarationFragments::FragmentKind::TypeIdentifier); - else if (TemplateParam->wasDeclaredWithTypename()) - Fragments.append("typename", DeclarationFragments::FragmentKind::Keyword); - else - Fragments.append("class", DeclarationFragments::FragmentKind::Keyword); - - if (TemplateParam->isParameterPack()) - Fragments.append("...", DeclarationFragments::FragmentKind::Text); - - Fragments.appendSpace().append( - TemplateParam->getName(), - DeclarationFragments::FragmentKind::GenericParameter); + if (const auto *TemplateParam = + dyn_cast(ParameterArray[i])) { + if (TemplateParam->hasTypeConstraint()) + Fragments.append(TemplateParam->getTypeConstraint() + ->getNamedConcept() + ->getName() + .str(), + DeclarationFragments::FragmentKind::TypeIdentifier); + else if (TemplateParam->wasDeclaredWithTypename()) + Fragments.append("typename", + DeclarationFragments::FragmentKind::Keyword); + else + Fragments.append("class", DeclarationFragments::FragmentKind::Keyword); + + if (TemplateParam->isParameterPack()) + Fragments.append("...", DeclarationFragments::FragmentKind::Text); + + if (!TemplateParam->getName().empty()) + Fragments.appendSpace().append( + TemplateParam->getName(), + DeclarationFragments::FragmentKind::GenericParameter); + + if (TemplateParam->hasDefaultArgument()) { + DeclarationFragments After; + Fragments.append(" = ", DeclarationFragments::FragmentKind::Text) + .append(getFragmentsForType(TemplateParam->getDefaultArgument(), + TemplateParam->getASTContext(), After)); + Fragments.append(std::move(After)); + } + } else if (const auto *NTP = + dyn_cast(ParameterArray[i])) { + DeclarationFragments After; + const auto TyFragments = + getFragmentsForType(NTP->getType(), NTP->getASTContext(), After); + Fragments.append(std::move(TyFragments)).append(std::move(After)); + + if (NTP->isParameterPack()) + Fragments.append("...", DeclarationFragments::FragmentKind::Text); + + if (!NTP->getName().empty()) + Fragments.appendSpace().append( + NTP->getName(), + DeclarationFragments::FragmentKind::GenericParameter); + + if (NTP->hasDefaultArgument()) { + SmallString<8> ExprStr; + raw_svector_ostream Output(ExprStr); + NTP->getDefaultArgument()->printPretty( + Output, nullptr, NTP->getASTContext().getPrintingPolicy()); + Fragments.append(" = ", DeclarationFragments::FragmentKind::Text) + .append(ExprStr, DeclarationFragments::FragmentKind::Text); + } + } else if (const auto *TTP = + dyn_cast(ParameterArray[i])) { + Fragments.append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() + .append("<", DeclarationFragments::FragmentKind::Text) + .append(getFragmentsForTemplateParameters( + TTP->getTemplateParameters()->asArray())) + .append(">", DeclarationFragments::FragmentKind::Text) + .appendSpace() + .append(TTP->wasDeclaredWithTypename() ? "typename" : "class", + DeclarationFragments::FragmentKind::Keyword); + + if (TTP->isParameterPack()) + Fragments.append("...", DeclarationFragments::FragmentKind::Text); + + if (!TTP->getName().empty()) + Fragments.appendSpace().append( + TTP->getName(), + DeclarationFragments::FragmentKind::GenericParameter); + if (TTP->hasDefaultArgument()) { + const auto Default = TTP->getDefaultArgument(); + Fragments.append(" = ", DeclarationFragments::FragmentKind::Text) + .append(getFragmentsForTemplateArguments( + {Default.getArgument()}, TTP->getASTContext(), {Default})); + } + } } return Fragments; } @@ -993,23 +1074,85 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateArguments( Fragments.append(",", DeclarationFragments::FragmentKind::Text) .appendSpace(); - std::string Type = TemplateArguments[i].getAsType().getAsString(); - DeclarationFragments After; - DeclarationFragments ArgumentFragment = - getFragmentsForType(TemplateArguments[i].getAsType(), Context, After); - - if (StringRef(ArgumentFragment.begin()->Spelling) - .starts_with("type-parameter")) { - std::string ProperArgName = TemplateArgumentLocs.value()[i] - .getTypeSourceInfo() - ->getType() - .getAsString(); - ArgumentFragment.begin()->Spelling.swap(ProperArgName); + const auto &CTA = TemplateArguments[i]; + switch (CTA.getKind()) { + case TemplateArgument::Type: { + DeclarationFragments After; + DeclarationFragments ArgumentFragment = + getFragmentsForType(CTA.getAsType(), Context, After); + + if (StringRef(ArgumentFragment.begin()->Spelling) + .starts_with("type-parameter")) { + std::string ProperArgName = TemplateArgumentLocs.value()[i] + .getTypeSourceInfo() + ->getType() + .getAsString(); + ArgumentFragment.begin()->Spelling.swap(ProperArgName); + } + Fragments.append(std::move(ArgumentFragment)); + break; } - Fragments.append(std::move(ArgumentFragment)); + case TemplateArgument::Declaration: { + const auto *VD = CTA.getAsDecl(); + SmallString<128> USR; + index::generateUSRForDecl(VD, USR); + Fragments.append(VD->getNameAsString(), + DeclarationFragments::FragmentKind::Identifier, USR); + break; + } + case TemplateArgument::NullPtr: + Fragments.append("nullptr", DeclarationFragments::FragmentKind::Keyword); + break; - if (TemplateArguments[i].isPackExpansion()) - Fragments.append("...", DeclarationFragments::FragmentKind::Text); + case TemplateArgument::Integral: { + SmallString<4> Str; + CTA.getAsIntegral().toString(Str); + Fragments.append(Str, DeclarationFragments::FragmentKind::Text); + break; + } + + case TemplateArgument::StructuralValue: { + const auto SVTy = CTA.getStructuralValueType(); + Fragments.append(CTA.getAsStructuralValue().getAsString(Context, SVTy), + DeclarationFragments::FragmentKind::Text); + break; + } + + case TemplateArgument::TemplateExpansion: + case TemplateArgument::Template: { + std::string Str; + raw_string_ostream Stream(Str); + CTA.getAsTemplate().print(Stream, Context.getPrintingPolicy()); + SmallString<64> USR(""); + if (const auto *TemplDecl = + CTA.getAsTemplateOrTemplatePattern().getAsTemplateDecl()) + index::generateUSRForDecl(TemplDecl, USR); + Fragments.append(Str, DeclarationFragments::FragmentKind::TypeIdentifier, + USR); + if (CTA.getKind() == TemplateArgument::TemplateExpansion) + Fragments.append("...", DeclarationFragments::FragmentKind::Text); + break; + } + + case TemplateArgument::Pack: + Fragments.append("<", DeclarationFragments::FragmentKind::Text) + .append(getFragmentsForTemplateArguments(CTA.pack_elements(), Context, + {})) + .append(">", DeclarationFragments::FragmentKind::Text); + break; + + case TemplateArgument::Expression: { + SmallString<8> ExprStr; + raw_svector_ostream Output(ExprStr); + CTA.getAsExpr()->printPretty(Output, nullptr, + Context.getPrintingPolicy()); + Fragments.append(ExprStr, DeclarationFragments::FragmentKind::Text); + break; + } + + case TemplateArgument::Null: + break; + } } return Fragments; } @@ -1019,10 +1162,12 @@ DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForConcept( DeclarationFragments Fragments; return Fragments .append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<", DeclarationFragments::FragmentKind::Text) .append(getFragmentsForTemplateParameters( Concept->getTemplateParameters()->asArray())) .append("> ", DeclarationFragments::FragmentKind::Text) + .appendSpace() .append("concept", DeclarationFragments::FragmentKind::Keyword) .appendSpace() .append(Concept->getName().str(), @@ -1035,6 +1180,7 @@ DeclarationFragmentsBuilder::getFragmentsForRedeclarableTemplate( const RedeclarableTemplateDecl *RedeclarableTemplate) { DeclarationFragments Fragments; Fragments.append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<", DeclarationFragments::FragmentKind::Text) .append(getFragmentsForTemplateParameters( RedeclarableTemplate->getTemplateParameters()->asArray())) @@ -1057,6 +1203,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplateSpecialization( DeclarationFragments Fragments; return Fragments .append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<", DeclarationFragments::FragmentKind::Text) .append(">", DeclarationFragments::FragmentKind::Text) .appendSpace() @@ -1077,6 +1224,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplatePartialSpecialization( DeclarationFragments Fragments; return Fragments .append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<", DeclarationFragments::FragmentKind::Text) .append(getFragmentsForTemplateParameters( Decl->getTemplateParameters()->asArray())) @@ -1099,6 +1247,7 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplateSpecialization( DeclarationFragments Fragments; return Fragments .append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<", DeclarationFragments::FragmentKind::Text) .append(">", DeclarationFragments::FragmentKind::Text) .appendSpace() @@ -1118,6 +1267,7 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplatePartialSpecialization( DeclarationFragments Fragments; return Fragments .append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<", DeclarationFragments::FragmentKind::Text) // Partial specs may have new params. .append(getFragmentsForTemplateParameters( @@ -1140,6 +1290,7 @@ DeclarationFragmentsBuilder::getFragmentsForFunctionTemplate( DeclarationFragments Fragments; return Fragments .append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<", DeclarationFragments::FragmentKind::Text) // Partial specs may have new params. .append(getFragmentsForTemplateParameters( @@ -1156,6 +1307,7 @@ DeclarationFragmentsBuilder::getFragmentsForFunctionTemplateSpecialization( DeclarationFragments Fragments; return Fragments .append("template", DeclarationFragments::FragmentKind::Keyword) + .appendSpace() .append("<>", DeclarationFragments::FragmentKind::Text) .appendSpace() .append(DeclarationFragmentsBuilder::getFragmentsForFunction(Decl)); diff --git a/clang/test/ExtractAPI/class_template.cpp b/clang/test/ExtractAPI/class_template.cpp index 4f2670d7b699..203d47394dd6 100644 --- a/clang/test/ExtractAPI/class_template.cpp +++ b/clang/test/ExtractAPI/class_template.cpp @@ -51,7 +51,7 @@ template class Foo {}; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/class_template_param_inheritance.cpp b/clang/test/ExtractAPI/class_template_param_inheritance.cpp index 3d7b09f93ed6..53b331e0b460 100644 --- a/clang/test/ExtractAPI/class_template_param_inheritance.cpp +++ b/clang/test/ExtractAPI/class_template_param_inheritance.cpp @@ -58,7 +58,7 @@ template class Foo : public T {}; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/class_template_partial_spec.cpp b/clang/test/ExtractAPI/class_template_partial_spec.cpp index c8d9cc78d41c..7d244f49c735 100644 --- a/clang/test/ExtractAPI/class_template_partial_spec.cpp +++ b/clang/test/ExtractAPI/class_template_partial_spec.cpp @@ -53,7 +53,7 @@ template class Foo {}; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", @@ -161,7 +161,7 @@ template class Foo {}; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/class_template_spec.cpp b/clang/test/ExtractAPI/class_template_spec.cpp index 06a95314dc4a..9dbd887510c7 100644 --- a/clang/test/ExtractAPI/class_template_spec.cpp +++ b/clang/test/ExtractAPI/class_template_spec.cpp @@ -53,7 +53,7 @@ template<> class Foo {}; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", @@ -140,7 +140,7 @@ template<> class Foo {}; }, { "kind": "text", - "spelling": "<> " + "spelling": " <> " }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/concept.cpp b/clang/test/ExtractAPI/concept.cpp index 443eac2971f0..4396a39a63ef 100644 --- a/clang/test/ExtractAPI/concept.cpp +++ b/clang/test/ExtractAPI/concept.cpp @@ -51,7 +51,7 @@ template concept Foo = true; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/field_template.cpp b/clang/test/ExtractAPI/field_template.cpp index 2058ed008cfe..973a9de5c998 100644 --- a/clang/test/ExtractAPI/field_template.cpp +++ b/clang/test/ExtractAPI/field_template.cpp @@ -114,7 +114,7 @@ class Foo { }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/global_func_template.cpp b/clang/test/ExtractAPI/global_func_template.cpp index f43a618ec0c3..044757c316d5 100644 --- a/clang/test/ExtractAPI/global_func_template.cpp +++ b/clang/test/ExtractAPI/global_func_template.cpp @@ -52,7 +52,7 @@ template T Fizz(int Buzz); }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", @@ -186,7 +186,7 @@ template T Fizz(int Buzz); }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/global_func_template_spec.cpp b/clang/test/ExtractAPI/global_func_template_spec.cpp index fe046e9c3b9d..b88063aacfed 100644 --- a/clang/test/ExtractAPI/global_func_template_spec.cpp +++ b/clang/test/ExtractAPI/global_func_template_spec.cpp @@ -52,7 +52,7 @@ template<> void Foo(int Bar); }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", @@ -186,7 +186,7 @@ template<> void Foo(int Bar); }, { "kind": "text", - "spelling": "<> " + "spelling": " <> " }, { "kind": "typeIdentifier", diff --git a/clang/test/ExtractAPI/global_var_template.cpp b/clang/test/ExtractAPI/global_var_template.cpp index 94f3713cd3d3..5c9194141332 100644 --- a/clang/test/ExtractAPI/global_var_template.cpp +++ b/clang/test/ExtractAPI/global_var_template.cpp @@ -50,7 +50,7 @@ template T Foo = T(3.14); }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/global_var_template_partial_spec.cpp b/clang/test/ExtractAPI/global_var_template_partial_spec.cpp index 91084f258878..ffb1557fd758 100644 --- a/clang/test/ExtractAPI/global_var_template_partial_spec.cpp +++ b/clang/test/ExtractAPI/global_var_template_partial_spec.cpp @@ -52,7 +52,7 @@ template int Foo = 0; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", @@ -161,7 +161,7 @@ template int Foo = 0; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/global_var_template_spec.cpp b/clang/test/ExtractAPI/global_var_template_spec.cpp index ff4d8d17aecb..e465da97db1f 100644 --- a/clang/test/ExtractAPI/global_var_template_spec.cpp +++ b/clang/test/ExtractAPI/global_var_template_spec.cpp @@ -52,7 +52,7 @@ template<> int Foo; }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", @@ -140,7 +140,7 @@ template<> int Foo; }, { "kind": "text", - "spelling": "<> " + "spelling": " <> " }, { "kind": "typeIdentifier", diff --git a/clang/test/ExtractAPI/method_template.cpp b/clang/test/ExtractAPI/method_template.cpp index 714f9cac26c2..bf91a208c548 100644 --- a/clang/test/ExtractAPI/method_template.cpp +++ b/clang/test/ExtractAPI/method_template.cpp @@ -114,7 +114,7 @@ class Foo { }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", diff --git a/clang/test/ExtractAPI/method_template_spec.cpp b/clang/test/ExtractAPI/method_template_spec.cpp index 8eaffdefd827..978dbe1b6c1d 100644 --- a/clang/test/ExtractAPI/method_template_spec.cpp +++ b/clang/test/ExtractAPI/method_template_spec.cpp @@ -122,7 +122,7 @@ class Foo { }, { "kind": "text", - "spelling": "<" + "spelling": " <" }, { "kind": "keyword", @@ -257,7 +257,7 @@ class Foo { }, { "kind": "text", - "spelling": "<> " + "spelling": " <> " }, { "kind": "typeIdentifier", diff --git a/clang/test/ExtractAPI/non_type_template.cpp b/clang/test/ExtractAPI/non_type_template.cpp new file mode 100644 index 000000000000..4e65eb790ca1 --- /dev/null +++ b/clang/test/ExtractAPI/non_type_template.cpp @@ -0,0 +1,313 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -extract-api --pretty-sgf --emit-sgf-symbol-labels-for-testing \ +// RUN: -triple arm64-apple-macosx -std=c++17 -x c++-header %s -o %t/output.symbols.json -verify + +// RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix FOO +template class Foo { }; +// FOO-LABEL: "!testLabel": "c:@ST>2#T#NI@Foo" +// FOO: "declarationFragments": [ +// FOO-NEXT: { +// FOO-NEXT: "kind": "keyword", +// FOO-NEXT: "spelling": "template" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "text", +// FOO-NEXT: "spelling": " <" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "keyword", +// FOO-NEXT: "spelling": "typename" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "text", +// FOO-NEXT: "spelling": " " +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "genericParameter", +// FOO-NEXT: "spelling": "T" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "text", +// FOO-NEXT: "spelling": ", " +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "typeIdentifier", +// FOO-NEXT: "preciseIdentifier": "c:I", +// FOO-NEXT: "spelling": "int" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "text", +// FOO-NEXT: "spelling": " " +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "genericParameter", +// FOO-NEXT: "spelling": "N" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "text", +// FOO-NEXT: "spelling": " = 4> " +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "keyword", +// FOO-NEXT: "spelling": "class" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "text", +// FOO-NEXT: "spelling": " " +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "identifier", +// FOO-NEXT: "spelling": "Foo" +// FOO-NEXT: }, +// FOO-NEXT: { +// FOO-NEXT: "kind": "text", +// FOO-NEXT: "spelling": ";" +// FOO-NEXT: } +// FOO-NEXT: ] + +// RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix FOO-SPEC +template class Foo { }; +// FOO-SPEC-LABEL: "!testLabel": "c:@SP>1#T@Foo>#t0.0#VI4" +// FOO-SPEC: "declarationFragments": [ +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "keyword", +// FOO-SPEC-NEXT: "spelling": "template" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "text", +// FOO-SPEC-NEXT: "spelling": " <" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "keyword", +// FOO-SPEC-NEXT: "spelling": "typename" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "text", +// FOO-SPEC-NEXT: "spelling": " " +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "genericParameter", +// FOO-SPEC-NEXT: "spelling": "T" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "text", +// FOO-SPEC-NEXT: "spelling": "> " +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "keyword", +// FOO-SPEC-NEXT: "spelling": "class" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "text", +// FOO-SPEC-NEXT: "spelling": " " +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "identifier", +// FOO-SPEC-NEXT: "spelling": "Foo" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "text", +// FOO-SPEC-NEXT: "spelling": "<" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "typeIdentifier", +// FOO-SPEC-NEXT: "preciseIdentifier": "c:t0.0", +// FOO-SPEC-NEXT: "spelling": "T" +// FOO-SPEC-NEXT: }, +// FOO-SPEC-NEXT: { +// FOO-SPEC-NEXT: "kind": "text", +// FOO-SPEC-NEXT: "spelling": ", 4>;" +// FOO-SPEC-NEXT: } +// FOO-SPEC-NEXT: ] + +// RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix NEST +template