aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp
diff options
context:
space:
mode:
authorVincent Lejeune <vljn@ovi.com>2013-12-02 17:29:37 +0000
committerVincent Lejeune <vljn@ovi.com>2013-12-02 17:29:37 +0000
commit4b8d9e303c2dd63542e327d49ddcdb53b8dca25b (patch)
tree240a76d7d64df0a0e6fb4aeb564c9bfcbab2c40b /llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp
parent604dfec8dcfbbb899820022ce7bab7ad57618f8a (diff)
downloadllvm-4b8d9e303c2dd63542e327d49ddcdb53b8dca25b.zip
llvm-4b8d9e303c2dd63542e327d49ddcdb53b8dca25b.tar.gz
llvm-4b8d9e303c2dd63542e327d49ddcdb53b8dca25b.tar.bz2
R600: Workaround for cayman loop bug
llvm-svn: 196121
Diffstat (limited to 'llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp')
-rw-r--r--llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp b/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp
index ac3d8f6..ec39e09 100644
--- a/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp
+++ b/llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp
@@ -332,6 +332,7 @@ public:
unsigned MaxStack = 0;
unsigned CurrentStack = 0;
+ unsigned CurrentLoopDepth = 0;
bool HasPush = false;
for (MachineFunction::iterator MB = MF.begin(), ME = MF.end(); MB != ME;
++MB) {
@@ -370,6 +371,13 @@ public:
CurrentStack++;
MaxStack = std::max(MaxStack, CurrentStack);
HasPush = true;
+ if (ST.hasCaymanISA() && CurrentLoopDepth > 1) {
+ BuildMI(MBB, MI, MBB.findDebugLoc(MI), TII->get(AMDGPU::CF_PUSH_CM))
+ .addImm(CfCount + 1)
+ .addImm(1);
+ MI->setDesc(TII->get(AMDGPU::CF_ALU));
+ CfCount++;
+ }
case AMDGPU::CF_ALU:
I = MI;
AluClauses.push_back(MakeALUClause(MBB, I));
@@ -378,6 +386,7 @@ public:
break;
case AMDGPU::WHILELOOP: {
CurrentStack+=4;
+ CurrentLoopDepth++;
MaxStack = std::max(MaxStack, CurrentStack);
MachineInstr *MIb = BuildMI(MBB, MI, MBB.findDebugLoc(MI),
getHWInstrDesc(CF_WHILE_LOOP))
@@ -392,6 +401,7 @@ public:
}
case AMDGPU::ENDLOOP: {
CurrentStack-=4;
+ CurrentLoopDepth--;
std::pair<unsigned, std::set<MachineInstr *> > Pair =
LoopStack.back();
LoopStack.pop_back();