[llvm] eae9c54 - AArch64/GlobalISel: Fix verifier error after selecting returnaddress

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 6 10:18:12 PDT 2020


Author: Matt Arsenault
Date: 2020-08-06T13:18:05-04:00
New Revision: eae9c541484b75e4b3514ed47344adf3352f5d40

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

LOG: AArch64/GlobalISel: Fix verifier error after selecting returnaddress

This was caching the wrong register to re-use later.

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
index 8721a535154a..5e5f902e1107 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
@@ -4793,7 +4793,7 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
                                                    AArch64::GPR64spRegClass);
       MIRBuilder.buildCopy(DstReg, LiveInLR);
 
-      MFReturnAddr = DstReg;
+      MFReturnAddr = LiveInLR;
       I.eraseFromParent();
       return true;
     }

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir b/llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir
index 745752dcc342..a309daab0b4c 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir
@@ -4,6 +4,7 @@
 --- |
   define void @lr_other_block() { ret void }
   define void @already_live_in() { ret void }
+  define void @multi_use() { ret void }
   declare i8* @llvm.returnaddress(i32 immarg)
 ...
 ---
@@ -61,3 +62,33 @@ body:             |
     $x0 = COPY %4
     RET_ReallyLR implicit $x0
 ...
+
+# Check copies are inserted in the right places when selecting
+# multiple uses in 
diff erent blocks
+---
+name:            multi_use
+alignment:       4
+legalized:       true
+regBankSelected: true
+tracksRegLiveness: true
+body:             |
+  ; CHECK-LABEL: name: multi_use
+  ; CHECK: bb.0:
+  ; CHECK:   successors: %bb.1(0x80000000)
+  ; CHECK:   liveins: $w0, $x0, $lr
+  ; CHECK:   [[COPY:%[0-9]+]]:gpr64sp = COPY $lr
+  ; CHECK:   [[COPY1:%[0-9]+]]:gpr64 = COPY [[COPY]]
+  ; CHECK:   B %bb.1
+  ; CHECK: bb.1:
+  ; CHECK:   $x0 = COPY [[COPY1]]
+  ; CHECK:   [[COPY2:%[0-9]+]]:gpr64 = COPY [[COPY]]
+  ; CHECK:   RET_ReallyLR implicit [[COPY2]]
+  bb.0:
+    liveins: $w0, $x0, $lr
+    %0:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
+    G_BR %bb.1
+  bb.1:
+    $x0 = COPY %0
+    %1:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
+    RET_ReallyLR implicit %1
+...


        


More information about the llvm-commits mailing list