[PATCH] D79657: [AArch64][GlobalISel] Make LR livein to entry in llvm.returnaddress selection

Jessica Paquette via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 11 11:51:34 PDT 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rGcd59458f27af: [AArch64][GlobalISel] Make LR livein to entry in llvm.returnaddress selection (authored by paquette).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D79657

Files:
  llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
  llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir


Index: llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir
@@ -0,0 +1,61 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple=aarch64 -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
+
+--- |
+  define void @lr_other_block() { ret void }
+  define void @already_live_in() { ret void }
+  declare i8* @llvm.returnaddress(i32 immarg)
+...
+---
+name:            lr_other_block
+alignment:       4
+legalized:       true
+regBankSelected: true
+tracksRegLiveness: true
+body:             |
+  ; CHECK-LABEL: name: lr_other_block
+  ; CHECK: bb.0:
+  ; CHECK:   successors: %bb.1(0x80000000)
+  ; CHECK:   liveins: $w0, $x0, $lr
+  ; CHECK:   [[COPY:%[0-9]+]]:gpr64 = COPY $lr
+  ; CHECK:   B %bb.1
+  ; CHECK: bb.1:
+  ; CHECK:   $x0 = COPY [[COPY]]
+  ; CHECK:   RET_ReallyLR implicit $x0
+  ; LR should be added as a livein to the entry block.
+
+  bb.0:
+    ; We should have lr as a livein to bb.0, and a copy from LR.
+    liveins: $w0, $x0
+    G_BR %bb.1
+  bb.1:
+    %4:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
+    $x0 = COPY %4
+    RET_ReallyLR implicit $x0
+...
+---
+name:            already_live_in
+alignment:       4
+legalized:       true
+regBankSelected: true
+tracksRegLiveness: true
+body:             |
+  ; CHECK-LABEL: name: already_live_in
+  ; CHECK: bb.0:
+  ; CHECK:   successors: %bb.1(0x80000000)
+  ; CHECK:   liveins: $w0, $x0, $lr
+  ; CHECK:   [[COPY:%[0-9]+]]:gpr64 = COPY $lr
+  ; CHECK:   B %bb.1
+  ; CHECK: bb.1:
+  ; CHECK:   $x0 = COPY [[COPY]]
+  ; CHECK:   RET_ReallyLR implicit $x0
+  ; We should not have LR listed as a livein twice.
+
+  bb.0:
+    liveins: $w0, $x0, $lr
+    G_BR %bb.1
+  bb.1:
+    %4:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
+    $x0 = COPY %4
+    RET_ReallyLR implicit $x0
+...
Index: llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
+++ llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
@@ -4666,11 +4666,13 @@
       }
       MFI.setReturnAddressIsTaken(true);
       MF.addLiveIn(AArch64::LR, &AArch64::GPR64spRegClass);
-      I.getParent()->addLiveIn(AArch64::LR);
       // Insert the copy from LR/X30 into the entry block, before it can be
       // clobbered by anything.
+      MachineBasicBlock &EntryBlock = *MF.begin();
+      if (!EntryBlock.isLiveIn(AArch64::LR))
+        EntryBlock.addLiveIn(AArch64::LR);
       MachineIRBuilder EntryBuilder(MF);
-      EntryBuilder.setInstr(*MF.begin()->begin());
+      EntryBuilder.setInstr(*EntryBlock.begin());
       EntryBuilder.buildCopy({DstReg}, {Register(AArch64::LR)});
       MFReturnAddr = DstReg;
       I.eraseFromParent();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79657.263233.patch
Type: text/x-patch
Size: 2988 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200511/bd0c97a5/attachment.bin>


More information about the llvm-commits mailing list