[CodeGen][MachineLastInstrsCleanup] fix INLINEASM_BR hazard
authorNick Desaulniers <ndesaulniers@google.com>
Thu, 27 Apr 2023 20:39:54 +0000 (13:39 -0700)
committerNick Desaulniers <ndesaulniers@google.com>
Thu, 27 Apr 2023 20:40:00 +0000 (13:40 -0700)
commit012ea747ed0275c499f69c82ac0f635f4c76f746
tree01f195591b5690bb04daec6f045c957c67ebce11
parent095a0c67bb5705b2ebd91ecc039e73bbd6982cee
[CodeGen][MachineLastInstrsCleanup] fix INLINEASM_BR hazard

If the removable definition resides in an INLINEASM_BR target, the
reuseable candidate might not dominate the INLINEASM_BR.

   bb0:
      INLINEASM_BR &"" %bb.1
      renamable $x8 = MOVi64imm 29273397577910035
      B %bb.2
      ...
    bb1:
      renamable $x8 = MOVi64imm 29273397577910035
      renamable $x8 = ADDXri killed renamable $x8, 2048, 0
    bb2:

Removing the second mov is a hazard when the inline asm branches to bb1.

Skip such replacements when the to be removed instruction is in the
target of such an INLINEASM_BR instruction.

We could get more aggressive about this in the future, but for now
simply abort.

This is causing a boot failure on linux-4.19.y branches of the LTS Linux
kernel for ARCH=arm64 with CONFIG_RANDOMIZE_BASE=y (KASLR) and
CONFIG_UNMAP_KERNEL_AT_EL0=y (KPTI).

Link: https://reviews.llvm.org/D123394
Link: https://github.com/ClangBuiltLinux/linux/issues/1837
Thanks to @nathanchance for the report, and @ardb for debugging.

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D149191
llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp
llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir