rbyd-rr: Explicitly deduplicated diverging conditions
I'm not really sure why the compiler isn't taking care of this for us.
Usually I prefer duplicated logic over more variables since it means
less state to keep track of when reading/debugging, and the compiler
will optimize it away anyways. But I guess these conditions are just too
complicated in this case?
Maybe the compiler is trying to take advantage of &&/|| short-circuiting
even with -Os?
Even marking the lfsr_tag_diverging* functions with
__attribute__((noinline, pure, const)) doesn't help...
Oh well, this is a case where we can just make the deduplication
explicit for a bit of code savings:
code stack
before: 34176 2864
after: 34080 (-0.3%) 2864 (+0.0%)
code frame stack
appendattr before: 2162 208 560
appendattr after: 2104 (-2.7%) 216 (+3.8%) 568 (+1.4%)
This commit is contained in:
@@ -2935,38 +2935,28 @@ trunk:;
|
|||||||
}
|
}
|
||||||
|
|
||||||
// do bounds want to take different paths? begin diverging
|
// do bounds want to take different paths? begin diverging
|
||||||
|
bool diverging = lfsr_tag_diverging2(
|
||||||
|
alt, weight,
|
||||||
|
p[0].alt, p[0].weight,
|
||||||
|
lower_rid, upper_rid,
|
||||||
|
a_rid, a_tag,
|
||||||
|
b_rid, b_tag);
|
||||||
|
bool diverging_red = lfsr_tag_isred(p[0].alt)
|
||||||
|
&& lfsr_tag_diverging(
|
||||||
|
p[0].alt, p[0].weight,
|
||||||
|
lower_rid, upper_rid,
|
||||||
|
a_rid, a_tag,
|
||||||
|
b_rid, b_tag);
|
||||||
if (!diverged
|
if (!diverged
|
||||||
// diverging black?
|
// diverging black?
|
||||||
&& (lfsr_tag_isblack(alt)
|
&& (lfsr_tag_isblack(alt)
|
||||||
// give up if we find a yellow alt
|
// give up if we find a yellow alt
|
||||||
|| lfsr_tag_isred(p[0].alt))
|
|| lfsr_tag_isred(p[0].alt))
|
||||||
&& (lfsr_tag_diverging2(
|
&& (diverging || diverging_red)) {
|
||||||
alt, weight,
|
|
||||||
p[0].alt, p[0].weight,
|
|
||||||
lower_rid, upper_rid,
|
|
||||||
a_rid, a_tag,
|
|
||||||
b_rid, b_tag)
|
|
||||||
|| (lfsr_tag_isred(p[0].alt)
|
|
||||||
&& lfsr_tag_diverging(
|
|
||||||
p[0].alt, p[0].weight,
|
|
||||||
lower_rid, upper_rid,
|
|
||||||
a_rid, a_tag,
|
|
||||||
b_rid, b_tag)))) {
|
|
||||||
diverged = true;
|
diverged = true;
|
||||||
|
|
||||||
// both diverged? collapse
|
// both diverging? collapse
|
||||||
if (lfsr_tag_diverging2(
|
if (diverging && diverging_red) {
|
||||||
alt, weight,
|
|
||||||
p[0].alt, p[0].weight,
|
|
||||||
lower_rid, upper_rid,
|
|
||||||
a_rid, a_tag,
|
|
||||||
b_rid, b_tag)
|
|
||||||
&& (lfsr_tag_isred(p[0].alt)
|
|
||||||
&& lfsr_tag_diverging(
|
|
||||||
p[0].alt, p[0].weight,
|
|
||||||
lower_rid, upper_rid,
|
|
||||||
a_rid, a_tag,
|
|
||||||
b_rid, b_tag))) {
|
|
||||||
LFS_ASSERT(a_rid < b_rid || a_tag < b_tag);
|
LFS_ASSERT(a_rid < b_rid || a_tag < b_tag);
|
||||||
LFS_ASSERT(lfsr_tag_isparallel(alt, p[0].alt));
|
LFS_ASSERT(lfsr_tag_isparallel(alt, p[0].alt));
|
||||||
|
|
||||||
@@ -2997,15 +2987,8 @@ trunk:;
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// force diverged alts to be pruned
|
// trim diverging alts so they can be pruned
|
||||||
} else if (diverged
|
} else if (diverged && diverging) {
|
||||||
&& lfsr_tag_diverging2(
|
|
||||||
alt, weight,
|
|
||||||
p[0].alt, p[0].weight,
|
|
||||||
lower_rid, upper_rid,
|
|
||||||
a_rid, a_tag,
|
|
||||||
b_rid, b_tag)) {
|
|
||||||
// one diverged? trim so alt is pruned
|
|
||||||
lfsr_tag_trim(
|
lfsr_tag_trim(
|
||||||
alt, weight,
|
alt, weight,
|
||||||
&lower_rid, &upper_rid,
|
&lower_rid, &upper_rid,
|
||||||
|
|||||||
Reference in New Issue
Block a user