Skip to content

Commit 52b0eea

Browse files
committed
[Xtensa] Implement Hardware Loop optimization pass
1 parent 442f126 commit 52b0eea

24 files changed

+1167
-32
lines changed

llvm/lib/Target/Xtensa/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ add_public_tablegen_target(XtensaCommonTableGen)
1717
add_llvm_target(XtensaCodeGen
1818
XtensaAsmPrinter.cpp
1919
XtensaConstantPoolValue.cpp
20+
XtensaFixupHWLoops.cpp
2021
XtensaFrameLowering.cpp
22+
XtensaHardwareLoops.cpp
2123
XtensaInstrInfo.cpp
2224
XtensaISelDAGToDAG.cpp
2325
XtensaISelLowering.cpp
@@ -28,6 +30,7 @@ add_llvm_target(XtensaCodeGen
2830
XtensaSubtarget.cpp
2931
XtensaTargetMachine.cpp
3032
XtensaTargetObjectFile.cpp
33+
XtensaTargetTransformInfo.cpp
3134

3235
LINK_COMPONENTS
3336
AsmPrinter

llvm/lib/Target/Xtensa/Disassembler/XtensaDisassembler.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,16 @@ static DecodeStatus decodeBranchOperand(MCInst &Inst, uint64_t Imm,
442442
return MCDisassembler::Success;
443443
}
444444

445+
static DecodeStatus decodeLoopOperand(MCInst &Inst, uint64_t Imm,
446+
int64_t Address, const void *Decoder) {
447+
448+
assert(isUInt<8>(Imm) && "Invalid immediate");
449+
if (!tryAddingSymbolicOperand(Imm + 4 + Address, true, Address, 0, 3, Inst,
450+
Decoder))
451+
Inst.addOperand(MCOperand::createImm(Imm));
452+
return MCDisassembler::Success;
453+
}
454+
445455
static DecodeStatus decodeL32ROperand(MCInst &Inst, uint64_t Imm,
446456
int64_t Address, const void *Decoder) {
447457

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaAsmBackend.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ XtensaMCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
6868
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits},
6969
{"fixup_xtensa_l32r_16", 8, 16,
7070
MCFixupKindInfo::FKF_IsPCRel |
71-
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits}};
71+
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits},
72+
{"fixup_xtensa_loop_8", 16, 8, MCFixupKindInfo::FKF_IsPCRel}};
7273

