1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

[TailDuplicator] Fix copy instruction emitting into the wrong block.

The code for duplicating instructions could sometimes try to emit copies
intended to deal with unconstrainable register classes to the tail block of the
original instruction, rather than before the newly cloned instruction in the
predecessor block.

This was exposed by GlobalISel on arm64.

Differential Revision: https://reviews.llvm.org/D64049

llvm-svn: 364888
This commit is contained in:
Amara Emerson 2019-07-02 06:04:46 +00:00
parent 1c92b44903
commit 207f6805ea
2 changed files with 126 additions and 1 deletions

View File

@ -434,7 +434,7 @@ void TailDuplicator::duplicateInstruction(
if (NewRC == nullptr)
NewRC = OrigRC;
unsigned NewReg = MRI->createVirtualRegister(NewRC);
BuildMI(*PredBB, MI, MI->getDebugLoc(),
BuildMI(*PredBB, NewMI, NewMI.getDebugLoc(),
TII->get(TargetOpcode::COPY), NewReg)
.addReg(VI->second.Reg, 0, VI->second.SubReg);
LocalVRMap.erase(VI);

View File

@ -0,0 +1,125 @@
# RUN: llc -mtriple aarch64 -run-pass=early-tailduplication -verify-machineinstrs %s -o - 2>&1 | FileCheck %s
---
name: pluto
tracksRegLiveness: true
body: |
; This test checks that the COPY3 and COPY4 copies are correctly placed in the bb.5 block,
; instead of crashing.
; CHECK-LABEL: name: pluto
; CHECK: bb.0:
; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000)
; CHECK: liveins: $x0
; CHECK: [[DEF:%[0-9]+]]:gpr32 = IMPLICIT_DEF
; CHECK: [[DEF1:%[0-9]+]]:gpr32common = IMPLICIT_DEF
; CHECK: [[DEF2:%[0-9]+]]:gpr64 = IMPLICIT_DEF
; CHECK: [[DEF3:%[0-9]+]]:gpr64common = IMPLICIT_DEF
; CHECK: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 1
; CHECK: [[FMOVD0_:%[0-9]+]]:fpr64 = FMOVD0
; CHECK: TBNZW [[DEF]], 0, %bb.1
; CHECK: B %bb.2
; CHECK: bb.1:
; CHECK: successors: %bb.9(0x80000000)
; CHECK: [[LDRXui:%[0-9]+]]:gpr64 = LDRXui [[DEF3]], 0 :: (load 8 from `i64* undef`)
; CHECK: B %bb.9
; CHECK: bb.2:
; CHECK: successors: %bb.3(0x40000000), %bb.4(0x40000000)
; CHECK: $wzr = SUBSWri [[DEF1]], 19, 0, implicit-def $nzcv
; CHECK: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
; CHECK: TBNZW [[CSINCWr]], 0, %bb.3
; CHECK: B %bb.4
; CHECK: bb.3:
; CHECK: successors: %bb.9(0x80000000)
; CHECK: [[SCVTFUXDri:%[0-9]+]]:fpr64 = SCVTFUXDri [[DEF2]]
; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY [[SCVTFUXDri]]
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY [[SCVTFUXDri]]
; CHECK: B %bb.9
; CHECK: bb.4:
; CHECK: successors: %bb.5(0x40000000), %bb.8(0x40000000)
; CHECK: TBNZW [[DEF]], 0, %bb.5
; CHECK: B %bb.8
; CHECK: bb.5:
; CHECK: successors: %bb.9(0x80000000)
; CHECK: [[COPY2:%[0-9]+]]:fpr64 = COPY [[DEF2]]
; CHECK: [[COPY3:%[0-9]+]]:gpr64 = COPY [[COPY2]]
; CHECK: [[COPY4:%[0-9]+]]:fpr64 = COPY [[DEF2]]
; CHECK: B %bb.9
; CHECK: bb.8:
; CHECK: successors: %bb.9(0x80000000)
; CHECK: bb.9:
; CHECK: [[PHI:%[0-9]+]]:gpr64 = PHI [[LDRXui]], %bb.1, [[FMOVD0_]], %bb.8, [[COPY]], %bb.3, [[COPY3]], %bb.5
; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
; CHECK: $d0 = COPY [[PHI]]
; CHECK: BL @pluto, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $d0, implicit-def $d0
; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; CHECK: $w0 = COPY [[MOVi32imm]]
; CHECK: RET_ReallyLR implicit $w0
bb.1:
successors: %bb.2(0x40000000), %bb.3(0x40000000)
liveins: $x0
%1:gpr32 = IMPLICIT_DEF
%2:gpr32common = IMPLICIT_DEF
%5:gpr64 = IMPLICIT_DEF
%9:gpr64common = IMPLICIT_DEF
%13:gpr32 = MOVi32imm 1
%14:fpr64 = FMOVD0
TBNZW %1, 0, %bb.2
B %bb.3
bb.2:
successors: %bb.8(0x80000000)
%8:gpr64 = LDRXui %9, 0 :: (load 8 from `i64* undef`)
B %bb.8
bb.3:
successors: %bb.4(0x40000000), %bb.5(0x40000000)
$wzr = SUBSWri %2, 19, 0, implicit-def $nzcv
%15:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
TBNZW %15, 0, %bb.4
B %bb.5
bb.4:
successors: %bb.7(0x80000000)
%6:fpr64 = SCVTFUXDri %5
B %bb.7
bb.5:
successors: %bb.6(0x40000000), %bb.9(0x40000000)
TBNZW %1, 0, %bb.6
B %bb.9
bb.6:
successors: %bb.7(0x80000000)
bb.7:
successors: %bb.8(0x80000000)
%7:fpr64 = PHI %6, %bb.4, %5, %bb.6
bb.8:
successors: %bb.10(0x80000000)
%10:gpr64 = PHI %8, %bb.2, %7, %bb.7
B %bb.10
bb.9:
successors: %bb.10(0x80000000)
bb.10:
%11:gpr64 = PHI %10, %bb.8, %14, %bb.9
ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
$d0 = COPY %11
BL @pluto, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $d0, implicit-def $d0
ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
$w0 = COPY %13
RET_ReallyLR implicit $w0
...