[RFC] Optimization Remark for derived function / argument attributes

Hello all,

During the compilation process, LLVM automatically derives various attributes about functions and values (for example that a pointer is nonnull, a function is constant, etc) that are used within a translation unit.

I propose adding a pass to LLVM that allows front-ends to output derived attributes. Such a pass would be useful both for developers and end users to debug programs, either learning that an expected attribute was learned, or an unexpected attribute was learned (for example a pointer never being written to).

Evidently the following might not be the final interface, but one could imagine something like the following:

$ ./clang foobar.c -g -Rannotations -O3

foobar.c:2:1: remark: derived following attributes for function f: fn_attr(“norecurse”) fn_attr(“nounwind”) fn_attr(“readonly”) arg_attr(0, “nocapture”) arg_attr(0, “readonly”) [-Rannotations]

double f(double* a) {

foobar.c:

double f(double* a) {

return a[0];

}

A work in progress patch implementing such an optimization remark is available here: https://reviews.llvm.org/D65169

Cheers,

Billy Moses

Hi Billy,

Hello all,

During the compilation process, LLVM automatically derives various attributes about functions and values (for example that a pointer is nonnull, a function is constant, etc) that are used within a translation unit.

I propose adding a pass to LLVM that allows front-ends to output derived attributes. Such a pass would be useful both for developers and end users to debug programs, either learning that an expected attribute was learned, or an unexpected attribute was learned (for example a pointer never being written to).

This sounds like a good idea! Would adding new optimization remarks to passes that modify the attributes work? For example, we could emit an “analysis” remark in FunctionAttrs::setDoesNotRecurse.

Evidently the following might not be the final interface, but one could imagine something like the following:

$ ./clang foobar.c -g -Rannotations -O3
foobar.c:2:1: remark: derived following attributes for function f: fn_attr(“norecurse”) fn_attr(“nounwind”) fn_attr(“readonly”) arg_attr(0, “nocapture”) arg_attr(0, “readonly”) [-Rannotations]
double f(double* a) {

foobar.c:

double f(double* a) {
return a[0];
}

If this is emitted as an analysis remark as suggested above, clang -Rpass-analysis=functionattrs could display the remarks in a similar way.

This has also the advantage that it can be serialized to a file using -fsave-optimization-record without any extra work involved.

Cheers,

Hi Francis,

I’m wondering if it makes more sense to have a single pass to emit attributes rather than making sure that this is emitted in all passes that could modify arguments. If memory serves there’s more than just FunctionAttrs.

Cheers,
Billy

Hi,