[buddy] get rid of many recursive algorithms

This patch addresses the BuDDy part of #396,
reported by Florian Renkin and Reed Oei.

* src/kernel.c, src/kernel.h: Declare a bddrecstack and
associated macros.  Resize it when new variable are declared.
* src/cache.h: Add a BddCache_index macro.
* src/bddop.c (not_rec, apply_rec, quant_rec, appquant_rec,
support_rec, ite_rec, compose_rec, restrict_rec, satone_rec,
satoneset_rec): Rewrite using this stack to get rid of the recursion.
This commit is contained in:
Alexandre Duret-Lutz 2020-06-08 22:19:17 +02:00
parent d7b3d05e57
commit 6f76121b89
4 changed files with 856 additions and 520 deletions

View file

@ -43,6 +43,7 @@
#include <limits.h>
#include <setjmp.h>
#include "bddx.h"
#include "cache.h"
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@ -133,6 +134,8 @@ extern int bddreorderdisabled;
extern int bddresized;
extern int bddcachesize;
extern bddCacheStat bddcachestats;
extern int* bddrecstack;
extern int* bddrecstacktop;
/* from reorder.c */
extern int bddreordermethod;
@ -214,6 +217,28 @@ static inline int PUSHREF(int a)
#define READREF(a) *(bddrefstacktop-(a))
#define POPREF(a) bddrefstacktop -= (a)
#define PUSHREF_(a) *(localbddrefstacktop++) = (a)
#define READREF_(a) *(localbddrefstacktop-(a))
#define POPREF_(a) localbddrefstacktop -= (a)
#define PUSHINT_(a) *(localbddrecstacktop++) = (a)
#define PUSH2INT_(a, b) {PUSHINT_(a); PUSHINT_(b);}
#define PUSH3INT_(a, b, c) {PUSHINT_(a); PUSHINT_(b); PUSHINT_(c);}
#define PUSH4INT_(a, b, c, d) {PUSHINT_(a); PUSHINT_(b); PUSHINT_(c); PUSHINT_(d);}
#define POPINT_() *(--localbddrecstacktop)
#define LOCAL_REC_STACKS \
int* restrict localbddrefstacktop = bddrefstacktop; \
int* restrict localbddrecstacktop = bddrecstacktop; \
int* localbddrecstackbot = bddrecstacktop;
#define NONEMPTY_REC_STACK (localbddrecstacktop > localbddrecstackbot)
#define SYNC_REC_STACKS \
bddrefstacktop = localbddrefstacktop; \
bddrecstacktop = localbddrecstacktop;
#define BDDONE 1
#define BDDZERO 0