mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-26 09:18:56 +00:00
R600: Schedule copy from phys register at beginning of block
It allows regalloc pass to remove them by trivially assigning associated reg git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183336 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -71,6 +71,10 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) {
|
|||||||
(!AllowSwitchFromAlu && CurInstKind == IDAlu))) {
|
(!AllowSwitchFromAlu && CurInstKind == IDAlu))) {
|
||||||
// try to pick ALU
|
// try to pick ALU
|
||||||
SU = pickAlu();
|
SU = pickAlu();
|
||||||
|
if (!SU && !PhysicalRegCopy.empty()) {
|
||||||
|
SU = PhysicalRegCopy.front();
|
||||||
|
PhysicalRegCopy.erase(PhysicalRegCopy.begin());
|
||||||
|
}
|
||||||
if (SU) {
|
if (SU) {
|
||||||
if (CurEmitted >= InstKindLimit[IDAlu])
|
if (CurEmitted >= InstKindLimit[IDAlu])
|
||||||
CurEmitted = 0;
|
CurEmitted = 0;
|
||||||
@@ -118,7 +122,22 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) {
|
|||||||
return SU;
|
return SU;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsUnScheduled(const SUnit *SU) {
|
||||||
|
return SU->isScheduled;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void Filter(std::vector<SUnit *> &List) {
|
||||||
|
List.erase(std::remove_if(List.begin(), List.end(), IsUnScheduled), List.end());
|
||||||
|
}
|
||||||
|
|
||||||
void R600SchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
|
void R600SchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
|
||||||
|
if (IsTopNode) {
|
||||||
|
for (unsigned i = 0; i < AluLast; i++) {
|
||||||
|
Filter(Available[i]);
|
||||||
|
Filter(Pending[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (NextInstKind != CurInstKind) {
|
if (NextInstKind != CurInstKind) {
|
||||||
DEBUG(dbgs() << "Instruction Type Switch\n");
|
DEBUG(dbgs() << "Instruction Type Switch\n");
|
||||||
@@ -157,13 +176,24 @@ void R600SchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
isPhysicalRegCopy(MachineInstr *MI) {
|
||||||
|
if (MI->getOpcode() != AMDGPU::COPY)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !TargetRegisterInfo::isVirtualRegister(MI->getOperand(1).getReg());
|
||||||
|
}
|
||||||
|
|
||||||
void R600SchedStrategy::releaseTopNode(SUnit *SU) {
|
void R600SchedStrategy::releaseTopNode(SUnit *SU) {
|
||||||
DEBUG(dbgs() << "Top Releasing ";SU->dump(DAG););
|
DEBUG(dbgs() << "Top Releasing ";SU->dump(DAG););
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void R600SchedStrategy::releaseBottomNode(SUnit *SU) {
|
void R600SchedStrategy::releaseBottomNode(SUnit *SU) {
|
||||||
DEBUG(dbgs() << "Bottom Releasing ";SU->dump(DAG););
|
DEBUG(dbgs() << "Bottom Releasing ";SU->dump(DAG););
|
||||||
|
if (isPhysicalRegCopy(SU->getInstr())) {
|
||||||
|
PhysicalRegCopy.push_back(SU);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int IK = getInstKind(SU);
|
int IK = getInstKind(SU);
|
||||||
|
|
||||||
|
@@ -54,6 +54,7 @@ class R600SchedStrategy : public MachineSchedStrategy {
|
|||||||
std::vector<SUnit *> AvailableAlus[AluLast];
|
std::vector<SUnit *> AvailableAlus[AluLast];
|
||||||
std::vector<SUnit *> UnscheduledARDefs;
|
std::vector<SUnit *> UnscheduledARDefs;
|
||||||
std::vector<SUnit *> UnscheduledARUses;
|
std::vector<SUnit *> UnscheduledARUses;
|
||||||
|
std::vector<SUnit *> PhysicalRegCopy;
|
||||||
|
|
||||||
InstKind CurInstKind;
|
InstKind CurInstKind;
|
||||||
int CurEmitted;
|
int CurEmitted;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
;CHECK: MOV * T{{[0-9]+\.[XYZW], \|PV\.[XYZW]\|}}
|
;CHECK: MOV * T{{[0-9]+\.[XYZW], \|T[0-9]+\.[XYZW]\|}}
|
||||||
|
|
||||||
define void @test() {
|
define void @test() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
; CHECK: @fadd_f32
|
; CHECK: @fadd_f32
|
||||||
; CHECK: ADD * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
|
; CHECK: ADD * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @fadd_f32() {
|
define void @fadd_f32() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
;CHECK: FLOOR * T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
|
;CHECK: FLOOR * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @test() {
|
define void @test() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
;CHECK: MULADD_IEEE * {{T[0-9]+\.[XYZW], PV\.[XYZW], PV.[XYZW], PV\.[XYZW]}}
|
;CHECK: MULADD_IEEE * {{T[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @test() {
|
define void @test() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
;CHECK: MAX * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
|
;CHECK: MAX * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @test() {
|
define void @test() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
;CHECK: MIN * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
|
;CHECK: MIN * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @test() {
|
define void @test() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
; CHECK: @fmul_f32
|
; CHECK: @fmul_f32
|
||||||
; CHECK: MUL_IEEE * {{T[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
|
; CHECK: MUL_IEEE * {{T[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @fmul_f32() {
|
define void @fmul_f32() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
; CHECK: @fsub_f32
|
; CHECK: @fsub_f32
|
||||||
; CHECK: ADD * T{{[0-9]+\.[XYZW], PV\.[XYZW], -PV\.[XYZW]}}
|
; CHECK: ADD * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], -T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @fsub_f32() {
|
define void @fsub_f32() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
|
;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @test() {
|
define void @test() {
|
||||||
%r0 = call float @llvm.R600.load.input(i32 0)
|
%r0 = call float @llvm.R600.load.input(i32 0)
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||||
|
|
||||||
;CHECK: LOG_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
;CHECK: LOG_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], PV\.[XYZW], T[0-9]+\.[XYZW]}}
|
;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
;CHECK-NEXT: EXP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
;CHECK-NEXT: EXP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
|
||||||
|
|
||||||
define void @test() {
|
define void @test() {
|
||||||
|
Reference in New Issue
Block a user