diff --git a/lfs.c b/lfs.c index 3a8a9cfd..6bcd0bda 100644 --- a/lfs.c +++ b/lfs.c @@ -967,36 +967,24 @@ static inline void lfsr_tag_trim2( lower_tag, upper_tag); } -static inline bool lfsr_tag_prune( +static inline bool lfsr_tag_unavoidable( lfsr_tag_t alt, lfsr_rid_t weight, lfsr_srid_t lower_rid, lfsr_srid_t upper_rid, lfsr_tag_t lower_tag, lfsr_tag_t upper_tag) { if (lfsr_tag_isgt(alt)) { - // unreachable? - return !lfsr_tag_follow( - alt, weight, - lower_rid, upper_rid, - upper_rid-1, upper_tag-1) - // only-reachable? - || lfsr_tag_follow( - alt, weight, - lower_rid, upper_rid, - lower_rid-1, lower_tag+1); + return lfsr_tag_follow( + alt, weight, + lower_rid, upper_rid, + lower_rid-1, lower_tag+1); } else { - // unreachable? - return !lfsr_tag_follow( - alt, weight, - lower_rid, upper_rid, - lower_rid-1, lower_tag+1) - // only-reachable? - || lfsr_tag_follow( - alt, weight, - lower_rid, upper_rid, - upper_rid-1, upper_tag-1); + return lfsr_tag_follow( + alt, weight, + lower_rid, upper_rid, + upper_rid-1, upper_tag-1); } } -static inline bool lfsr_tag_prune2( +static inline bool lfsr_tag_unavoidable2( 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, @@ -1008,7 +996,42 @@ static inline bool lfsr_tag_prune2( &lower_tag, &upper_tag); } - return lfsr_tag_prune( + return lfsr_tag_unavoidable( + alt, weight, + lower_rid, upper_rid, + lower_tag, upper_tag); +} + +static inline bool lfsr_tag_unreachable( + lfsr_tag_t alt, lfsr_rid_t weight, + lfsr_srid_t lower_rid, lfsr_srid_t upper_rid, + lfsr_tag_t lower_tag, lfsr_tag_t upper_tag) { + if (lfsr_tag_isgt(alt)) { + return !lfsr_tag_follow( + alt, weight, + lower_rid, upper_rid, + upper_rid-1, upper_tag-1); + } else { + return !lfsr_tag_follow( + alt, weight, + lower_rid, upper_rid, + lower_rid-1, lower_tag+1); + } +} + +static inline bool lfsr_tag_unreachable2( + 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_tag_t lower_tag, lfsr_tag_t upper_tag) { + if (lfsr_tag_isred(alt2)) { + lfsr_tag_trim( + alt2, weight2, + &lower_rid, &upper_rid, + &lower_tag, &upper_tag); + } + + return lfsr_tag_unreachable( alt, weight, lower_rid, upper_rid, lower_tag, upper_tag); @@ -2821,9 +2844,8 @@ static int lfsr_rbyd_appendattr(lfs_t *lfs, lfsr_rbyd_t *rbyd, // note both normal and rm wide-tags have the same bounds, really it's // the normal non-wide-tags that are an outlier here if (lfsr_tag_issup(tag)) { - // TODO why can't this be rid+1? a_tag = 0x000; - b_tag = 0x800; + b_tag = 0xf00; } else if (lfsr_tag_issub(tag)) { a_tag = lfsr_tag_supkey(tag); b_tag = lfsr_tag_supkey(tag) + 0x100; @@ -2870,8 +2892,8 @@ again:; lfs_size_t branch = lfsr_rbyd_trunk(rbyd); lfsr_srid_t lower_rid = 0; lfsr_srid_t upper_rid = rbyd->weight; - lfsr_tag_t lower_tag = 0x0000; - lfsr_tag_t upper_tag = 0xffff; + lfsr_tag_t lower_tag = 0x000; + lfsr_tag_t upper_tag = 0xf00; // no trunk yet? if (!branch) { @@ -3006,20 +3028,23 @@ again:; // | |