Commit a32ccd64 authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

[buddy] slight optimization of bdd_implies

* src/bddop.c: Avoid the first recursion when it is obvious that the
second will fail.
parent 41866b37
......@@ -931,15 +931,30 @@ int bdd_implies(BDD l, BDD r)
if (LEVEL(l) == LEVEL(r))
{
res = bdd_implies(LOW(l), LOW(r)) && bdd_implies(HIGH(l), HIGH(r));
int hl = HIGH(l);
int hr = HIGH(r);
// Avoid the recursion if the second implication will trivially
// fail.
if ((ISONE(hl) || ISZERO(hr)) && (hl != hr))
res = 0;
else
res = bdd_implies(LOW(l), LOW(r)) && bdd_implies(hl, hr);
}
else if (LEVEL(l) < LEVEL(r))
{
res = bdd_implies(LOW(l), r) && bdd_implies(HIGH(l), r);
int hl = HIGH(l);
if (ISONE(hl) && (hl != r))
res = 0;
else
res = bdd_implies(LOW(l), r) && bdd_implies(HIGH(l), r);
}
else /* LEVEL(l) > LEVEL(r) */
{
res = bdd_implies(l, LOW(r)) && bdd_implies(l, HIGH(r));
int hr = HIGH(r);
if (ISZERO(hr) && (hr != r))
res = 0;
else
res = bdd_implies(l, LOW(r)) && bdd_implies(l, HIGH(r));
}
entry->i.a = l;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment