diff options
author | Vincent Lejeune <vljn@ovi.com> | 2013-12-02 17:29:37 +0000 |
---|---|---|
committer | Vincent Lejeune <vljn@ovi.com> | 2013-12-02 17:29:37 +0000 |
commit | 4b8d9e303c2dd63542e327d49ddcdb53b8dca25b (patch) | |
tree | 240a76d7d64df0a0e6fb4aeb564c9bfcbab2c40b /llvm/lib/Target/R600/R600ControlFlowFinalizer.cpp | |
parent | 604dfec8dcfbbb899820022ce7bab7ad57618f8a (diff) | |
download | llvm-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.cpp | 10 |
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(); |