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 |