Each procedure can specify a set of specializations that is triggered by the properties assigned to the input objects. The specializations modify the call site in the application code. Like the analyze annotations, each specialization is guarded by a condition, but these conditions are evaluated after abstract interpretation is complete. Unlike the analyze annotations, these conditions can refer to any combination of properties, and thus must provide the specific property name. The right side of the => specifies either a literal code replacement, indicated by the replace keyword, or that the library call should simply be removed as indicated by the remove keyword.
The PLAPACK annotations in Figure show three
specializations for the matrix multiply procedure. The first causes the call
to be removed whenever either of the inputs A or B refers
to empty views. The second replaces the parallel matrix multiply routine
with a local version if both A and B refer to local views.
Finally, if the data indexed by A is upper-triangular, we can
replace the general matrix multiply call with a call to a special triangular
form that requires half the number of floating point operations.