diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
| commit | 344a3780b2e33f6ca763666c380202b18aab72a3 (patch) | |
| tree | f0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp | |
| parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
vendor/llvm-project/llvmorg-13-init-16847-g88e66fa60ae5vendor/llvm-project/llvmorg-12.0.1-rc2-0-ge7dac564cd0evendor/llvm-project/llvmorg-12.0.1-0-gfed41342a82f
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp | 67 |
1 files changed, 12 insertions, 55 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp b/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp index a8cba3f5cc5c..3dd27f1996d6 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp @@ -41,9 +41,6 @@ class AMDGPUMCInstLower { const TargetSubtargetInfo &ST; const AsmPrinter &AP; - const MCExpr *getLongBranchBlockExpr(const MachineBasicBlock &SrcBB, - const MachineOperand &MO) const; - public: AMDGPUMCInstLower(MCContext &ctx, const TargetSubtargetInfo &ST, const AsmPrinter &AP); @@ -95,54 +92,21 @@ static MCSymbolRefExpr::VariantKind getVariantKind(unsigned MOFlags) { } } -const MCExpr *AMDGPUMCInstLower::getLongBranchBlockExpr( - const MachineBasicBlock &SrcBB, - const MachineOperand &MO) const { - const MCExpr *DestBBSym - = MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx); - const MCExpr *SrcBBSym = MCSymbolRefExpr::create(SrcBB.getSymbol(), Ctx); - - // FIXME: The first half of this assert should be removed. This should - // probably be PC relative instead of using the source block symbol, and - // therefore the indirect branch expansion should use a bundle. - assert( - skipDebugInstructionsForward(SrcBB.begin(), SrcBB.end())->getOpcode() == - AMDGPU::S_GETPC_B64 && - ST.getInstrInfo()->get(AMDGPU::S_GETPC_B64).Size == 4); - - // s_getpc_b64 returns the address of next instruction. - const MCConstantExpr *One = MCConstantExpr::create(4, Ctx); - SrcBBSym = MCBinaryExpr::createAdd(SrcBBSym, One, Ctx); - - if (MO.getTargetFlags() == SIInstrInfo::MO_LONG_BRANCH_FORWARD) - return MCBinaryExpr::createSub(DestBBSym, SrcBBSym, Ctx); - - assert(MO.getTargetFlags() == SIInstrInfo::MO_LONG_BRANCH_BACKWARD); - return MCBinaryExpr::createSub(SrcBBSym, DestBBSym, Ctx); -} - bool AMDGPUMCInstLower::lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const { switch (MO.getType()) { default: - llvm_unreachable("unknown operand type"); + break; case MachineOperand::MO_Immediate: MCOp = MCOperand::createImm(MO.getImm()); return true; case MachineOperand::MO_Register: MCOp = MCOperand::createReg(AMDGPU::getMCReg(MO.getReg(), ST)); return true; - case MachineOperand::MO_MachineBasicBlock: { - if (MO.getTargetFlags() != 0) { - MCOp = MCOperand::createExpr( - getLongBranchBlockExpr(*MO.getParent()->getParent(), MO)); - } else { - MCOp = MCOperand::createExpr( + case MachineOperand::MO_MachineBasicBlock: + MCOp = MCOperand::createExpr( MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx)); - } - return true; - } case MachineOperand::MO_GlobalAddress: { const GlobalValue *GV = MO.getGlobal(); SmallString<128> SymbolName; @@ -168,7 +132,15 @@ bool AMDGPUMCInstLower::lowerOperand(const MachineOperand &MO, case MachineOperand::MO_RegisterMask: // Regmasks are like implicit defs. return false; + case MachineOperand::MO_MCSymbol: + if (MO.getTargetFlags() == SIInstrInfo::MO_FAR_BRANCH_OFFSET) { + MCSymbol *Sym = MO.getMCSymbol(); + MCOp = MCOperand::createExpr(Sym->getVariableValue()); + return true; + } + break; } + llvm_unreachable("unknown operand type"); } void AMDGPUMCInstLower::lower(const MachineInstr *MI, MCInst &OutMI) const { @@ -274,24 +246,9 @@ void AMDGPUAsmPrinter::emitInstruction(const MachineInstr *MI) { ++I; } } else { - // We don't want SI_MASK_BRANCH/SI_RETURN_TO_EPILOG encoded. They are + // We don't want these pseudo instructions encoded. They are // placeholder terminator instructions and should only be printed as // comments. - if (MI->getOpcode() == AMDGPU::SI_MASK_BRANCH) { - if (isVerbose()) { - SmallVector<char, 16> BBStr; - raw_svector_ostream Str(BBStr); - - const MachineBasicBlock *MBB = MI->getOperand(0).getMBB(); - const MCSymbolRefExpr *Expr - = MCSymbolRefExpr::create(MBB->getSymbol(), OutContext); - Expr->print(Str, MAI); - OutStreamer->emitRawComment(Twine(" mask branch ") + BBStr); - } - - return; - } - if (MI->getOpcode() == AMDGPU::SI_RETURN_TO_EPILOG) { if (isVerbose()) OutStreamer->emitRawComment(" return to shader part epilog"); |
