diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-02-01 18:23:36 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-02-16 13:48:55 +0100 |
commit | 0765d3824d069f37596bc5a890399099b776c2a0 (patch) | |
tree | f36a482ae8b4bd72454bb3025c60b0f616291a15 /polly | |
parent | [llvm-readobj] - Refactor the code that dumps relocations. (diff) | |
download | llvm-project-0765d3824d069f37596bc5a890399099b776c2a0.tar.gz llvm-project-0765d3824d069f37596bc5a890399099b776c2a0.tar.bz2 llvm-project-0765d3824d069f37596bc5a890399099b776c2a0.zip |
[IRBuilder] Virtualize IRBuilder
Related llvm-dev thread:
http://lists.llvm.org/pipermail/llvm-dev/2020-February/138951.html
This patch moves the IRBuilder from templating over the constant
folder and inserter towards making both of these virtual.
There are a couple of motivations for this:
1. It's not possible to share code between use-sites that use
different IRBuilder folders/inserters (short of templating the code
and moving it into headers).
2. Methods currently defined on IRBuilderBase (which is not templated)
do not use the custom inserter, resulting in subtle bugs (e.g.
incorrect InstCombine worklist management). It would be possible to
move those into the templated IRBuilder, but...
3. The vast majority of the IRBuilder implementation has to live
in the header, because it depends on the template arguments.
4. We have many unnecessary dependencies on IRBuilder.h,
because it is not easy to forward-declare. (Significant parts of
the backend depend on it via TargetLowering.h, for example.)
This patch addresses the issue by making the following changes:
* IRBuilderDefaultInserter::InsertHelper becomes virtual.
IRBuilderBase accepts a reference to it.
* IRBuilderFolder is introduced as a virtual base class. It is
implemented by ConstantFolder (default), NoFolder and TargetFolder.
IRBuilderBase has a reference to this as well.
* All the logic is moved from IRBuilder to IRBuilderBase. This means
that methods can in the future replace their IRBuilder<> & uses
(or other specific IRBuilder types) with IRBuilderBase & and thus
be usable with different IRBuilders.
* The IRBuilder class is now a thin wrapper around IRBuilderBase.
Essentially it only stores the folder and inserter and takes care
of constructing the base builder.
What this patch doesn't do, but should be simple followups after this change:
* Fixing use of the inserter for creation methods originally defined
on IRBuilderBase.
* Replacing IRBuilder<> uses in arguments with IRBuilderBase, where useful.
* Moving code from the IRBuilder header to the source file.
From the user perspective, these changes should be mostly transparent:
The only thing that consumers using a custom inserted may need to do is
inherit from IRBuilderDefaultInserter publicly and mark their InsertHelper
as public.
Differential Revision: https://reviews.llvm.org/D73835
Diffstat (limited to 'polly')
-rw-r--r-- | polly/include/polly/CodeGen/IRBuilder.h | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/polly/include/polly/CodeGen/IRBuilder.h b/polly/include/polly/CodeGen/IRBuilder.h index 8033ffafb7de..0d432039aba1 100644 --- a/polly/include/polly/CodeGen/IRBuilder.h +++ b/polly/include/polly/CodeGen/IRBuilder.h @@ -131,15 +131,14 @@ private: /// /// This is used to add additional items such as e.g. the llvm.loop.parallel /// metadata. -class IRInserter : protected llvm::IRBuilderDefaultInserter { +class IRInserter : public llvm::IRBuilderDefaultInserter { public: IRInserter() = default; IRInserter(class ScopAnnotator &A) : Annotator(&A) {} -protected: void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock *BB, - llvm::BasicBlock::iterator InsertPt) const { + llvm::BasicBlock::iterator InsertPt) const override { llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, BB, InsertPt); if (Annotator) Annotator->annotate(I); |