If-conversion optimization
The instruction selection pass has been extended with an if-conversion optimization.
In certain circumstances, the conditional operator ?:
, the logical operators
&&
and ||
, and if/then/else statements are converted
into "select" operations, which in turn can be compiled down to branchless instruction
sequences if the target architecture supports them.
The conversion only applies to constructs of the form:
- cond ? a1 : a2
- a1 && a2
- a1 || a2
- if (cond) { x = a1; } else { x = a2; }
- if (cond) { x = a1; }
- if (cond) { /*skip*/; } else { x = a2; }
where a1
and a2
are "safe" expressions,
containing no operations that can fail at run-time, such as memory
loads or integer divisions.
A heuristic controls when the optimization occurs, and the new command line option
-Obranchless
enforces that it is always applied. The optimization
is controlled by the flag -f(no)if-conversion
.
Improved built-in functions
__builtin_bswap64
is now available for all backends.
- CompCert now features a mechanism to specify formal semantics
for built-in functions and run-time functions, enabling optimizations
of calls to those. The following built-in functions now have formal semantics:
- __builtin_sel
- __builtin_fabs
- __builtin_fsqrt
- __builtin_bswap16
- __builtin_bswap
- __builtin_bswap32
- __builtin_bswap64
New diagnostics
- New diagnostic for multiple unnamed void parameters.
- New diagnostic for wrong parameters of calls of unprototyped functions.
- New diagnostic
non-linear-cond-expr
that generates a diagnostic
for conditional expressions that may not be transformed by if-conversion.
Other improvements
- Improved constant propagation for 64-bit PowerPCs.
- New tracing option for clightgen to dump the pre-processed source code.
- New predefined macros for checking the CompCert version and build number.
Fixes
- Fixed normalization of switch expression in clightgen.
- The inline optimization is now also disabled if
-O0
is specified.