From eae9c541484b75e4b3514ed47344adf3352f5d40 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 6 Aug 2020 13:10:08 -0400 Subject: [PATCH] AArch64/GlobalISel: Fix verifier error after selecting returnaddress This was caching the wrong register to re-use later. --- .../GISel/AArch64InstructionSelector.cpp | 2 +- .../select-returnaddress-liveins.mir | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) 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 different 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 +...