mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
8443f06170
Introduce a pass which statically demotes some helpers from candidates
for inlining:
1) Helpers which are part of SCC on the callgraph.
2) Helpers which contains an `insertvalue`.
3) Helpers which _fail_ the `CriticalArguments` criterion.
A critical argument is defined starting from the critical operand
definition.
A critical operand is either the condition of a `switch` instruction or
the indices of a `getelementptr` instruction.
If the dataflow computing the the operand trace back to a formal
parameter of the function, that parameter will be considered critical
when attempting the inlining of the helper.
In case each condition is satisfied, the `revng.inline.policy` metadata
is attached to the function, so that it can be used at _inline_ time to
take the decision based on the critical arguments constantness.
The metadata is encoded as an `iN` integer with N = `arg_size() + 1`:
the extra most-significant bit is always zero so LLVM's signed-decimal
`iN` printer renders the value positively (avoiding e.g. `!{i2 -2}`).
The (de)serialisation primitives live in `revng/Support/IRHelpers.h`
as `serializeInliningPolicy` / `deserializeInliningPolicy` so the
runtime `revngFunctionIsolation` doesn't need to link the build-time
`revngHelperInliningAnalyses` to read the metadata back.
17 lines
361 B
CMake
17 lines
361 B
CMake
#
|
|
# This file is distributed under the MIT License. See LICENSE.md for details.
|
|
#
|
|
|
|
revng_add_analyses_library_internal(
|
|
revngHelperInliningAnalyses DetectUninlinableHelpers.cpp
|
|
MarkInlineHelpersUpTo.cpp)
|
|
|
|
target_link_libraries(
|
|
revngHelperInliningAnalyses
|
|
revngBasicAnalyses
|
|
revngModel
|
|
revngPipeline
|
|
revngPipes
|
|
revngSupport
|
|
${LLVM_LIBRARIES})
|