[llvm-branch-commits] [mlir] [draft] Dialect Conversion without Rollback (PR #93412)
https://github.com/matthias-springer created https://github.com/llvm/llvm-project/pull/93412 This commit adds a dialect conversion driver without rollback: `OneShotDialectConversionDriver` The new driver reuses some functionality of the greedy pattern rewrite driver. Just a proof of concept, code is not polished yet. `OneShotConversionPatternRewriter` is a rewriter that materializes all IR changes immediately. Adapted two tests to show what kind of changes are needed: `nvgpu-to-nvvm` and `complex-to-standard` >From 11dfecd793b6e84224511ef6b065964b64784c49 Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Sun, 26 May 2024 14:59:09 +0200 Subject: [PATCH] [draft] Dialect Conversion without Rollback This commit adds a dialect conversion driver without rollback: `OneShotDialectConversionDriver` The new driver reuses some functionality of the greedy pattern rewrite driver. Just a proof of concept, code is not polished yet. `OneShotConversionPatternRewriter` is a rewriter that materializes all IR changes immediately. --- .../mlir/Transforms/DialectConversion.h | 27 +- .../Transforms/GreedyPatternRewriteDriver.h | 6 + .../ComplexToStandard/ComplexToStandard.cpp | 5 +- .../Conversion/NVGPUToNVVM/NVGPUToNVVM.cpp| 6 +- .../Transforms/Utils/DialectConversion.cpp| 33 ++- .../Utils/GreedyPatternRewriteDriver.cpp | 280 -- .../Conversion/NVGPUToNVVM/nvgpu-to-nvvm.mlir | 26 +- 7 files changed, 336 insertions(+), 47 deletions(-) diff --git a/mlir/include/mlir/Transforms/DialectConversion.h b/mlir/include/mlir/Transforms/DialectConversion.h index 83198c9b0db54..8d1c125660d10 100644 --- a/mlir/include/mlir/Transforms/DialectConversion.h +++ b/mlir/include/mlir/Transforms/DialectConversion.h @@ -247,7 +247,8 @@ class TypeConverter { /// Attempts a 1-1 type conversion, expecting the result type to be /// `TargetType`. Returns the converted type cast to `TargetType` on success, /// and a null type on conversion or cast failure. - template TargetType convertType(Type t) const { + template + TargetType convertType(Type t) const { return dyn_cast_or_null(convertType(t)); } @@ -657,7 +658,7 @@ struct ConversionPatternRewriterImpl; /// This class implements a pattern rewriter for use with ConversionPatterns. It /// extends the base PatternRewriter and provides special conversion specific /// hooks. -class ConversionPatternRewriter final : public PatternRewriter { +class ConversionPatternRewriter : public PatternRewriter { public: ~ConversionPatternRewriter() override; @@ -711,6 +712,17 @@ class ConversionPatternRewriter final : public PatternRewriter { LogicalResult getRemappedValues(ValueRange keys, SmallVectorImpl &results); + virtual void setCurrentTypeConverter(const TypeConverter *converter); + + virtual const TypeConverter *getCurrentTypeConverter() const; + + /// Populate the operands that are used for constructing the adapter into + /// `remapped`. + virtual LogicalResult getAdapterOperands(StringRef valueDiagTag, + std::optional inputLoc, + ValueRange values, + SmallVector &remapped); + //======// // PatternRewriter Hooks //======// @@ -755,6 +767,14 @@ class ConversionPatternRewriter final : public PatternRewriter { /// Return a reference to the internal implementation. detail::ConversionPatternRewriterImpl &getImpl(); +protected: + /// Protected constructor for `OneShotConversionPatternRewriter`. Does not + /// initialize `impl`. + explicit ConversionPatternRewriter(MLIRContext *ctx); + + // Hide unsupported pattern rewriter API. + using OpBuilder::setListener; + private: // Allow OperationConverter to construct new rewriters. friend struct OperationConverter; @@ -765,9 +785,6 @@ class ConversionPatternRewriter final : public PatternRewriter { explicit ConversionPatternRewriter(MLIRContext *ctx, const ConversionConfig &config); - // Hide unsupported pattern rewriter API. - using OpBuilder::setListener; - std::unique_ptr impl; }; diff --git a/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h b/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h index 763146aac15b9..21156ca59f674 100644 --- a/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h +++ b/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h @@ -18,6 +18,8 @@ namespace mlir { +class ConversionTarget; + /// This enum controls which ops are put on the worklist during a greedy /// pattern rewrite. enum class GreedyRewriteStrictness { @@ -188,6 +190,10 @@ applyOpPatternsAndFold(ArrayRef ops, GreedyRewriteConfig co
[llvm-branch-commits] [clang] [clang] Preserve Qualifiers and type sugar in TemplateNames (PR #93433)
https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/93433 This patch improves the preservation of qualifiers and loss of type sugar in TemplateNames. This problem is analogous to https://reviews.llvm.org/D112374 and this patch takes a very similar approach to that patch, except the impact here is much lesser. When a TemplateName was written bare, without qualifications, we wouldn't produce a QualifiedTemplate which could be used to disambiguate it from a Canonical TemplateName. This had effects in the TemplateName printer, which had workarounds to deal with this, and wouldn't print the TemplateName as-written in most situations. There are also some related fixes to help preserve this type sugar along the way into diagnostics, so that this patch can be properly tested. - Fix dropping the template keyword. - Fix type deduction to preserve sugar in TST TemplateNames. >From a1fe052b0fb0c96fc5ae38af7f13b19110d8096d Mon Sep 17 00:00:00 2001 From: Matheus Izvekov Date: Sat, 25 May 2024 13:57:39 -0300 Subject: [PATCH] [clang] Preserve Qualifiers and type sugar in TemplateNames This patch improves the preservation of qualifiers and loss of type sugar in TemplateNames. This problem is analogous to https://reviews.llvm.org/D112374 and this patch takes a very similar approach to that patch, except the impact here is much lesser. When a TemplateName was written bare, without qualifications, we wouldn't produce a QualifiedTemplate which could be used to disambiguate it from a Canonical TemplateName. This had effects in the TemplateName printer, which had workarounds to deal with this, and wouldn't print the TemplateName as-written in most situations. There are also some related fixes to help preserve this type sugar along the way into diagnostics, so that this patch can be properly tested. - Fix dropping the template keyword. - Fix type deduction to preserve sugar in TST TemplateNames. --- clang/docs/ReleaseNotes.rst | 2 + clang/include/clang/AST/TemplateName.h| 2 +- clang/include/clang/Sema/Sema.h | 3 + clang/lib/AST/ASTContext.cpp | 16 ++--- clang/lib/AST/DeclTemplate.cpp| 7 +- clang/lib/AST/ODRHash.cpp | 9 ++- clang/lib/AST/TemplateBase.cpp| 2 +- clang/lib/AST/TemplateName.cpp| 64 +-- clang/lib/AST/TextNodeDumper.cpp | 4 +- clang/lib/AST/Type.cpp| 3 +- clang/lib/AST/TypePrinter.cpp | 4 +- clang/lib/Sema/SemaDecl.cpp | 15 ++--- clang/lib/Sema/SemaDeclCXX.cpp| 12 ++-- clang/lib/Sema/SemaExpr.cpp | 4 +- clang/lib/Sema/SemaExprMember.cpp | 3 +- clang/lib/Sema/SemaTemplate.cpp | 25 +--- clang/lib/Sema/SemaTemplateDeduction.cpp | 62 +- clang/lib/Sema/SemaType.cpp | 14 ++-- clang/lib/Sema/TreeTransform.h| 8 +-- clang/test/AST/ast-dump-ctad-alias.cpp| 6 +- clang/test/AST/ast-dump-decl.cpp | 8 +-- clang/test/AST/ast-dump-expr.cpp | 2 +- clang/test/AST/ast-dump-template-decls.cpp| 6 +- clang/test/AST/ast-dump-template-name.cpp | 4 +- clang/test/AST/ast-dump-using-template.cpp| 6 +- clang/test/CXX/drs/cwg1xx.cpp | 4 +- .../over.match.oper/p3-2a.cpp | 4 +- .../temp.deduct/temp.deduct.type/p9-0x.cpp| 4 +- clang/test/Index/print-type.cpp | 2 +- clang/test/OpenMP/declare_mapper_messages.cpp | 2 +- .../Parser/cxx-template-template-recovery.cpp | 4 +- .../cxx1y-variable-templates_in_class.cpp | 10 +-- clang/test/SemaTemplate/cwg2398.cpp | 2 +- .../instantiate-requires-expr.cpp | 4 +- .../nested-implicit-deduction-guides.cpp | 2 +- clang/unittests/AST/TemplateNameTest.cpp | 40 ++-- 36 files changed, 222 insertions(+), 147 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 403a107edef17..257e1df6e6503 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -802,6 +802,8 @@ Bug Fixes to AST Handling - Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. (#GH82628) - The presence of the ``typename`` keyword is now stored in ``TemplateTemplateParmDecl``. - Fixed malformed AST generated for anonymous union access in templates. (#GH90842) +- Improved preservation of qualifiers and sugar in TemplateNames, including + template keyword. Miscellaneous Bug Fixes ^^^ diff --git a/clang/include/clang/AST/TemplateName.h b/clang/include/clang/AST/TemplateName.h index b7732e54ba107..6bb03f90ac36a 100644 --- a/clang/include/clang/AST/TemplateName.h +++ b/clang/include/clang/AST/TemplateName.h @@ -332,7 +332,7 @@ class TemplateName { /// unexpanded parameter pack
[llvm-branch-commits] [clang] [clang] Preserve Qualifiers and type sugar in TemplateNames (PR #93433)
llvmbot wrote: @llvm/pr-subscribers-clang-modules @llvm/pr-subscribers-clang Author: Matheus Izvekov (mizvekov) Changes This patch improves the preservation of qualifiers and loss of type sugar in TemplateNames. This problem is analogous to https://reviews.llvm.org/D112374 and this patch takes a very similar approach to that patch, except the impact here is much lesser. When a TemplateName was written bare, without qualifications, we wouldn't produce a QualifiedTemplate which could be used to disambiguate it from a Canonical TemplateName. This had effects in the TemplateName printer, which had workarounds to deal with this, and wouldn't print the TemplateName as-written in most situations. There are also some related fixes to help preserve this type sugar along the way into diagnostics, so that this patch can be properly tested. - Fix dropping the template keyword. - Fix type deduction to preserve sugar in TST TemplateNames. --- Patch is 53.47 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/93433.diff 36 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/include/clang/AST/TemplateName.h (+1-1) - (modified) clang/include/clang/Sema/Sema.h (+3) - (modified) clang/lib/AST/ASTContext.cpp (+6-10) - (modified) clang/lib/AST/DeclTemplate.cpp (+4-3) - (modified) clang/lib/AST/ODRHash.cpp (+8-1) - (modified) clang/lib/AST/TemplateBase.cpp (+1-1) - (modified) clang/lib/AST/TemplateName.cpp (+30-34) - (modified) clang/lib/AST/TextNodeDumper.cpp (+2-2) - (modified) clang/lib/AST/Type.cpp (+2-1) - (modified) clang/lib/AST/TypePrinter.cpp (+2-2) - (modified) clang/lib/Sema/SemaDecl.cpp (+7-8) - (modified) clang/lib/Sema/SemaDeclCXX.cpp (+6-6) - (modified) clang/lib/Sema/SemaExpr.cpp (+2-2) - (modified) clang/lib/Sema/SemaExprMember.cpp (+2-1) - (modified) clang/lib/Sema/SemaTemplate.cpp (+17-8) - (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+47-15) - (modified) clang/lib/Sema/SemaType.cpp (+9-5) - (modified) clang/lib/Sema/TreeTransform.h (+3-5) - (modified) clang/test/AST/ast-dump-ctad-alias.cpp (+3-3) - (modified) clang/test/AST/ast-dump-decl.cpp (+4-4) - (modified) clang/test/AST/ast-dump-expr.cpp (+1-1) - (modified) clang/test/AST/ast-dump-template-decls.cpp (+3-3) - (modified) clang/test/AST/ast-dump-template-name.cpp (+2-2) - (modified) clang/test/AST/ast-dump-using-template.cpp (+3-3) - (modified) clang/test/CXX/drs/cwg1xx.cpp (+2-2) - (modified) clang/test/CXX/over/over.match/over.match.funcs/over.match.oper/p3-2a.cpp (+2-2) - (modified) clang/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p9-0x.cpp (+2-2) - (modified) clang/test/Index/print-type.cpp (+1-1) - (modified) clang/test/OpenMP/declare_mapper_messages.cpp (+1-1) - (modified) clang/test/Parser/cxx-template-template-recovery.cpp (+2-2) - (modified) clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp (+5-5) - (modified) clang/test/SemaTemplate/cwg2398.cpp (+1-1) - (modified) clang/test/SemaTemplate/instantiate-requires-expr.cpp (+2-2) - (modified) clang/test/SemaTemplate/nested-implicit-deduction-guides.cpp (+1-1) - (modified) clang/unittests/AST/TemplateNameTest.cpp (+33-7) ``diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 403a107edef17..257e1df6e6503 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -802,6 +802,8 @@ Bug Fixes to AST Handling - Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. (#GH82628) - The presence of the ``typename`` keyword is now stored in ``TemplateTemplateParmDecl``. - Fixed malformed AST generated for anonymous union access in templates. (#GH90842) +- Improved preservation of qualifiers and sugar in TemplateNames, including + template keyword. Miscellaneous Bug Fixes ^^^ diff --git a/clang/include/clang/AST/TemplateName.h b/clang/include/clang/AST/TemplateName.h index b7732e54ba107..6bb03f90ac36a 100644 --- a/clang/include/clang/AST/TemplateName.h +++ b/clang/include/clang/AST/TemplateName.h @@ -332,7 +332,7 @@ class TemplateName { /// unexpanded parameter pack (for C++0x variadic templates). bool containsUnexpandedParameterPack() const; - enum class Qualified { None, AsWritten, Fully }; + enum class Qualified { None, AsWritten }; /// Print the template name. /// /// \param OS the output stream to which the template name will be diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index ec083f7cc09b7..e6296868000c5 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -8988,6 +8988,9 @@ class Sema final : public SemaBase { const TemplateArgumentListInfo *TemplateArgs); void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc); + void diagnoseMissingTemplateArguments(const CXXScopeSpec &SS, +
[llvm-branch-commits] [clang] [libcxx] [clang] Preserve Qualifiers and type sugar in TemplateNames (PR #93433)
https://github.com/mizvekov updated https://github.com/llvm/llvm-project/pull/93433 >From 91fa7c94aa5c0936484e75f1cf88df2489b9f587 Mon Sep 17 00:00:00 2001 From: Matheus Izvekov Date: Sat, 25 May 2024 13:57:39 -0300 Subject: [PATCH] [clang] Preserve Qualifiers and type sugar in TemplateNames This patch improves the preservation of qualifiers and loss of type sugar in TemplateNames. This problem is analogous to https://reviews.llvm.org/D112374 and this patch takes a very similar approach to that patch, except the impact here is much lesser. When a TemplateName was written bare, without qualifications, we wouldn't produce a QualifiedTemplate which could be used to disambiguate it from a Canonical TemplateName. This had effects in the TemplateName printer, which had workarounds to deal with this, and wouldn't print the TemplateName as-written in most situations. There are also some related fixes to help preserve this type sugar along the way into diagnostics, so that this patch can be properly tested. - Fix dropping the template keyword. - Fix type deduction to preserve sugar in TST TemplateNames. --- clang/docs/ReleaseNotes.rst | 2 + clang/include/clang/AST/TemplateName.h| 2 +- clang/include/clang/Sema/Sema.h | 3 + clang/lib/AST/ASTContext.cpp | 16 ++--- clang/lib/AST/DeclTemplate.cpp| 7 +- clang/lib/AST/ODRHash.cpp | 9 ++- clang/lib/AST/TemplateBase.cpp| 2 +- clang/lib/AST/TemplateName.cpp| 64 +-- clang/lib/AST/TextNodeDumper.cpp | 4 +- clang/lib/AST/Type.cpp| 3 +- clang/lib/AST/TypePrinter.cpp | 4 +- clang/lib/Sema/SemaDecl.cpp | 15 ++--- clang/lib/Sema/SemaDeclCXX.cpp| 12 ++-- clang/lib/Sema/SemaExpr.cpp | 4 +- clang/lib/Sema/SemaExprMember.cpp | 3 +- clang/lib/Sema/SemaTemplate.cpp | 25 +--- clang/lib/Sema/SemaTemplateDeduction.cpp | 62 +- clang/lib/Sema/SemaType.cpp | 14 ++-- clang/lib/Sema/TreeTransform.h| 8 +-- clang/test/AST/ast-dump-ctad-alias.cpp| 6 +- clang/test/AST/ast-dump-decl.cpp | 8 +-- clang/test/AST/ast-dump-expr.cpp | 2 +- clang/test/AST/ast-dump-template-decls.cpp| 6 +- clang/test/AST/ast-dump-template-name.cpp | 4 +- clang/test/AST/ast-dump-using-template.cpp| 6 +- clang/test/CXX/drs/cwg1xx.cpp | 4 +- .../over.match.oper/p3-2a.cpp | 4 +- .../temp.deduct/temp.deduct.type/p9-0x.cpp| 4 +- clang/test/Index/print-type.cpp | 2 +- clang/test/OpenMP/declare_mapper_messages.cpp | 2 +- .../Parser/cxx-template-template-recovery.cpp | 4 +- .../cxx1y-variable-templates_in_class.cpp | 10 +-- clang/test/SemaTemplate/cwg2398.cpp | 2 +- .../instantiate-requires-expr.cpp | 4 +- .../nested-implicit-deduction-guides.cpp | 2 +- clang/unittests/AST/TemplateNameTest.cpp | 40 ++-- .../map/map.cons/deduct.verify.cpp| 24 +++ .../multimap/multimap.cons/deduct.verify.cpp | 22 +++ .../multiset/multiset.cons/deduct.verify.cpp | 10 +-- .../set/set.cons/deduct.verify.cpp| 10 +-- .../priqueue.cons/deduct.verify.cpp | 10 +-- .../queue/queue.cons/deduct.verify.cpp| 6 +- .../stack/stack.cons/deduct.verify.cpp| 6 +- .../array/array.cons/deduct.verify.cpp| 2 +- .../deque/deque.cons/deduct.verify.cpp| 2 +- .../forwardlist.cons/deduct.verify.cpp| 2 +- .../list/list.cons/deduct.verify.cpp | 2 +- .../vector/vector.cons/deduct.verify.cpp | 2 +- .../unord.map.cnstr/deduct.verify.cpp | 16 ++--- .../unord.multimap.cnstr/deduct.verify.cpp| 16 ++--- .../unord.multiset.cnstr/deduct.verify.cpp| 16 ++--- .../unord.set.cnstr/deduct.verify.cpp | 16 ++--- .../range.adaptors/range.join/ctad.verify.cpp | 2 +- .../re.regex.construct/deduct.verify.cpp | 4 +- .../func.wrap.func.con/deduct_F.verify.cpp| 6 +- .../optional.object.ctor/deduct.verify.cpp| 2 +- 56 files changed, 310 insertions(+), 235 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index f7562ce74f4ed..af8188b7ca3b1 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -804,6 +804,8 @@ Bug Fixes to AST Handling - Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. (#GH82628) - The presence of the ``typename`` keyword is now stored in ``TemplateTemplateParmDecl``. - Fixed malformed AST generated for anonymous union access in templates. (#GH90842) +- Improved preservation of qualifiers and sugar in TemplateNames, including + template keyword. Miscellaneous Bug Fixes ^^^ diff --
[llvm-branch-commits] [llvm] f350760 - Revert "[X86] Use generic CPU tuning when tune-cpu is empty (#83631)"
Author: Phoebe Wang Date: 2024-05-27T11:34:21+08:00 New Revision: f350760c1c8f7e7b7c7f858aacc1465a03a1ed83 URL: https://github.com/llvm/llvm-project/commit/f350760c1c8f7e7b7c7f858aacc1465a03a1ed83 DIFF: https://github.com/llvm/llvm-project/commit/f350760c1c8f7e7b7c7f858aacc1465a03a1ed83.diff LOG: Revert "[X86] Use generic CPU tuning when tune-cpu is empty (#83631)" This reverts commit bafda89a0944d947fc4b3b5663185e07a397ac30. Added: Modified: llvm/lib/Target/X86/X86Subtarget.cpp Removed: diff --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp index bac8d3a29ec06..c2e6ddd7e7fa2 100644 --- a/llvm/lib/Target/X86/X86Subtarget.cpp +++ b/llvm/lib/Target/X86/X86Subtarget.cpp @@ -252,7 +252,7 @@ void X86Subtarget::initSubtargetFeatures(StringRef CPU, StringRef TuneCPU, CPU = "generic"; if (TuneCPU.empty()) -TuneCPU = HasX86_64 ? "generic" : "i586"; +TuneCPU = "i586"; // FIXME: "generic" is more modern than llc tests expect. std::string FullFS = X86_MC::ParseX86Triple(TargetTriple); assert(!FullFS.empty() && "Failed to parse X86 triple"); ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] release/18.x: [PPCMergeStringPool] Only replace constant once (#92996) (PR #93442)
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/93442 Backport 9f85bc834b07ebfec9e5e02deb9255a0f6ec5cc7 Requested by: @nikic >From 97ab1917845fa9426ba913139fc8a007cba1d7ce Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 27 May 2024 08:54:11 +0200 Subject: [PATCH] [PPCMergeStringPool] Only replace constant once (#92996) In #88846 I changed this code to use RAUW to perform the replacement instead of manual updates -- but kept the outer loop, which means we try to perform RAUW once per user. However, some of the users might be freed by the RAUW operation, resulting in use-after-free. The case where this happens is constant users where the replacement might result in the destruction of the original constant. Fixes https://github.com/llvm/llvm-project/issues/92991. (cherry picked from commit 9f85bc834b07ebfec9e5e02deb9255a0f6ec5cc7) --- .../lib/Target/PowerPC/PPCMergeStringPool.cpp | 37 --- .../PowerPC/mergeable-string-pool-pr92991.ll | 20 ++ 2 files changed, 27 insertions(+), 30 deletions(-) create mode 100644 llvm/test/CodeGen/PowerPC/mergeable-string-pool-pr92991.ll diff --git a/llvm/lib/Target/PowerPC/PPCMergeStringPool.cpp b/llvm/lib/Target/PowerPC/PPCMergeStringPool.cpp index ebd876d50c44e..0830b02370cd0 100644 --- a/llvm/lib/Target/PowerPC/PPCMergeStringPool.cpp +++ b/llvm/lib/Target/PowerPC/PPCMergeStringPool.cpp @@ -290,13 +290,6 @@ bool PPCMergeStringPool::mergeModuleStringPool(Module &M) { return true; } -static bool userHasOperand(User *TheUser, GlobalVariable *GVOperand) { - for (Value *Op : TheUser->operands()) -if (Op == GVOperand) - return true; - return false; -} - // For pooled strings we need to add the offset into the pool for each string. // This is done by adding a Get Element Pointer (GEP) before each user. This // function adds the GEP. @@ -307,29 +300,13 @@ void PPCMergeStringPool::replaceUsesWithGEP(GlobalVariable *GlobalToReplace, Indices.push_back(ConstantInt::get(Type::getInt32Ty(*Context), 0)); Indices.push_back(ConstantInt::get(Type::getInt32Ty(*Context), ElementIndex)); - // Need to save a temporary copy of each user list because we remove uses - // as we replace them. - SmallVector Users; - for (User *CurrentUser : GlobalToReplace->users()) -Users.push_back(CurrentUser); - - for (User *CurrentUser : Users) { -// The user was not found so it must have been replaced earlier. -if (!userHasOperand(CurrentUser, GlobalToReplace)) - continue; - -// We cannot replace operands in globals so we ignore those. -if (isa(CurrentUser)) - continue; - -Constant *ConstGEP = ConstantExpr::getInBoundsGetElementPtr( -PooledStructType, GPool, Indices); -LLVM_DEBUG(dbgs() << "Replacing this global:\n"); -LLVM_DEBUG(GlobalToReplace->dump()); -LLVM_DEBUG(dbgs() << "with this:\n"); -LLVM_DEBUG(ConstGEP->dump()); -GlobalToReplace->replaceAllUsesWith(ConstGEP); - } + Constant *ConstGEP = + ConstantExpr::getInBoundsGetElementPtr(PooledStructType, GPool, Indices); + LLVM_DEBUG(dbgs() << "Replacing this global:\n"); + LLVM_DEBUG(GlobalToReplace->dump()); + LLVM_DEBUG(dbgs() << "with this:\n"); + LLVM_DEBUG(ConstGEP->dump()); + GlobalToReplace->replaceAllUsesWith(ConstGEP); } } // namespace diff --git a/llvm/test/CodeGen/PowerPC/mergeable-string-pool-pr92991.ll b/llvm/test/CodeGen/PowerPC/mergeable-string-pool-pr92991.ll new file mode 100644 index 0..4e9c69e5fe4cf --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/mergeable-string-pool-pr92991.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s + +@g = private constant [4 x i32] [i32 122, i32 67, i32 35, i32 56] +@g2 = private constant [1 x i64] [i64 1], align 8 + +define void @test(ptr %p, ptr %p2) { +; CHECK-LABEL: test: +; CHECK: # %bb.0: +; CHECK-NEXT:addis 5, 2, .L__ModuleStringPool@toc@ha +; CHECK-NEXT:addi 5, 5, .L__ModuleStringPool@toc@l +; CHECK-NEXT:addi 6, 5, 12 +; CHECK-NEXT:std 6, 0(3) +; CHECK-NEXT:addi 3, 5, 16 +; CHECK-NEXT:std 3, 0(4) +; CHECK-NEXT:blr + store ptr getelementptr inbounds ([4 x i32], ptr @g, i64 0, i64 1), ptr %p + store ptr getelementptr inbounds ([4 x i32], ptr @g, i64 0, i64 2), ptr %p2 + ret void +} ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] release/18.x: [PPCMergeStringPool] Only replace constant once (#92996) (PR #93442)
https://github.com/llvmbot milestoned https://github.com/llvm/llvm-project/pull/93442 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits