-
Notifications
You must be signed in to change notification settings - Fork 449
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf: improve bv_decide performance with large literals (#6453)
This PR improves bv_decide's performance in the presence of large literals. The core change of this PR is the reformulation of the reflection code for literals to: ```diff def eval (assign : Assignment) : BVExpr w → BitVec w | .var idx => - let ⟨bv⟩ := assign.get idx - bv.truncate w + let packedBv := assign.get idx + /- + This formulation improves performance, as in a well formed expression the condition always holds + so there is no need for the more involved `BitVec.truncate` logic. + -/ + if h : packedBv.w = w then + h ▸ packedBv.bv + else + packedBv.bv.truncate w ``` The remainder is merely further simplifications that make the terms smaller and easier to deal with in general. This change is motivated by applying the following diff to the kernel: ```diff diff --git a/src/kernel/type_checker.cpp b/src/kernel/type_checker.cpp index b0e6844dca..f13bb96bd4 100644 --- a/src/kernel/type_checker.cpp +++ b/src/kernel/type_checker.cpp @@ -518,6 +518,7 @@ optional<constant_info> type_checker::is_delta(expr const & e) const { optional<expr> type_checker::unfold_definition_core(expr const & e) { if (is_constant(e)) { if (auto d = is_delta(e)) { +// std::cout << "Working on unfolding: " << d->get_name() << std::endl; if (length(const_levels(e)) == d->get_num_lparams()) { if (m_diag) { m_diag->record_unfold(d->get_name()); ``` and observing that in the test case from #6043 we see a long series of ``` Working on unfolding: Bool.decEq Working on unfolding: Bool.decEq.match_1 Working on unfolding: Bool.casesOn Working on unfolding: Nat.ble Working on unfolding: Nat.brecOn Working on unfolding: Nat.beq.match_1 Working on unfolding: Nat.casesOn Working on unfolding: Nat.casesOn Working on unfolding: Nat.beq.match_1 Working on unfolding: Nat.casesOn Working on unfolding: Nat.casesOn ``` the chain begins with `BitVec.truncate`, works through a few abstractions and then continues like above forever, so I avoid the call to truncate like this. It is not quite clear to me why removing `ofBool` helps so much here, maybe some other kernel heuristic kicks in to rescue us. Either way this diff is a general improvement for reflection of `BitVec` constants as we should never have to run `BitVec.truncate` again! Fixes: #6043
- Loading branch information
Showing
15 changed files
with
101 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
import Std.Tactic.BVDecide | ||
|
||
theorem extracted_1 (x : BitVec 32) : | ||
BitVec.ofBool (x != 51#32) &&& BitVec.ofBool (x != 50#32) = | ||
BitVec.ofBool (4294967294#32 > x + 4294967244#32) := by | ||
bv_decide |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters