Skip to content

Commit

Permalink
[CodeGen][MachineLastInstrsCleanup] fix INLINEASM_BR hazard
Browse files Browse the repository at this point in the history
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: ClangBuiltLinux/linux#1837

Thanks to @nathanchance for the report, and @ARDB for debugging.

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D149191

(cherry picked from commit 012ea74)
  • Loading branch information
nickdesaulniers authored and tstellar committed May 2, 2023
1 parent ec79a47 commit e861196
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 2 deletions.
3 changes: 2 additions & 1 deletion llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp
Expand Up @@ -175,7 +175,8 @@ bool MachineLateInstrsCleanup::processBlock(MachineBasicBlock *MBB) {
Reg2DefMap &MBBDefs = RegDefs[MBB->getNumber()];

// Find reusable definitions in the predecessor(s).
if (!MBB->pred_empty() && !MBB->isEHPad()) {
if (!MBB->pred_empty() && !MBB->isEHPad() &&
!MBB->isInlineAsmBrIndirectTarget()) {
MachineBasicBlock *FirstPred = *MBB->pred_begin();
for (auto [Reg, DefMI] : RegDefs[FirstPred->getNumber()])
if (llvm::all_of(
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir
Expand Up @@ -159,8 +159,9 @@ body: |
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.1.bb8 (machine-block-address-taken, inlineasm-br-indirect-target):
; CHECK-NEXT: successors: %bb.2(0x80000000)
; CHECK-NEXT: liveins: $w20, $x19, $x21, $x22, $x23, $x24, $x8
; CHECK-NEXT: liveins: $w20, $x19, $x21, $x22, $x23, $x24
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: renamable $x8 = MOVi64imm 29273397577910035
; CHECK-NEXT: renamable $x8 = ADDXri killed renamable $x8, 2048, 0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.2.bb9:
Expand Down

0 comments on commit e861196

Please sign in to comment.