Pending https://github.com/WebAssembly/design/pull/481 , this is a patch implementing br_unless in LLVM and some optimizations that are significantly easier to implement using it.
Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
This would also be accompanied by this change: https://github.com/WebAssembly/experimental/commit/cfd8a9dab3c188f9919bd938fcfa5446711ab6fe
The test diffs in that commit also give a pretty good illustration of the effect of this patch on codegen.
As an interim solution, to let this patch move forward without waiting for the spec process, this update adds a patch to lower br_unless into br_if, reversing the condition in place if possible, or negating the condition manually if necessary.
This may also motivate adding more floating-point comparison operators, or a dedicated not operator, if br_unless itself does not advance.
Don't you want an option to disable the pass as well, so that we can let people compare the code for both easily?
lib/Target/WebAssembly/WebAssemblyInstrControl.td | ||
---|---|---|
36 ↗ | (On Diff #41938) | This is only I32 because that's what we lower bool to, correct? Could you add a comment explaining it? |
lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp | ||
131 ↗ | (On Diff #41938) | && "comment" |
151 ↗ | (On Diff #41938) | Ditto. |
lib/Target/WebAssembly/WebAssemblyLowerBrUnless.cpp | ||
102 ↗ | (On Diff #41938) | Start with Inverted = true and set Inverted = false for default? |
I hadn't planned to add an option; I tend to prefer to avoid checking in command-line options for experiments.
lib/Target/WebAssembly/WebAssemblyInstrControl.td | ||
---|---|---|
37 ↗ | (On Diff #41965) | Correct. |
I think it would make the discussion easier if folks could try both, but the patch looks fine for now.