[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