forked from OSchip/llvm-project
[CodeGen] Move printing MO_Immediate operands to MachineOperand::print
Work towards the unification of MIR and debug output by refactoring the interfaces. Add support for operand subreg index as an immediate to debug printing and use ::print in the MIRPrinter. Differential Review: https://reviews.llvm.org/D40965 llvm-svn: 320209
This commit is contained in:
parent
9b8caf5bd7
commit
440f69c95a
|
@ -430,6 +430,35 @@ immediate machine operand ``-42``:
|
|||
|
||||
%eax = MOV32ri -42
|
||||
|
||||
An immediate operand is also used to represent a subregister index when the
|
||||
machine instruction has one of the following opcodes:
|
||||
|
||||
- ``EXTRACT_SUBREG``
|
||||
|
||||
- ``INSERT_SUBREG``
|
||||
|
||||
- ``REG_SEQUENCE``
|
||||
|
||||
- ``SUBREG_TO_REG``
|
||||
|
||||
In case this is true, the Machine Operand is printed according to the target.
|
||||
|
||||
For example:
|
||||
|
||||
In AArch64RegisterInfo.td:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
def sub_32 : SubRegIndex<32>;
|
||||
|
||||
If the third operand is an immediate with the value ``15`` (target-dependent
|
||||
value), based on the instruction's opcode and the operand's index the operand
|
||||
will be printed as ``%subreg.sub_32``:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
%1:gpr64 = SUBREG_TO_REG 0, %0, %subreg.sub_32
|
||||
|
||||
For integers > 64bit, we use a special machine operand, ``MO_CImmediate``,
|
||||
which stores the immediate in a ``ConstantInt`` using an ``APInt`` (LLVM's
|
||||
arbitrary precision integers).
|
||||
|
|
|
@ -227,6 +227,13 @@ public:
|
|||
///
|
||||
void clearParent() { ParentMI = nullptr; }
|
||||
|
||||
/// Print a subreg index operand.
|
||||
/// MO_Immediate operands can also be subreg idices. If it's the case, the
|
||||
/// subreg index name will be printed. MachineInstr::isOperandSubregIdx can be
|
||||
/// called to check this.
|
||||
static void printSubregIdx(raw_ostream &OS, uint64_t Index,
|
||||
const TargetRegisterInfo *TRI);
|
||||
|
||||
/// Print the MachineOperand to \p os.
|
||||
/// Providing a valid \p TRI and \p IntrinsicInfo results in a more
|
||||
/// target-specific printing. If \p TRI and \p IntrinsicInfo are null, the
|
||||
|
|
|
@ -854,23 +854,23 @@ void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx,
|
|||
const MachineOperand &Op = MI.getOperand(OpIdx);
|
||||
printTargetFlags(Op);
|
||||
switch (Op.getType()) {
|
||||
case MachineOperand::MO_Immediate:
|
||||
if (MI.isOperandSubregIdx(OpIdx)) {
|
||||
MachineOperand::printSubregIdx(OS, Op.getImm(), TRI);
|
||||
break;
|
||||
}
|
||||
LLVM_FALLTHROUGH;
|
||||
case MachineOperand::MO_Register:
|
||||
case MachineOperand::MO_CImmediate:
|
||||
case MachineOperand::MO_MachineBasicBlock: {
|
||||
unsigned TiedOperandIdx = 0;
|
||||
if (ShouldPrintRegisterTies && Op.isTied() && !Op.isDef())
|
||||
if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef())
|
||||
TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx);
|
||||
const TargetIntrinsicInfo *TII = MI.getMF()->getTarget().getIntrinsicInfo();
|
||||
Op.print(OS, MST, TypeToPrint, PrintDef, ShouldPrintRegisterTies,
|
||||
TiedOperandIdx, TRI, TII);
|
||||
break;
|
||||
}
|
||||
case MachineOperand::MO_Immediate:
|
||||
if (MI.isOperandSubregIdx(OpIdx))
|
||||
OS << "%subreg." << TRI->getSubRegIndexName(Op.getImm());
|
||||
else
|
||||
OS << Op.getImm();
|
||||
break;
|
||||
case MachineOperand::MO_FPImmediate:
|
||||
Op.getFPImm()->printAsOperand(OS, /*PrintType=*/true, MST);
|
||||
break;
|
||||
|
|
|
@ -1405,8 +1405,11 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,
|
|||
} else {
|
||||
LLT TypeToPrint = MRI ? getTypeToPrint(i, PrintedTypes, *MRI) : LLT{};
|
||||
unsigned TiedOperandIdx = getTiedOperandIdx(i);
|
||||
MO.print(OS, MST, TypeToPrint, /*PrintDef=*/true, ShouldPrintRegisterTies,
|
||||
TiedOperandIdx, TRI, IntrinsicInfo);
|
||||
if (MO.isImm() && isOperandSubregIdx(i))
|
||||
MachineOperand::printSubregIdx(OS, MO.getImm(), TRI);
|
||||
else
|
||||
MO.print(OS, MST, TypeToPrint, /*PrintDef=*/true,
|
||||
ShouldPrintRegisterTies, TiedOperandIdx, TRI, IntrinsicInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -345,6 +345,15 @@ static void tryToGetTargetInfo(const MachineOperand &MO,
|
|||
}
|
||||
}
|
||||
|
||||
void MachineOperand::printSubregIdx(raw_ostream &OS, uint64_t Index,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
OS << "%subreg.";
|
||||
if (TRI)
|
||||
OS << TRI->getSubRegIndexName(Index);
|
||||
else
|
||||
OS << Index;
|
||||
}
|
||||
|
||||
void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI,
|
||||
const TargetIntrinsicInfo *IntrinsicInfo) const {
|
||||
tryToGetTargetInfo(*this, TRI, IntrinsicInfo);
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/ModuleSlotTracker.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
|
@ -100,4 +101,22 @@ TEST(MachineOperandTest, PrintCImm) {
|
|||
ASSERT_TRUE(OS.str() == "i128 18446744073709551616");
|
||||
}
|
||||
|
||||
TEST(MachineOperandTest, PrintSubRegIndex) {
|
||||
// Create a MachineOperand with an immediate and print it as a subreg index.
|
||||
MachineOperand MO = MachineOperand::CreateImm(3);
|
||||
|
||||
// Checking some preconditions on the newly created
|
||||
// MachineOperand.
|
||||
ASSERT_TRUE(MO.isImm());
|
||||
ASSERT_TRUE(MO.getImm() == 3);
|
||||
|
||||
// Print a MachineOperand containing a SubRegIdx. Here we check that without a
|
||||
// TRI and IntrinsicInfo we can print the operand as a subreg index.
|
||||
std::string str;
|
||||
raw_string_ostream OS(str);
|
||||
ModuleSlotTracker DummyMST(nullptr);
|
||||
MachineOperand::printSubregIdx(OS, MO.getImm(), nullptr);
|
||||
ASSERT_TRUE(OS.str() == "%subreg.3");
|
||||
}
|
||||
|
||||
} // end namespace
|
||||
|
|
Loading…
Reference in New Issue