derive and expose address keyed NZCV flag liveness - #289
Closed
leftbyte wants to merge 6 commits into
Closed
Conversation
leftbyte
force-pushed
the
dphung/pir-req2-flag-liveness
branch
from
August 7, 2026 04:52
2f0d5b2 to
c6c3bb1
Compare
waskyo
reviewed
Aug 20, 2026
waskyo
left a comment
Collaborator
There was a problem hiding this comment.
First pass. I'd like to do a second pass looking at the algo but ran out of time today for that.
leftbyte
force-pushed
the
dphung/pir-req2-flag-liveness
branch
from
August 20, 2026 23:11
62c1d69 to
9c81d60
Compare
added 3 commits
August 21, 2026 10:57
Add ASTILiveness, which computes NZCV flag live-in/live-out per instruction address for a function by building per-address use/kill sets from the per-instruction flag-reaching-def facts and running a backward live-variable fixpoint over the CFG. Block instructions are ordered with the same lexicographic sort BasicBlock uses, which also tolerates the analysis's inlined-instruction addresses.
Add a flag-liveness map (keyed by instruction address) to ASTProvenance with the standard getter/setter, and round-trip it through serialize/deserialize alongside the other provenance facts.
Compute flag-liveness in mk_asts, alongside set_ast_provenance, so it flows through the same builder path as the other provenance facts (rather than only on the results-ast command path). The computation is auxiliary and guarded so a failure cannot abort AST generation.
leftbyte
force-pushed
the
dphung/pir-req2-flag-liveness
branch
2 times, most recently
from
August 21, 2026 20:30
730154a to
9615655
Compare
added 2 commits
August 21, 2026 13:47
is_real_def_site excluded any "F"-prefixed def-site as "not a site in this function's CFG", which was wrong. Those instructions execute and define what they define, and their addresses are ordinary keys in fn.blocks and fn.instructions. _use_kill was therefore recording uses at those addresses while discarding their kills.
An "init" def-site means the value was defined on function entry rather than by an instruction. For a registers that is ordinary and an incoming parameter is defined exactly there. This is not normal for a flag because the ABI leaves NZCV undefined on entry to a function.
leftbyte
force-pushed
the
dphung/pir-req2-flag-liveness
branch
from
August 21, 2026 20:54
9615655 to
0c1a707
Compare
Contributor
Author
|
The tail commits were merged in the stacked branch in PR #290, so closing this PR. |
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
CodeHawk records per-instruction flag-reaching-def facts but exposes no liveness. This PR derives NZCV flag live-in/live-out for each instruction address and attaches it to the function's provenance, so a consumer can tell whether a flag set by a compare is still needed past a given point.
This metadata is used by the the patcher's predicated-if in-place patching mechanism as a safety check to confirm NZCV are dead at the region exit before replacing a compare.