rbyd-rr: Cleaned up appendattr diverged handling a bit
- Made diverging-lower pruning its own case to simplify the pruning logic, though this does lead to a bit more code duplication... - Duplicated the diverging-alt pruning logic to simplify/give more control to the diverging-alt case. No more diverged_this_alt hack. Note that d_tag can no longer be null now that we have it deriving from lower_rid correctly. Maybe this can be deduplicated better (diverged-pruning be implicitly controlled by lower/upper bounds?), but I sort of want to get things just working first.
This commit is contained in:
@@ -2866,7 +2866,6 @@ again:;
|
|||||||
// make jump absolute
|
// make jump absolute
|
||||||
jump = branch - jump;
|
jump = branch - jump;
|
||||||
lfs_size_t branch_ = branch + d;
|
lfs_size_t branch_ = branch + d;
|
||||||
bool diverged_this_alt = false;
|
|
||||||
|
|
||||||
// do bounds want to take different paths? begin diverging
|
// do bounds want to take different paths? begin diverging
|
||||||
if (!lfsr_d_isdiverged(d_state)
|
if (!lfsr_d_isdiverged(d_state)
|
||||||
@@ -2898,7 +2897,7 @@ again:;
|
|||||||
weight);
|
weight);
|
||||||
|
|
||||||
// stitch together diverged branches
|
// stitch together diverged branches
|
||||||
if (d_state == LFSR_D_DIVERGEDUPPER && d_tag) {
|
if (d_state == LFSR_D_DIVERGEDUPPER) {
|
||||||
printf("%04x->%04x: stitching: 0x%x w%d, 0x%x\n",
|
printf("%04x->%04x: stitching: 0x%x w%d, 0x%x\n",
|
||||||
branch,
|
branch,
|
||||||
rbyd->eoff,
|
rbyd->eoff,
|
||||||
@@ -2915,8 +2914,72 @@ again:;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
diverged_this_alt = true;
|
if (lfsr_tag_follow2(
|
||||||
|
alt, weight,
|
||||||
|
p_alts[0], p_weights[0],
|
||||||
|
lower_rid, upper_rid,
|
||||||
|
a_rid, a_tag)) {
|
||||||
|
lfsr_tag_flip2(
|
||||||
|
&alt, &weight,
|
||||||
|
p_alts[0], p_weights[0],
|
||||||
|
lower_rid, upper_rid);
|
||||||
|
lfs_swap32(&jump, &branch_);
|
||||||
}
|
}
|
||||||
|
lfsr_tag_trim(
|
||||||
|
alt, weight,
|
||||||
|
&lower_rid, &upper_rid,
|
||||||
|
&lower_tag, &upper_tag);
|
||||||
|
|
||||||
|
printf("%04x->%04x: dprune 0x%x w%d\n",
|
||||||
|
branch,
|
||||||
|
rbyd->eoff,
|
||||||
|
alt,
|
||||||
|
weight);
|
||||||
|
// TODO need this?
|
||||||
|
// propagate pruning to yellow splits to avoid issues
|
||||||
|
// with tail-recursive recoloring
|
||||||
|
// if (lfsr_d_isdiverged(d_state)) {
|
||||||
|
// d_pruned = true;
|
||||||
|
// }
|
||||||
|
// TODO can we move y_branch updates to beginning of loop?
|
||||||
|
y_branch = branch;
|
||||||
|
branch = branch_;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't write diverging lower alts
|
||||||
|
} else if (d_state == LFSR_D_DIVERGINGLOWER) {
|
||||||
|
if (lfsr_tag_follow2(
|
||||||
|
alt, weight,
|
||||||
|
p_alts[0], p_weights[0],
|
||||||
|
lower_rid, upper_rid,
|
||||||
|
a_rid, a_tag)) {
|
||||||
|
lfsr_tag_flip2(
|
||||||
|
&alt, &weight,
|
||||||
|
p_alts[0], p_weights[0],
|
||||||
|
lower_rid, upper_rid);
|
||||||
|
lfs_swap32(&jump, &branch_);
|
||||||
|
}
|
||||||
|
lfsr_tag_trim(
|
||||||
|
alt, weight,
|
||||||
|
&lower_rid, &upper_rid,
|
||||||
|
&lower_tag, &upper_tag);
|
||||||
|
|
||||||
|
printf("%04x->%04x: dprune 0x%x w%d\n",
|
||||||
|
branch,
|
||||||
|
rbyd->eoff,
|
||||||
|
alt,
|
||||||
|
weight);
|
||||||
|
// TODO need this?
|
||||||
|
// propagate pruning to yellow splits to avoid issues
|
||||||
|
// with tail-recursive recoloring
|
||||||
|
// if (lfsr_d_isdiverged(d_state)) {
|
||||||
|
// d_pruned = true;
|
||||||
|
// }
|
||||||
|
// TODO can we move y_branch updates to beginning of loop?
|
||||||
|
y_branch = branch;
|
||||||
|
branch = branch_;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (lfsr_d_isdiverged(d_state)) {
|
// if (lfsr_d_isdiverged(d_state)) {
|
||||||
@@ -2939,7 +3002,9 @@ again:;
|
|||||||
lower_rid, upper_rid,
|
lower_rid, upper_rid,
|
||||||
lower_tag, upper_tag)
|
lower_tag, upper_tag)
|
||||||
// prune because of diverged paths?
|
// prune because of diverged paths?
|
||||||
|| d_state == LFSR_D_DIVERGINGLOWER
|
// || d_state == LFSR_D_DIVERGINGLOWER
|
||||||
|
// TODO can we adjust lower/upper rid/tag to make this
|
||||||
|
// happen implicitly?
|
||||||
|| (lfsr_d_isdiverged(d_state)
|
|| (lfsr_d_isdiverged(d_state)
|
||||||
&& (d_state == LFSR_D_DIVERGEDUPPER)
|
&& (d_state == LFSR_D_DIVERGEDUPPER)
|
||||||
^ lfsr_tag_isgt(alt)
|
^ lfsr_tag_isgt(alt)
|
||||||
@@ -2981,21 +3046,21 @@ again:;
|
|||||||
// black alts just become unreachable, if we pruned these
|
// black alts just become unreachable, if we pruned these
|
||||||
// it would break the coloring of our tree
|
// it would break the coloring of our tree
|
||||||
} else {
|
} else {
|
||||||
if (d_state == LFSR_D_DIVERGINGLOWER || diverged_this_alt) {
|
// if (d_state == LFSR_D_DIVERGINGLOWER) {
|
||||||
printf("%04x->%04x: dprune 0x%x w%d\n",
|
// printf("%04x->%04x: dprune 0x%x w%d\n",
|
||||||
branch,
|
// branch,
|
||||||
rbyd->eoff,
|
// rbyd->eoff,
|
||||||
alt,
|
// alt,
|
||||||
weight);
|
// weight);
|
||||||
// propagate pruning to yellow splits to avoid issues
|
// // propagate pruning to yellow splits to avoid issues
|
||||||
// with tail-recursive recoloring
|
// // with tail-recursive recoloring
|
||||||
if (lfsr_d_isdiverged(d_state)) {
|
// if (lfsr_d_isdiverged(d_state)) {
|
||||||
d_pruned = true;
|
// d_pruned = true;
|
||||||
}
|
// }
|
||||||
y_branch = branch;
|
// y_branch = branch;
|
||||||
branch = branch_;
|
// branch = branch_;
|
||||||
continue;
|
// continue;
|
||||||
} else {
|
// } else {
|
||||||
printf("%04x->%04x: bprune 0x%x w%d\n",
|
printf("%04x->%04x: bprune 0x%x w%d\n",
|
||||||
branch,
|
branch,
|
||||||
rbyd->eoff,
|
rbyd->eoff,
|
||||||
@@ -3004,7 +3069,7 @@ again:;
|
|||||||
alt = LFSR_TAG_ALT(LFSR_TAG_LE, LFSR_TAG_B, 0);
|
alt = LFSR_TAG_ALT(LFSR_TAG_LE, LFSR_TAG_B, 0);
|
||||||
weight = 0;
|
weight = 0;
|
||||||
// jump = 0;
|
// jump = 0;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user