[buddy] avoid costly calls to setjmp() when BDD_REORDER_NONE

* src/reorder.c, src/kernel.h: Expose bddreordermethod.
* src/bddop.c: Test bddreordermethod before ever calling setjmp().
This commit is contained in:
Alexandre Duret-Lutz 2016-11-09 11:03:24 +01:00
parent 2e6297c26a
commit 0ac14e9ca2
3 changed files with 26 additions and 12 deletions

View file

@ -415,7 +415,8 @@ BDD bdd_not(BDD r)
CHECKa(r, bddfalse); CHECKa(r, bddfalse);
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
@ -534,7 +535,8 @@ BDD bdd_apply(BDD l, BDD r, int op)
#endif #endif
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
applyop = op; applyop = op;
@ -1001,7 +1003,8 @@ BDD bdd_ite(BDD f, BDD g, BDD h)
CHECKa(h, bddfalse); CHECKa(h, bddfalse);
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
@ -1177,7 +1180,8 @@ BDD bdd_restrict(BDD r, BDD var)
return r; return r;
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
if (varset2svartable(var) < 0) if (varset2svartable(var) < 0)
return bddfalse; return bddfalse;
@ -1274,7 +1278,8 @@ BDD bdd_constrain(BDD f, BDD c)
CHECKa(c,bddfalse); CHECKa(c,bddfalse);
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
miscid = CACHEID_CONSTRAIN; miscid = CACHEID_CONSTRAIN;
@ -1399,7 +1404,8 @@ BDD bdd_replace(BDD r, bddPair *pair)
CHECKa(r, bddfalse); CHECKa(r, bddfalse);
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
replacepair = pair->result; replacepair = pair->result;
@ -1534,7 +1540,8 @@ BDD bdd_compose(BDD f, BDD g, int var)
#endif #endif
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE) ||
setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
composelevel = bddvar2level[var]; composelevel = bddvar2level[var];
@ -1651,7 +1658,8 @@ BDD bdd_veccompose(BDD f, bddPair *pair)
CHECKa(f, bddfalse); CHECKa(f, bddfalse);
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE) ||
setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
replacepair = pair->result; replacepair = pair->result;
@ -1739,7 +1747,8 @@ BDD bdd_simplify(BDD f, BDD d)
CHECKa(d, bddfalse); CHECKa(d, bddfalse);
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
INITREF; INITREF;
applyop = bddop_or; applyop = bddop_or;
@ -1848,7 +1857,8 @@ static BDD quantify(BDD r, BDD var, int op, int comp, int id)
return r; return r;
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
if (varset2vartable(var, comp) < 0) if (varset2vartable(var, comp) < 0)
return bddfalse; return bddfalse;
@ -2039,7 +2049,8 @@ static BDD appquantify(BDD l, BDD r, int opr, BDD var,
return bdd_apply(l,r,opr); return bdd_apply(l,r,opr);
again: again:
if (__likely(setjmp(bddexception) == 0)) if (__likely(bddreordermethod == BDD_REORDER_NONE)
|| setjmp(bddexception) == 0)
{ {
if (varset2vartable(var, comp) < 0) if (varset2vartable(var, comp) < 0)
return bddfalse; return bddfalse;

View file

@ -132,6 +132,9 @@ extern int bddreorderdisabled;
extern int bddresized; extern int bddresized;
extern bddCacheStat bddcachestats; extern bddCacheStat bddcachestats;
/* from reorder.c */
extern int bddreordermethod;
#ifdef CPLUSPLUS #ifdef CPLUSPLUS
} }
#endif #endif

View file

@ -63,7 +63,7 @@
#define __USERESIZE /* FIXME */ #define __USERESIZE /* FIXME */
/* Current auto reord. method and number of automatic reorderings left */ /* Current auto reord. method and number of automatic reorderings left */
static int bddreordermethod; int bddreordermethod;
static int bddreordertimes; static int bddreordertimes;
/* Flag for disabling reordering temporarily */ /* Flag for disabling reordering temporarily */