summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
commit344a3780b2e33f6ca763666c380202b18aab72a3 (patch)
treef0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp
parentb60736ec1405bb0a8dd40989f67ef4c93da068ab (diff)
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp67
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");