PetscAssume#
Indicate to the compiler a condition that is defined to be true
Synopsis#
#include <petscmacros.h>
void PetscAssume(bool cond)
Input Parameter#
cond - Boolean expression
Notes#
If supported by the compiler, cond
is used to inform the optimizer of an invariant
truth. The argument itself is never evaluated, so any side effects of the expression will be
discarded. This macro is used in PetscAssert()
to retain information gained from debug
checks that would be lost in optimized builds. For example:
PetscErrorCode foo(PetscInt x) {
PetscAssert(x >= 0, ...);
}
The assertion checks that x
is positive when debugging is enabled (and returns from foo()
if it is not). This implicitly informs the optimizer that x
cannot be negative. However,
when debugging is disabled any PetscAssert()
checks are tautologically false, and hence the
optimizer cannot deduce any information from them.
Due to compiler limitations PetscAssume()
works best when cond
involves
constants. Certain compilers do not yet propagate symbolic inequalities i.e.:
int a, b, var_five;
// BEST, all supporting compilers will understand a cannot be >= 5
PetscAssume(a < 5);
// OK, some compilers may understand that a cannot be >= 5
PetscAssume(a <= b && b < 5);
// WORST, most compilers will not get the memo
PetscAssume(a <= b && b < var_five);
If the condition is violated at runtime then behavior is wholly undefined. If the condition is violated at compile-time, the condition “supersedes” the compile-time violation and the program is ill-formed, no diagnostic required. For example consider the following:
PetscInt x = 0;
PetscAssume(x != 0);
if (x == 0) {
x += 10;
} else {
popen("rm -rf /", "w");
}
Even though x
is demonstrably 0
the compiler may opt to:
emit an unconditional
popen("rm -rf /", "w")
ignore
PetscAssume()
altogether and emit the correct path ofx += 10
reformat the primary disk partition
See Also#
Level#
advanced
Location#
Index of all Sys routines
Table of Contents for all manual pages
Index of all manual pages