| OLD | NEW |
| 1 //===-- R600ControlFlowFinalizer.cpp - Finalize Control Flow Inst----------===// | 1 //===-- R600ControlFlowFinalizer.cpp - Finalize Control Flow Inst----------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 /// \file | 10 /// \file |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 } | 109 } |
| 110 | 110 |
| 111 bool isCompatibleWithClause(const MachineInstr *MI, | 111 bool isCompatibleWithClause(const MachineInstr *MI, |
| 112 std::set<unsigned> &DstRegs, std::set<unsigned> &SrcRegs) const { | 112 std::set<unsigned> &DstRegs, std::set<unsigned> &SrcRegs) const { |
| 113 unsigned DstMI, SrcMI; | 113 unsigned DstMI, SrcMI; |
| 114 for (MachineInstr::const_mop_iterator I = MI->operands_begin(), | 114 for (MachineInstr::const_mop_iterator I = MI->operands_begin(), |
| 115 E = MI->operands_end(); I != E; ++I) { | 115 E = MI->operands_end(); I != E; ++I) { |
| 116 const MachineOperand &MO = *I; | 116 const MachineOperand &MO = *I; |
| 117 if (!MO.isReg()) | 117 if (!MO.isReg()) |
| 118 continue; | 118 continue; |
| 119 if (MO.isDef()) { | 119 if (MO.isDef()) |
| 120 unsigned Reg = MO.getReg(); | 120 DstMI = MO.getReg(); |
| 121 if (AMDGPU::R600_Reg128RegClass.contains(Reg)) | |
| 122 DstMI = Reg; | |
| 123 else | |
| 124 DstMI = TRI.getMatchingSuperReg(Reg, | |
| 125 TRI.getSubRegFromChannel(TRI.getHWRegChan(Reg)), | |
| 126 &AMDGPU::R600_Reg128RegClass); | |
| 127 } | |
| 128 if (MO.isUse()) { | 121 if (MO.isUse()) { |
| 129 unsigned Reg = MO.getReg(); | 122 unsigned Reg = MO.getReg(); |
| 130 if (AMDGPU::R600_Reg128RegClass.contains(Reg)) | 123 if (AMDGPU::R600_Reg128RegClass.contains(Reg)) |
| 131 SrcMI = Reg; | 124 SrcMI = Reg; |
| 132 else | 125 else |
| 133 SrcMI = TRI.getMatchingSuperReg(Reg, | 126 SrcMI = TRI.getMatchingSuperReg(Reg, |
| 134 TRI.getSubRegFromChannel(TRI.getHWRegChan(Reg)), | 127 TRI.getSubRegFromChannel(TRI.getHWRegChan(Reg)), |
| 135 &AMDGPU::R600_Reg128RegClass); | 128 &AMDGPU::R600_Reg128RegClass); |
| 136 } | 129 } |
| 137 } | 130 } |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 const AMDGPUSubtarget &ST = tm.getSubtarget<AMDGPUSubtarget>(); | 318 const AMDGPUSubtarget &ST = tm.getSubtarget<AMDGPUSubtarget>(); |
| 326 if (ST.device()->getGeneration() <= AMDGPUDeviceInfo::HD4XXX) | 319 if (ST.device()->getGeneration() <= AMDGPUDeviceInfo::HD4XXX) |
| 327 MaxFetchInst = 8; | 320 MaxFetchInst = 8; |
| 328 else | 321 else |
| 329 MaxFetchInst = 16; | 322 MaxFetchInst = 16; |
| 330 } | 323 } |
| 331 | 324 |
| 332 virtual bool runOnMachineFunction(MachineFunction &MF) { | 325 virtual bool runOnMachineFunction(MachineFunction &MF) { |
| 333 unsigned MaxStack = 0; | 326 unsigned MaxStack = 0; |
| 334 unsigned CurrentStack = 0; | 327 unsigned CurrentStack = 0; |
| 335 bool HasPush = false; | 328 bool hasPush; |
| 336 for (MachineFunction::iterator MB = MF.begin(), ME = MF.end(); MB != ME; | 329 for (MachineFunction::iterator MB = MF.begin(), ME = MF.end(); MB != ME; |
| 337 ++MB) { | 330 ++MB) { |
| 338 MachineBasicBlock &MBB = *MB; | 331 MachineBasicBlock &MBB = *MB; |
| 339 unsigned CfCount = 0; | 332 unsigned CfCount = 0; |
| 340 std::vector<std::pair<unsigned, std::set<MachineInstr *> > > LoopStack; | 333 std::vector<std::pair<unsigned, std::set<MachineInstr *> > > LoopStack; |
| 341 std::vector<MachineInstr * > IfThenElseStack; | 334 std::vector<MachineInstr * > IfThenElseStack; |
| 342 R600MachineFunctionInfo *MFI = MF.getInfo<R600MachineFunctionInfo>(); | 335 R600MachineFunctionInfo *MFI = MF.getInfo<R600MachineFunctionInfo>(); |
| 343 if (MFI->ShaderType == 1) { | 336 if (MFI->ShaderType == 1) { |
| 344 BuildMI(MBB, MBB.begin(), MBB.findDebugLoc(MBB.begin()), | 337 BuildMI(MBB, MBB.begin(), MBB.findDebugLoc(MBB.begin()), |
| 345 getHWInstrDesc(CF_CALL_FS)); | 338 getHWInstrDesc(CF_CALL_FS)); |
| 346 CfCount++; | 339 CfCount++; |
| 347 MaxStack = 1; | |
| 348 } | 340 } |
| 349 std::vector<ClauseFile> FetchClauses, AluClauses; | 341 std::vector<ClauseFile> FetchClauses, AluClauses; |
| 350 for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); | 342 for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); |
| 351 I != E;) { | 343 I != E;) { |
| 352 if (TII->usesTextureCache(I) || TII->usesVertexCache(I)) { | 344 if (TII->usesTextureCache(I) || TII->usesVertexCache(I)) { |
| 353 DEBUG(dbgs() << CfCount << ":"; I->dump();); | 345 DEBUG(dbgs() << CfCount << ":"; I->dump();); |
| 354 FetchClauses.push_back(MakeFetchClause(MBB, I)); | 346 FetchClauses.push_back(MakeFetchClause(MBB, I)); |
| 355 CfCount++; | 347 CfCount++; |
| 356 continue; | 348 continue; |
| 357 } | 349 } |
| 358 | 350 |
| 359 MachineBasicBlock::iterator MI = I; | 351 MachineBasicBlock::iterator MI = I; |
| 360 I++; | 352 I++; |
| 361 switch (MI->getOpcode()) { | 353 switch (MI->getOpcode()) { |
| 362 case AMDGPU::CF_ALU_PUSH_BEFORE: | 354 case AMDGPU::CF_ALU_PUSH_BEFORE: |
| 363 CurrentStack++; | 355 CurrentStack++; |
| 364 MaxStack = std::max(MaxStack, CurrentStack); | 356 MaxStack = std::max(MaxStack, CurrentStack); |
| 365 HasPush = true; | 357 hasPush = true; |
| 366 case AMDGPU::CF_ALU: | 358 case AMDGPU::CF_ALU: |
| 367 I = MI; | 359 I = MI; |
| 368 AluClauses.push_back(MakeALUClause(MBB, I)); | 360 AluClauses.push_back(MakeALUClause(MBB, I)); |
| 369 case AMDGPU::EG_ExportBuf: | 361 case AMDGPU::EG_ExportBuf: |
| 370 case AMDGPU::EG_ExportSwz: | 362 case AMDGPU::EG_ExportSwz: |
| 371 case AMDGPU::R600_ExportBuf: | 363 case AMDGPU::R600_ExportBuf: |
| 372 case AMDGPU::R600_ExportSwz: | 364 case AMDGPU::R600_ExportSwz: |
| 373 case AMDGPU::RAT_WRITE_CACHELESS_32_eg: | 365 case AMDGPU::RAT_WRITE_CACHELESS_32_eg: |
| 374 case AMDGPU::RAT_WRITE_CACHELESS_128_eg: | 366 case AMDGPU::RAT_WRITE_CACHELESS_128_eg: |
| 375 DEBUG(dbgs() << CfCount << ":"; MI->dump();); | 367 DEBUG(dbgs() << CfCount << ":"; MI->dump();); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 } | 468 } |
| 477 for (unsigned i = 0, e = FetchClauses.size(); i < e; i++) | 469 for (unsigned i = 0, e = FetchClauses.size(); i < e; i++) |
| 478 EmitFetchClause(I, FetchClauses[i], CfCount); | 470 EmitFetchClause(I, FetchClauses[i], CfCount); |
| 479 for (unsigned i = 0, e = AluClauses.size(); i < e; i++) | 471 for (unsigned i = 0, e = AluClauses.size(); i < e; i++) |
| 480 EmitALUClause(I, AluClauses[i], CfCount); | 472 EmitALUClause(I, AluClauses[i], CfCount); |
| 481 } | 473 } |
| 482 default: | 474 default: |
| 483 break; | 475 break; |
| 484 } | 476 } |
| 485 } | 477 } |
| 486 MFI->StackSize = getHWStackSize(MaxStack, HasPush); | 478 MFI->StackSize = getHWStackSize(MaxStack, hasPush); |
| 487 } | 479 } |
| 488 | 480 |
| 489 return false; | 481 return false; |
| 490 } | 482 } |
| 491 | 483 |
| 492 const char *getPassName() const { | 484 const char *getPassName() const { |
| 493 return "R600 Control Flow Finalizer Pass"; | 485 return "R600 Control Flow Finalizer Pass"; |
| 494 } | 486 } |
| 495 }; | 487 }; |
| 496 | 488 |
| 497 char R600ControlFlowFinalizer::ID = 0; | 489 char R600ControlFlowFinalizer::ID = 0; |
| 498 | 490 |
| 499 } | 491 } |
| 500 | 492 |
| 501 | 493 |
| 502 llvm::FunctionPass *llvm::createR600ControlFlowFinalizer(TargetMachine &TM) { | 494 llvm::FunctionPass *llvm::createR600ControlFlowFinalizer(TargetMachine &TM) { |
| 503 return new R600ControlFlowFinalizer(TM); | 495 return new R600ControlFlowFinalizer(TM); |
| 504 } | 496 } |
| OLD | NEW |