rbyd-rr: Added lfsr_tag_diverging and lfsr_tag_diverging2

If nothing else these at least makes the code a bit more readable.

Curiously this improved lfsr_rbyd_appendattr, but made the total code
size worse. I guess these really should be inlined, but don't pass some
compiler heuristic. Oh well, optimization is a hard problem:

           code          stack
  before: 34492           2864
  after:  34516 (+0.1%)   2864 (+0.0%)

                     code          frame          stack
  appendattr before: 2414            216            568
  appendattr after:  2366 (-2.0%)    216 (+0.0%)    568 (+0.0%)
This commit is contained in:
Christopher Haster
2024-04-08 20:23:54 -05:00
parent 660d323564
commit ffc36b0f36
+60 -44
View File
@@ -1037,6 +1037,39 @@ static inline bool lfsr_tag_unreachable2(
lower_tag, upper_tag);
}
static inline bool lfsr_tag_diverging(
lfsr_tag_t alt, lfsr_rid_t weight,
lfsr_srid_t lower_rid, lfsr_srid_t upper_rid,
lfsr_srid_t a_rid, lfsr_tag_t a_tag,
lfsr_srid_t b_rid, lfsr_tag_t b_tag) {
return lfsr_tag_follow(
alt, weight,
lower_rid, upper_rid,
a_rid, a_tag)
^ lfsr_tag_follow(
alt, weight,
lower_rid, upper_rid,
b_rid, b_tag);
}
static inline bool lfsr_tag_diverging2(
lfsr_tag_t alt, lfsr_rid_t weight,
lfsr_tag_t alt2, lfsr_rid_t weight2,
lfsr_srid_t lower_rid, lfsr_srid_t upper_rid,
lfsr_srid_t a_rid, lfsr_tag_t a_tag,
lfsr_srid_t b_rid, lfsr_tag_t b_tag) {
return lfsr_tag_follow2(
alt, weight,
alt2, weight2,
lower_rid, upper_rid,
a_rid, a_tag)
^ lfsr_tag_follow2(
alt, weight,
alt2, weight2,
lower_rid, upper_rid,
b_rid, b_tag);
}
// support for encoding/decoding tags on disk
@@ -2925,38 +2958,28 @@ trunk:;
&& (((lfsr_tag_isblack(alt)
// give up if we find a yellow alt
|| lfsr_tag_isred(p[0].alt))
&& lfsr_tag_follow2(
alt, weight,
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag)
^ lfsr_tag_follow2(
alt, weight,
p[0].alt, p[0].weight,
lower_rid, upper_rid,
b_rid, b_tag))
&& lfsr_tag_diverging2(
alt, weight,
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag,
b_rid, b_tag))
// diverging red?
|| (lfsr_tag_isred(p[0].alt)
&& lfsr_tag_follow(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag)
^ lfsr_tag_follow(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
b_rid, b_tag)))) {
&& lfsr_tag_diverging(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag,
b_rid, b_tag)))) {
d_state = lfsr_d_diverge(d_state);
// diverging red? flip
if (lfsr_tag_isred(p[0].alt)
&& lfsr_tag_follow(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag)
^ lfsr_tag_follow(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
b_rid, b_tag)) {
&& lfsr_tag_diverging(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag,
b_rid, b_tag)) {
if (lfsr_tag_isparallel(alt, p[0].alt)) {
lfsr_tag_flip2(&alt, &weight,
p[0].alt, p[0].weight,
@@ -2971,14 +2994,11 @@ trunk:;
alt &= ~LFSR_TAG_R;
// both diverging? collapse
if (lfsr_tag_follow(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag)
^ lfsr_tag_follow(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
b_rid, b_tag)) {
if (lfsr_tag_diverging(
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag,
b_rid, b_tag)) {
LFS_ASSERT(!lfsr_tag_isparallel(alt, p[0].alt));
lfsr_tag_flip2(&alt, &weight,
p[0].alt, p[0].weight,
@@ -3022,16 +3042,12 @@ trunk:;
// force diverged alts to be pruned
} else if (lfsr_d_isdiverged(d_state)
&& lfsr_tag_follow2(
alt, weight,
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag)
^ lfsr_tag_follow2(
alt, weight,
p[0].alt, p[0].weight,
lower_rid, upper_rid,
b_rid, b_tag)) {
&& lfsr_tag_diverging2(
alt, weight,
p[0].alt, p[0].weight,
lower_rid, upper_rid,
a_rid, a_tag,
b_rid, b_tag)) {
if (lfsr_tag_follow2(
alt, weight,
p[0].alt, p[0].weight,