Welcome prospective Google Summer of Code 2019 Students! This document is your starting point to finding interesting and important projects for LLVM, Clang, and other related sub-projects. This list of projects is not only developed for Google Summer of Code, but open projects that really need developers to work on and are very beneficial for the LLVM community.
We encourage you to look through this list and see which projects excite you and match well with your skill set. We also invite proposals not on this list. You must propose your idea to the LLVM community through our developers' mailing list (llvm-dev@lists.llvm.org or specific subproject mailing list). Feedback from the community is a requirement for your proposal to be considered and hopefully accepted.
The LLVM project has participated in Google Summer of Code for several years and has had some very successful projects. We hope that this year is no different and look forward to hearing your proposals. For information on how to submit a proposal, please visit the Google Summer of Code main website.
Description of the project: Adding Debug Info (compiling with `clang -g`) shouldn't change the generated code at all. Unfortunately we have bugs. These are usually not too hard to fix and a good way to discover new part of the codebase! We suggest building object files both ways and disassembling the text sections, which will give cleaner diffs than comparing .s files.
Expected results: Reduced test cases, bug reports with analysis (e.g., which pass is responsible), possibly patches.
Confirmed Mentor: Paul Robinson
Desirable skills: Intermediate knowledge of C++, some familiarity with x86 or ARM instruction set.
Description of the project: LLVM functions, as well as arguments and other entities, can be tagged with several attributes such as the function only reads memory, or the function cannot throw exceptions. These attributes are used by many optimizations when deciding if a particular transformation is valid or not. Functions attributes can be either given by the frontend or be inferred by LLVM.
The goal of this project is to improve/replace the current function attributes inference algorithms, and to infer attributes that are not inferred right now. This will be accomplished via intra- and/or inter-procedural analyses.
Background and further reading See this email for a list of opportunities for improvement, this email thread for a description of the current implementation, its problems, and a alternative approach. Finally, find a (currently still rough) prototype of the proposed alternative, which would be the starting point for this project, here.
Confirmed Mentor: Johannes Doerfert, Nuno Lopes
Desirable skills: Intermediate knowledge of C++ and familiarity with static analysis/abstract interpretation.
Description of the project: Binary utilities (aka binutils) are a set of tools used to inspect and analyze generated binary files. We have recently developed new versions of these in the LLVM project so we can remove the need for their GNU equivalents. The base functionality is done, but there are many missing features. In this project you will be contributing to the LLVM binutils, adding these additional features, in tools such as llvm-readobj, llvm-objdump and llvm-objcopy. This will require you to become an expert in the specification details for various object file formats, such as ELF and COFF.
Expected Results: Patch contributions to the LLVM binary utilities to improve the quality of existing features and to add missing functionality.
Confirmed Mentor: James Henderson, Jordan Rupprecht
Desirable skills: Intermediate knowledge of C++.
Description of the project: When instantiating a template, the template arguments are canonicalized before being substituted into the template pattern. Clang does not preserve type sugar when subsequently accessing members of the instantiation.
std::vector<std::string> vs;
int n = vs.front(); // bad diagnostic: [...] aka 'std::basic_string<char>' [...]
template<typename T> struct Id { typedef T type; };
Id<size_t>::type // just 'unsigned long', 'size_t' sugar has been lost
Clang should "re-sugar" the type when performing member access on a class
template specialization, based on the type sugar of the accessed
specialization. The type of vs.front() should be std::string, not
std::basic_string<char, [...]>.
Expected results: Diagnostics preserve type sugar even when accessing members of a template specialization. T<unsigned long> and T<size_t> are still the same type and the same template instantiation, but T<unsigned long>::type single-step desugars to 'unsigned long' and T<size_t>::type single-step desugars to 'size_t'.
Confirmed Mentor: Vassil Vassilev, Richard Smith
Desirable skills: Good knowledge of clang API, clang's AST, intermediate knowledge of C++.
Description of the project: Clang contains an ASTImporter which allows moving declarations and statements from one Clang AST to another. This is for example used for static analysis across translation units and in LLDB's expression evaluator.
The current ASTImporter works as intended when moving simple C code from one AST to another. However, more complicated declarations such as C++'s OOP features and templates are not fully implemented and can cause crashes or invalid AST nodes. The bug reports related to these crashes are often filed against LLDB's expression evaluator and are rarely submited with a minimal reproducer. This makes improving ASTImporter a time-consuming and tedious task.
This project is about writing a fuzzer to proactively discover these ASTImporter bugs and provide minimal reproducers which make understanding and fixing the underlying bug easier.
A possible implementation of such a fuzzer and driver could look like this:
Confirmed Mentor: Raphael Isemann, Shafik Yaghmour
Desirable skills: Intermediate knowledge of C++.
Description of the project: Clang has a newly implemented autocompletion feature which details can be found at LLVM blog. We would like to improve this by adding more flags to autocompletion, supporting more shells (currently it supports only bash) and exporting this feature to other projects such as llvm-opt. Accepted student will be working on Clang Driver, LLVM Options and shell scripts.
Expected Results: Autocompletion working on bash and zsh, support llvm-opt options.
Confirmed Mentor: Yuka Takahashi and Vassil Vassilev
Desirable skills: Intermediate knowledge of C++ and shell scripting
Description of the project: The idea is to improve the Clang Static Analyzer so that it is useful for developers who work on Clang and LLVM themselves, as well as on other LLVM-based projects, like Swift. LLVM makes use of C++ language features that the Static Analyzer has not yet been taught to understand. The analyzer also has false positives on some C++ idioms commonly used in the LLVM codebase.
The Static Analyzer is already useful for a variety of projects, but in order to reach the "use your own tools" checkpoint, we'll have to classify, debug, and, ideally, eliminate the most common sources of false positives on our code. It would be the best to fix false positives by improving the Static Analyzer itself, but it may also sometimes be feasible to add a few suppressions (such as assertions) within the LLVM source code so that it is easier for both humans and the Analyzer to understand what's going on. And, of course, it would be great to report and maybe even fix the true positives that we manage to find!
Expected results: Results produced by the Analyzer on LLVM itself should become more or less correct: warnings are useful, false alarms are gone. This lets more and more LLVM developers adopt the Static Analyzer in their daily lives or CI workflows.
Confirmed Mentor: Artem Dergachev, Ravi Kandhadai Madhavan
Desirable skills: Intermediate knowledge of C++.
Background and motivation: During the compilation of a piece of code, LLVM derives various facts that are only used while the respective translation unit (TU), or LLVM module, is processed. This holds for standard compilation but also link-time-optimization (LTO) in which the module is (partially) merged with others, that are part of the same project, at link time. In either scenario there are drawbacks: In single TU compilation, the derived information is not accessible to other TUs, which generally leads to performance loss in the presence of cross TU accesses or calls. In LTO-mode, only the parts build together in LTO-mode, or distributed in LTO-mode, will benefit from cross TU optimizations. This means for example that pre-build (proprietary) third-party libraries are precluded. Any LTO approach, including thin-LTO, will additionally come with a non-trivial compile time investment.
Description of the project: In this project we propose to expose the LLVM derived facts to the outside world by annotating the respective declarations in the source, mostly header, files. These annotations can vary in their expressiveness and compatibility with the existing base language annotations but they should always allow subsequent compilations, which include the annotated source files, to produce better code in the presence of cross TU accesses and calls.
Expected results: A prototype implementation that can generate annotated source code based on LLVM-IR attributes. Additionally, a comparison of this optimization approach to single TU, thin-LTO, and LTO compilation, with regards to compile time, memory consumption, and execution time.
Confirmed Mentor: Johannes Doerfert, Brian Homerding
Desirable skills: Good knowledge of C and C++ semantics, C++ coding experience
Decription: Clang diagnostics (warnings and errors) issues to the programmer are a critical feature of the compiler. Great diagnostics can have a signifiant impact on the user experience of the compiler and increase their productivity.
Recent improvements in GCC 9.0 show that there is significant headroom to improve diagnostics (and user interactions in general). It would be a very impactful project to survey and identify all the possible improvements to clang on this topic, and start resigning the next generation of our diagnostics.
Desirable skills: C++ coding experience
Google Summer of Code 2018 contributed a lot to the LLVM project. Below is a list of some projects that were offerred during GSoC 2018. For the list of accepted and completed projects, please take a look into Google Summer of Code website.
Description of the project: After instruction selection LLVM uses the MI (Machine Instruction) representation for programs. We recently added support for reading and writing this representation to disk (http://llvm.org/docs/MIRLangRef.html). Usage of this format for writing tests is growing and so is the desire to improve the format, tools and workflow. Possible projects:
Confirmed Mentor: Matthias Braun
Desirable skills: Intermediate knowledge of C++.
Description of the project: Debugging optimized code can be frustrating. Variables may appear as "<value optimized out>" in the debugger, or may not appear at all. Line numbers in stack traces may disappear, or worse, become inaccurate. To improve the situation, we have to teach more LLVM optimization passes how to preserve debug info. The primary focus will be on mid-level IR passes which fail to pass verification by the Debugify utility. This utility can identify passes which drop debug info in a targeted way and can simplify test case generation.
Expected Results:This project has two goals. Initially, the student will gather metrics on debug info loss for individual llvm passes. This will let us measure subsequent improvements. The second goal is to incrementally fix as many debug info loss bugs as possible, with a focus on areas of the compiler which are the hottest.
Confirmed Mentor: Vedant Kumar and Davide Italiano
Desirable skills: Intermediate knowledge of C++.
Description of the project: The llvm project has a lot of tools that can be used to inspect binaries, as any other toolchain project does. Many people are accustomed to existing tools and so having a command line compatible shell and we'd like to make that easy for them. Bonus points for producing similar output so that automated tools can continue to work reliably.
Expected Results:This project has one goal - produce binary tools that are drop in compatible with GNU binutils. The student will be expected to focus on a single tool at a time so that we can count each one as "done" as much as possible.
Confirmed Mentor: Eric Christopher and Sterling Augustine
Desirable skills: Intermediate knowledge of C++.
Description of the project: Dominance relation is used widely in many compiler analyses and optimizations. LLVM provides an implementation of the (Semi-NCA) Depth Based Search algorithm to incrementally update Dominator and PostDominator Trees. It it possible to use it directly or through a lazy updater object -- DeferredDominance. The current API is fragmented and different analyzes, transforms, and utilities (e.g. Local.cpp, LoopUnroll.cpp) have to decide how to perform incremental updates.
The fix would be to design and implement a new class for abstracting away how tree updates are performed (eagerly or lazily) and which trees are actually being updated (none, only DomTree, only PostDomTree, both). With this, performing faster incremental updates will become possible by first updating DomTree, and then using the result to prune unnecessary updates to PostDomTree.
Expected Results:
Confirmed Mentor: Jakub Kuderski, Tobias Grosser (?)
Desirable skills: Intermediate knowledge of C++. Familiarity with basic tree/graph algorithms and data structures.
Description of the project: Just as LLVM is a library to build compilers, LLDB is a library to build debuggers. LLDB vends a stable, public SB API. Due to historic reasons the LLDB command line interface is currently implemented on top of LLDB's private API and it duplicates a lot of functionality that is already implemented in the public API. Rewriting LLDB's command line interface on top of the public API would simplify the implementation, eliminate duplicate code, and most importantly reduce the testing surface.
This work will also provide an opportunity to clean up the SB API of commands that have accrued too many overloads over time and convert them to make use of option classes to both gather up all the variants and also future-proof the APIs.
Confirmed Mentor:Adrian Prantl and Jim Ingham
Desirable skills: Intermediate knowledge of C++.
Description of the project: LLDB's data formatters allow it to pretty-print objects such as std::vector (from the C++ standard library), or String (from the Swift standard library). These data formatters are implemented in C++ and reside within the debugger, but the data structures are defined in other projects. This means that when the data structures change, lldb's data formatters may not be updated in sync. This also means that it's difficult for projects to define and test custom data formatters for special kinds of objects.
Expected results: The goal of this project would be to define a DSL which makes it possible to implement lldb data formatters for standard C++ containers. These formatters would be moved into libc++ and tested there.
Confirmed Mentor: Vedant Kumar and Davide Italiano
Desirable skills: Intermediate knowledge of C++.
Description of the project: One of the tensions in the testsuite is that spinning up a process and getting it to some point is not a cheap operation, so you'd like to do a bunch of tests when you get there. But the current testsuite bails at the first failure, so you don't want to do many tests since the failure of one fails all the others. On the other hand, there are some individual test assertions where the failure of the assertion should cause the whole test to fail. For example, if you fail to stop at a breakpoint where you want to check some variable values, then the whole test should fail. But if your test then wants to check the value of five independent locals, it should be able to do all five, and then report how many of the five variable assertions failed. We could do this by adding Start and End markers for a batch of tests, do all the tests in the batch without failing the whole test, and then report the error and fail the whole test if appropriate. There might also be a nice way to do this in Python using scoped objects for the test sections.
Confirmed Mentor: Jim Ingham
Desirable skills: Intermediate knowledge of Python.
Description of the project: Clang-doc is a new tool for generating documentation for C/C++ code with a modular and extensible approach. It aims to simplify the overhead of generating documentation, leveraging the clang AST to produce results from existing comments and code. The main part of the tool produces an intermediate representation of the docs, which is consumed by a generator targeting a specific output format. Current and in-progress generators emit documentation in YAML and Markdown formats, but we’d like to have another one for HTML format.
Confirmed Mentor: Julie Hockett
Desirable skills: Intermediate knowledge of C++.
Google Summer of Code 2017 contributed a lot to the LLVM project. Below is a list of some projects that were offerred during GSoC 2017. For the list of accepted and completed projects, please take a look into Google Summer of Code website.
Description of the project:
Description of the project: The optimizer is 25-30% slower when debug info are enabled, it'd be nice to track all the places where we don't do a good job about ignoring them!
Description of the project: ThinLTO is a cool new technology to perform Link-Time Optimization (see this talk for more info). It is fairly new and there are multiple improvements about cross-module optimizations that can be made there.
Description of the project: Adding Debug Info (compiling with `clang -g`) shouldn't change the generated code at all. Unfortunately we have bugs… These are usually not too hard to fix and a good way to discover new part of the codebase! A starting point could be the test-suite. We suggest building object files both ways and disassembling the text sections, which will give cleaner diffs than comparing .s files.
Description of the project:
Description of the project: See this talk for a starting point. Please take a look at the list of enhancements and bugs in bugzilla.
Description of the project: Smarter way of dumping LLVM ir with -emit-after-all - dump only if it differs from last pass. Maybe small color the IR?
Description of the project: After instruction selection LLVM uses the MI (Machine Instruction) representation for programs. We recently added support for reading and writing this representation to disk (http://llvm.org/docs/MIRLangRef.html). Usage of this format for writing tests is growing and so is the desire to improve the format, tools and workflow. Improvements would be welcome:
Confirmed Mentor: Matthias Braun
Description of the project: When instantiating a template, the template arguments are canonicalized before being substituted into the template pattern. Clang does not preserve type sugar when subsequently accessing members of the instantiation.
std::vector<std::string> vs;
int n = vs.front(); // bad diagnostic: [...] aka 'std::basic_string<char>' [...]
template<typename T> struct Id { typedef T type; };
Id<size_t>::type // just 'unsigned long', 'size_t' sugar has been lost
Clang should "re-sugar" the type when performing member access on a class
template specialization, based on the type sugar of the accessed
specialization. The type of vs.front() should be std::string, not
std::basic_string<char, [...]>.
Expected results: Diagnostics preserve type sugar even when accessing members of a template specialization. T<unsigned long> and T<size_t> are still the same type and the same template instantiation, but T<unsigned long>::type single-step desugars to 'unsigned long' and T<size_t>::type single-step desugars to 'size_t'.
Confirmed Mentor: Vassil Vassilev, Richard Smith
Desirable skills: Good knowledge of clang API, clang's AST, intermediate knowledge of C++.
Description of the project: Every developer has to interact with diff tools daily. The algorithms are usually based on detecting "longest common subsequences", which is agnostic to the file type content. A tool that would understand the structure of the code may provide a better diff experience by being robust against, for example, clang-format changes.
Confirmed Mentor: Mehdi Amini
Description of the project: Find dereference of pointer before checking for nullptr, like:
Int * p = foo();
*p = 42;
If (p != nullptr) { // p != nullptr is considered as always true
}
If (!p) { // !p is considered as always false
}
Confirmed Mentor: Alexander Kornienko, Piotr Padlewski
Description of the project:
Implement a path-sensitive checker that warns if virtual calls are made from
constructors and destructors, which is not valid in case of pure virtual
calls and could be a sign of user error in non-pure calls.
The current virtual calls checker, implemented in VirtualCallChecker.cpp,
needs to be re-implemented in a path-sensitive way. The lack of
path-sensitive reasoning may result in false positives in the
inter-procedural mode, which is disabled now for that reason.
The false positives could happen when a called function uses a member
variable flag to track whether initialization is complete and relies on the
flag to ensure that the virtual member function is not called during
initialization. Further, the path diagnostic should be used to highlight
both the virtual call and the path from the constructor. Last, we will need
to evaluate if the warning should be issued for both calls to pure virtual
functions (which is always an error) and non-pure virtual functions (which
is more of a code smell and may be a false positive).
Confirmed Mentor: Anna Zaks
Description of the project: Enhance the clang static analyzer by adding models of C++11 and C11 atomic operations, such as std::atomic_compare_exchange_*. Currently, these operations are being treated opaquely, which results in loss of precision when analyzing the code that uses these instructions. To address the problem, one would need to programmatically construct AST that simulates these APIs to the BodyFarm of the analyzer. BodyFarm is the API used for modeling system APIs. Finally, the work would also include writing tests for the various APIs and checking that the analyzer correctly models atomics.
Confirmed Mentor: Anna Zaks
Description of the project:
Many of the projects in compiler-rt are only supported on Linux.
Here are some examples: CFI, DFSan, XSan, LSan, XRay. Porting any of them
to other platforms, for example, Mac OS, would be great!
Confirmed Mentor: Kuba Mracek, Anna Zaks
Description of the project: The goal for the project is trying to improve the layout/performances of the generated executable. The primary object format considered for the project is ELF but this can be extended to other object formats. The project will touch both LLVM and lld.
Possible extension: Xray can be used to provide data (it's unclear whether this is feasible easily, see David's comment in [3]).
Confirmed Mentor: Davide Italiano
Description of the project: Even though Polly's compile time is today not a lot higher than other non-trial IR passes, the need to version code in many situations and the lack of static knowledge about loop iteration counts, hotness of functions, and parameter requires Polly to be significantly more conservative than it would need to be. The goal of this project is to connect Polly with the LLVM profiling infrastructure to exploit profiling information to decide: 1) when to run Polly, 2) how aggressive to version the code, 3) which code version to emit, and 4) which assumptions to take. As a result, Polly should can in profile guided builds become more aggressive, while still having a lower compile time and code size impact.
Confirmed Mentor: Tobias Grosser
This document is meant to be a sort of "big TODO list" for LLVM. Each project in this document is something that would be useful for LLVM to have, and would also be a great way to get familiar with the system. Some of these projects are small and self-contained, which may be implemented in a couple of days, others are larger. Several of these projects may lead to interesting research projects in their own right. In any case, we welcome all contributions.
If you are thinking about tackling one of these projects, please send a mail to the LLVM Developer's mailing list, so that we know the project is being worked on. Additionally this is a good way to get more information about a specific project or to suggest other projects to add to this page.
The projects in this page are open-ended. More specific projects are filed as unassigned enhancements in the LLVM bug tracker. See the list of currently outstanding issues if you wish to help improve LLVM.
In addition to hacking on the main LLVM project, LLVM has several subprojects, including Clang and others. If you are interested in working on these, please see their "Open projects" page:
Improvements to the current infrastructure are always very welcome and tend to be fairly straight-forward to implement. Here are some of the key areas that can use improvement...
Currently, both Clang and LLVM have a separate target description infrastructure, with some features duplicated, others "shared" (in the sense that Clang has to create a full LLVM target description to query specific information).
This separation has grown in parallel, since in the beginning they were quite different and served disparate purposes. But as the compiler evolved, more and more features had to be shared between the two so that the compiler would behave properly. An example is when targets have default features on speficic configurations that don't have flags for. If the back-end has a different "default" behaviour than the front-end and the latter has no way of enforcing behaviour, it won't work.
An alternative would be to create flags for all little quirks, but first, Clang is not the only front-end or tool that uses LLVM's middle/back ends, and second, that's what "default behaviour" is there for, so we'd be missing the point.
Several ideas have been floating around to fix the Clang driver WRT recognizing architectures, features and so on (table-gen it, user-specific configuration files, etc) but none of them touch the critical issue: sharing that information with the back-end.
Recently, the idea to factor out the target description infrastructure from both Clang and LLVM into its own library that both use, has been floating around. This would make sure that all defaults, flags and behaviour are shared, but would also reduce the complexity (and thus the cost of maintenance) a lot. That would also allow all tools (lli, llc, lld, lldb, etc) to have the same behaviour across the board.
The main challenges are:
The LLVM bug tracker occasionally has "code-cleanup" bugs filed in it. Taking one of these and fixing it is a good way to get your feet wet in the LLVM code and discover how some of its components work. Some of these include some major IR redesign work, which is high-impact because it can simplify a lot of things in the optimizer.
Some specific ones that would be great to have:
Additionally, there are performance improvements in LLVM that need to get fixed. These are marked with the slow-compile keyword. Use this Bugzilla query to find them.
The llvm-test testsuite is a large collection of programs we use for nightly testing of generated code performance, compile times, correctness, etc. Having a large testsuite gives us a lot of coverage of programs and enables us to spot and improve any problem areas in the compiler.
One extremely useful task, which does not require in-depth knowledge of compilers, would be to extend our testsuite to include new programs and benchmarks. In particular, we are interested in cpu-intensive programs that have few library dependencies, produce some output that can be used for correctness testing, and that are redistributable in source form. Many different programs are suitable, for example, see this list for some potential candidates.
We are always looking for new testcases and benchmarks for use with LLVM. In particular, it is useful to try compiling your favorite C source code with LLVM. If it doesn't compile, try to figure out why or report it to the llvm-bugs list. If you get the program to compile, it would be extremely useful to convert the build system to be compatible with the LLVM Programs testsuite so that we can check it into SVN and the automated tester can use it to track progress of the compiler.
When testing a code, try running it with a variety of optimizations, and with all the back-ends: CBE, llc, and lli.
Find benchmarks either using our test results or on your own, where LLVM code generators do not produce optimal code or where another compiler produces better code. Try to minimize the test case that demonstrates the issue. Then, either submit a bug with your testcase and the code that LLVM produces vs. the code that it should produce, or even better, see if you can improve the code generator and submit a patch. The basic idea is that it's generally quite easy for us to fix performance problems if we know about them, but we generally don't have the resources to go finding out why performance is bad.
The LNT perf database has some nice features like detect moving average, standard deviations, variations, etc. But the report page give too much emphasis on the individual variation (where noise can be higher than signal), eg. this case.
The first part of the project would be to create an analysis tool that would track moving averages and report:
The second part would be to create a web page which would show all related benchmarks (possibly configurable, like a dashboard) and show the basic statistics with red/yellow/green colour codes to show status and links to more detailed analysis of each benchmark.
A possible third part would be to be able to automatically cross reference different builds, so that if you group them by architecture/compiler/number of CPUs, this automated tool would understand that the changes are more common to one particular group.
The LLVM Coverage Report has a nice interface to show what source lines are covered by the tests, but it doesn't mentions which tests, which revision and what architecture is covered.
A project to renovate LCOV would involve:
Another idea is to enable the test suite to run all built backends, not only the host architecture, so that coverage report can be built in a fast machine and have one report per commit without needing to update the buildbots.
Sometimes creating new things is more fun than improving existing things. These projects tend to be more involved and perhaps require more work, but can also be very rewarding.
Many proposed extensions and improvements to LLVM core are awaiting design and implementation.
We have a strong base for development of both pointer analysis based optimizations as well as pointer analyses themselves. We want to take advantage of this:
for ()
x += sqrt(loopinvariant);
We'd like to transform this into:
t = sqrt(loopinvariant);
for ()
x += t;
This transformation is safe, because the value of errno isn't otherwise changed in the loop and the exit value of errno from the loop is the same. We currently can't do this, because sqrt clobbers errno, so it isn't "readonly" or "readnone" and we don't have a good way to model this.
The important part of this project is figuring out how to describe errno in the optimizer: each libc #defines errno to something different it seems. Maybe the solution is to have a __builtin_errno_addr() or something and change sys headers to use it.
We now have a unified infrastructure for writing profile-guided transformations, which will work either at offline-compile-time or in the JIT, but we don't have many transformations. We would welcome new profile-guided transformations as well as improvements to the current profiling system.
Ideas for profile-guided transformations:
Improvements to the existing support:
LLVM aggressively optimizes for performance, but does not yet optimize for code size. With a new ARM backend, there is increasing interest in using LLVM for embedded systems where code size is more of an issue.
Someone interested in working on implementing code compaction in LLVM might want to read this article, describing using link-time optimizations for code size optimization.
It would seem that operating on LLVM code would save a lot of time because its semantics are much simpler than x86. The cost of operating on LLVM is that target-specific tricks would be missed.
The outcome would be a new LLVM pass that subsumes at least the instruction combiner, and probably a few other passes as well. Benefits would include not missing cases missed by the current combiner and also more easily adapting to changes in the LLVM IR.
All previous superoptimizers have worked on linear sequences of code. It would seem much better to operate on small subgraphs of the program dependency graph.
In addition to projects that enhance the existing LLVM infrastructure, there are projects that improve software that uses, but is not included with, the LLVM compiler infrastructure. These projects include open-source software projects and research projects that use LLVM. Like projects that enhance the core LLVM infrastructure, these projects are often challenging and rewarding.
At least one project (and probably more) needs to use analysis information (such as call graph analysis) from within a MachineFunctionPass, however, most analysis passes operate at the LLVM IR level. In some cases, a value (e.g., a function pointer) cannot be mapped from the MachineInstr level back to the LLVM IR level reliably, making the use of existing LLVM analysis passes from within a MachineFunctionPass impossible (or at least brittle).
This project is to encode analysis information from the LLVM IR level into the MachineInstr IR when it is generated so that it is available to a MachineFunctionPass. The exemplar is call graph analysis (useful for control-flow integrity instrumentation, analysis of code reuse defenses, and gadget compilers); however, other LLVM analyses may be useful.
Implement an on-demand function relocator in the LLVM JIT. This can help improve code locality using runtime profiling information. The idea is to use a relocation table for every function. The relocation entries need to be updated upon every function relocation (take a look at this article). A (per-function) basic block reordering would be a useful extension.
The goal of this project is to implement better data layout optimizations using the model of reference affinity. This paper provides some background information.
Slimmer is a prototype tool, built using LLVM, that uses dynamic analysis to find potential performance bugs in programs. Development on Slimmer started during Google Summer of Code in 2015 and resulted in an initial prototype, but evaluation of the prototype and improvements to make it portable and robust are still needed. This project would have a student pick up and finish the Slimmer work. The source code of Slimmer and its current documentation can be found at its Github web page.