elliottt edited PR #4545 from trevor/x64-lower-trapif to main:
Migrate the
trapifinstruction to ISLE, and extract the lowering oficmpfor scalars to a utility function. Theicmpextraction will be helpful for future instruction migrations, as its uses mirror the existingemit_cmpinstruction in the rust implementation.I'd recommend reviewing by commit, and turning off whitespace in the diff.
<!--
Please ensure that the following steps are all taken care of before submitting
the PR.
[ ] This has been discussed in issue #..., or if not, please tell us why
here.[ ] A short description of what this does, why it is needed; if the
description becomes long, the matter should probably be discussed in an issue
first.[ ] This PR contains test cases, if meaningful.
- [ ] A reviewer from the core maintainer team has been assigned for this PR.
If you don't know who could review this, please indicate so. The list of
suggested reviewers on the right can help you.Please ensure all communication adheres to the code of conduct.
-->
elliottt updated PR #4545 from trevor/x64-lower-trapif to main.
cfallin created PR review comment:
here and elsewhere, we shouldn't do the side-effecting thing and invoke
trap_if_booljust to throw the result away; we should return it. This can work similarly to other ops that don't return values most likely -- see e.g. stores, with the(side_effect ...)ctor.
cfallin submitted PR review.
cfallin submitted PR review.
cfallin created PR review comment:
I think this could work a little better if we did the following:
- The
AlreadyExistingFlagsenum arm has no args -- we don't actually hold onto the flagsValue, it's just a sentinel representing "whatever's in the machine flags register";- We write a helper in ISLE that does something like:
lisp (decl flags_to_producesflags (Value) ProducesFlags) (rule (flags_to_producesflags flags) (mark_value_used flags) (ProducesFlags.AlreadyExistingFlags))then we don't need the distinct case when emitting.
cfallin submitted PR review.
cfallin created PR review comment:
And just to write down a thought I had and then dismissed: I had considered whether it made sense to make the above an auto-conversion, but I think that's too dangerous; if makes more sense to require an explicit action here since we're essentially asserting that
flagsis a flags value.... or, perhaps we do:
(rule (flags_to_producesflags (has_type $FLAGS flags)) ...)then we are actually asserting it's a flags value, and the verifier will ensure this corresponds to the current flags (there is only one live flags at a time), and so then this is safe and we can make it an auto-conversion. That removes all footguns from the lowerings I think.
elliottt submitted PR review.
elliottt submitted PR review.
elliottt created PR review comment:
I agree that
emit_consumerfeels like a bit of a hack, and I'd be happy to use an alternative. The solution to bump the refcount manually when consuming theiadd_ifcoutseems good to me :+1:
elliottt created PR review comment:
This is a change from the previous lowering of
icmpfor comparisons withI128arguments: instead of ending with a singlex64_and, we now produce a test instruction. The lowering foricmpwill now include an additionalsetccas a result, forI128comparisons.
elliottt created PR review comment:
I'm not sure what value we would return here --
TrapIfand friends have no outputs. Are you suggesting thattrap_if_boolshould return anInstOutputand always return(output_none)?
elliottt created PR review comment:
Would we need to select the second output of
flagsfor that assertion to work, or am I missing something about how the outputs are accessed?
elliottt created PR review comment:
Ah of course: we can return a
SideEffectNoResult.Inst2instead. I'll make that change, it's much cleaner than relying on the effects currently.
elliottt updated PR #4545 from trevor/x64-lower-trapif to main.
elliottt created PR review comment:
I'm not sold on this pretty-printing format. Do you have ideas on how better to convey what's going on? Maybe something like
j({} || {})?
elliottt submitted PR review.
cfallin created PR review comment:
(I'll look at the rest in the detail tomorrow but one thought here: )
This is actually kind of a fun historical oddity: when initially implementing the new backends we kept the pretty-printing format to something that could actually feed into GNU
as. The first "hello world" (fib function actually) on the aarch64 backend was a thing I captured from the trace logs and then assembled and linked manually. Since then we've sort of drifted from that and the pretty-printing just has to be "comprehensible to a deeply tired debugging human"; so something that clarifies here is welcome :-)I might even go so far as
trap_if_or CC, CCor somesuch...
cfallin submitted PR review.
elliottt updated PR #4545 from trevor/x64-lower-trapif to main.
elliottt updated PR #4545 from trevor/x64-lower-trapif to main.
elliottt updated PR #4545 from trevor/x64-lower-trapif to main.
elliottt submitted PR review.
elliottt created PR review comment:
This part of the comment seems like it would be more helpful by the
lower_fcmp_boolfunction above.
elliottt has marked PR #4545 as ready for review.
elliottt updated PR #4545 from trevor/x64-lower-trapif to main.
elliottt created PR review comment:
I realized that I was forgetting that the dependency in
trapifwill explicitly be for the flags output ofiadd_ifcout, so I was indeed missing something :)
elliottt submitted PR review.
cfallin submitted PR review.
elliottt merged PR #4545.
Last updated: Dec 13 2025 at 19:03 UTC