7374
if (Kind < FirstTargetFixupKind)
7475
return MCAsmBackend::getFixupKindInfo(Kind);
@@ -118,6 +119,11 @@ static uint64_t adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
118119
if (Value & 0x3)
119120
Ctx.reportError(Fixup.getLoc(), "fixup value must be 4-byte aligned");
120121
return (Value & 0xffffc) >> 2;
122+
case Xtensa::fixup_xtensa_loop_8:
123+
Value -= 4;
124+
if (!isUInt<8>(Value))
125+
Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
126+
return (Value & 0xff);
121127
case Xtensa::fixup_xtensa_l32r_16:
122128
unsigned Offset = Fixup.getOffset();
123129
if (Offset & 0x3)

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaFixupKinds.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ enum FixupKind {
2222
fixup_xtensa_jump_18,
2323
fixup_xtensa_call_18,
2424
fixup_xtensa_l32r_16,
25+
fixup_xtensa_loop_8,
2526
fixup_xtensa_invalid,
2627
LastTargetFixupKind,
2728
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,21 @@ void XtensaInstPrinter::printBranchTarget(const MCInst *MI, int OpNum,
112112
llvm_unreachable("Invalid operand");
113113
}
114114

115+
void XtensaInstPrinter::printLoopTarget(const MCInst *MI, int OpNum,
116+
raw_ostream &OS) {
117+
const MCOperand &MC = MI->getOperand(OpNum);
118+
if (MI->getOperand(OpNum).isImm()) {
119+
int64_t Val = MC.getImm() + 4;
120+
OS << ". ";
121+
if (Val > 0)
122+
OS << '+';
123+
OS << Val;
124+
} else if (MC.isExpr())
125+
MC.getExpr()->print(OS, &MAI, true);
126+
else
127+
llvm_unreachable("Invalid operand");
128+
}
129+
115130
void XtensaInstPrinter::printJumpTarget(const MCInst *MI, int OpNum,
116131
raw_ostream &OS) {
117132
const MCOperand &MC = MI->getOperand(OpNum);

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class XtensaInstPrinter : public MCInstPrinter {
3636
static void printOperand(const MCOperand &MO, raw_ostream &O);
3737

3838
// Print an address
39-
static void printAddress(unsigned Base, int64_t Disp, raw_ostream &O);
39+
static void printAddress(unsigned Base, int64_t Disp, raw_ostream &O);
4040

4141
// Override MCInstPrinter.
4242
void printRegName(raw_ostream &O, unsigned RegNo) const override;
@@ -48,6 +48,7 @@ class XtensaInstPrinter : public MCInstPrinter {
4848
void printOperand(const MCInst *MI, int OpNum, raw_ostream &O);
4949
void printMemOperand(const MCInst *MI, int OpNUm, raw_ostream &O);
5050
void printBranchTarget(const MCInst *MI, int OpNum, raw_ostream &O);
51+
void printLoopTarget(const MCInst *MI, int OpNum, raw_ostream &O);
5152
void printJumpTarget(const MCInst *MI, int OpNum, raw_ostream &O);
5253
void printCallOperand(const MCInst *MI, int OpNum, raw_ostream &O);
5354
void printL32RTarget(const MCInst *MI, int OpNum, raw_ostream &O);

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCCodeEmitter.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ class XtensaMCCodeEmitter : public MCCodeEmitter {
6767
SmallVectorImpl<MCFixup> &Fixups,
6868
const MCSubtargetInfo &STI) const;
6969

70+
uint32_t getLoopTargetEncoding(const MCInst &MI, unsigned int OpNum,
71+
SmallVectorImpl<MCFixup> &Fixups,
72+
const MCSubtargetInfo &STI) const;
73+
7074
uint32_t getCallEncoding(const MCInst &MI, unsigned int OpNum,
7175
SmallVectorImpl<MCFixup> &Fixups,
7276
const MCSubtargetInfo &STI) const;
@@ -219,6 +223,23 @@ uint32_t XtensaMCCodeEmitter::getBranchTargetEncoding(
219223
}
220224
}
221225

226+
uint32_t
227+
XtensaMCCodeEmitter::getLoopTargetEncoding(const MCInst &MI, unsigned int OpNum,
228+
SmallVectorImpl<MCFixup> &Fixups,
229+
const MCSubtargetInfo &STI) const {
230+
const MCOperand &MO = MI.getOperand(OpNum);
231+
if (MO.isImm())
232+
return static_cast<uint32_t>(MO.getImm());
233+
234+
assert((MO.isExpr()) && "Unexpected operand value!");
235+
236+
const MCExpr *Expr = MO.getExpr();
237+
238+
Fixups.push_back(MCFixup::create(
239+
0, Expr, MCFixupKind(Xtensa::fixup_xtensa_loop_8), MI.getLoc()));
240+
return 0;
241+
}
242+
222243
uint32_t
223244
XtensaMCCodeEmitter::getCallEncoding(const MCInst &MI, unsigned int OpNum,
224245
SmallVectorImpl<MCFixup> &Fixups,

llvm/lib/Target/Xtensa/Xtensa.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,7 @@ class FunctionPass;
2626
FunctionPass *createXtensaISelDag(XtensaTargetMachine &TM,
2727
CodeGenOpt::Level OptLevel);
2828
FunctionPass *createXtensaSizeReductionPass();
29+
FunctionPass *createXtensaHardwareLoops();
30+
FunctionPass *createXtensaFixupHwLoops();
2931
} // namespace llvm
3032
#endif /* LLVM_LIB_TARGET_XTENSA_XTENSA_H */

llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ void XtensaAsmPrinter::emitInstruction(const MachineInstr *MI) {
5353
MCInstBuilder(Xtensa::JX).addReg(MI->getOperand(0).getReg()));
5454
return;
5555
}
56+
case Xtensa::LOOPEND:
57+
return;
5658
}
5759
Lower.lower(MI, LoweredMI);
5860
EmitToStreamer(*OutStreamer, LoweredMI);

0 commit comments

Comments
 (0)