[llvm-branch-commits] [llvm] e861196 - [CodeGen][MachineLastInstrsCleanup] fix INLINEASM_BR hazard

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon May 1 21:11:43 PDT 2023


Author: Nick Desaulniers
Date: 2023-05-01T21:09:22-07:00
New Revision: e861196707993f45503621cd8472e94ddd1d8c97

URL: https://github.com/llvm/llvm-project/commit/e861196707993f45503621cd8472e94ddd1d8c97
DIFF: https://github.com/llvm/llvm-project/commit/e861196707993f45503621cd8472e94ddd1d8c97.diff

LOG: [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

(cherry picked from commit 012ea747ed0275c499f69c82ac0f635f4c76f746)

Added: 
    

Modified: 
    llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp
    llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp b/llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp
index c400ce190b46..bb33b843e024 100644
--- a/llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp
+++ b/llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp
@@ -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(

diff  --git a/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir b/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir
index af18e6de374a..f3538122505a 100644
--- a/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir
+++ b/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir
@@ -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:


        


More information about the llvm-branch-commits mailing list