[PATCH] D103958: [WIP] Support MustControl conditional control attribute

Eli Friedman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 9 15:08:31 PDT 2021


efriedma added a comment.

In D103958#2808966 <https://reviews.llvm.org/D103958#2808966>, @melver wrote:

> In D103958#2808861 <https://reviews.llvm.org/D103958#2808861>, @efriedma wrote:
>
>> I don't like using metadata like this.  Dropping metadata should generally preserve the semantics of the code.
>
> Anything better for this without introducing new instructions? Would an argument be reasonable?

If we really want to make it part of the branch, maybe add an intrinsic that can be used with callbr.  Not something we've done before, but the infrastructure should be mostly there.

That said, I'm not sure this is the best approach.  Alternative proposal:

We could add a regular intrinsic.  Just ignore the control flow at the IR level, and come up with a straight-line blob that just does the right thing.  I think we'd want to actually perform the load as part of the intrinsic, to avoid worrying about the consume dependency.  So we'd have an intrinsic "__builtin_load_with_control_dependency()". It would lower to something along the lines of  `asm("ldr %0, [%1]; cbnz %0, .+4":"=r"(dest):"r"(x):"memory");` on AArch64.  The differences between the intrinsic and just using the asm I wrote:

1. We weaken the "memory" clobber to something that more accurately matches what we need.
2. We add a compiler transform to check if the branch is redundant, late in the optimization pipeline, and remove it if it is.

I think this produces the code you want, and it should be easier to understand and maintain.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103958/new/

https://reviews.llvm.org/D103958



More information about the llvm-commits mailing list