Skip to content

Commit d62ca8d

Browse files
author
Sumanth Gundapaneni
authored
[Hexagon] Optimize post-increment load and stores in loops. (#82418)
This patch optimizes the post-increment instructions so that we can packetize them together. v1 = phi(v0, v3') v2,v3 = post_load v1, 4 v2',v3'= post_load v3, 4 This can be optimized in two ways v1 = phi(v0, v3') v2,v3' = post_load v1, 8 v2' = load v1, 4
1 parent 4c0fdcd commit d62ca8d

File tree

11 files changed

+1462
-1
lines changed

11 files changed

+1462
-1
lines changed

llvm/lib/Target/Hexagon/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ add_llvm_target(HexagonCodeGen
5151
HexagonOptAddrMode.cpp
5252
HexagonOptimizeSZextends.cpp
5353
HexagonPeephole.cpp
54+
HexagonPostIncOpt.cpp
5455
HexagonRDFOpt.cpp
5556
HexagonRegisterInfo.cpp
5657
HexagonSelectionDAGInfo.cpp

llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,13 @@ bool HexagonInstrInfo::isPostIncrement(const MachineInstr &MI) const {
16551655
return getAddrMode(MI) == HexagonII::PostInc;
16561656
}
16571657

1658+
bool HexagonInstrInfo::isPostIncWithImmOffset(const MachineInstr &MI) const {
1659+
unsigned BasePos, OffsetPos;
1660+
if (!getBaseAndOffsetPosition(MI, BasePos, OffsetPos))
1661+
return false;
1662+
return isPostIncrement(MI) && MI.getOperand(OffsetPos).isImm();
1663+
}
1664+
16581665
// Returns true if an instruction is predicated irrespective of the predicate
16591666
// sense. For example, all of the following will return true.
16601667
// if (p0) R1 = add(R2, R3)
@@ -2436,6 +2443,55 @@ bool HexagonInstrInfo::isLoopN(const MachineInstr &MI) const {
24362443
Opcode == Hexagon::J2_loop1rext;
24372444
}
24382445

2446+
bool HexagonInstrInfo::isCircBufferInstr(const MachineInstr &MI) const {
2447+
switch (MI.getOpcode()) {
2448+
default:
2449+
return false;
2450+
case Hexagon::L2_loadalignb_pci:
2451+
case Hexagon::L2_loadalignb_pcr:
2452+
case Hexagon::L2_loadalignh_pci:
2453+
case Hexagon::L2_loadalignh_pcr:
2454+
case Hexagon::L2_loadbsw2_pci:
2455+
case Hexagon::L2_loadbsw2_pcr:
2456+
case Hexagon::L2_loadbsw4_pci:
2457+
case Hexagon::L2_loadbsw4_pcr:
2458+
case Hexagon::L2_loadbzw2_pci:
2459+
case Hexagon::L2_loadbzw2_pcr:
2460+
case Hexagon::L2_loadbzw4_pci:
2461+
case Hexagon::L2_loadbzw4_pcr:
2462+
case Hexagon::L2_loadrb_pci:
2463+
case Hexagon::L2_loadrb_pcr:
2464+
case Hexagon::L2_loadrd_pci:
2465+
case Hexagon::L2_loadrd_pcr:
2466+
case Hexagon::L2_loadrh_pci:
2467+
case Hexagon::L2_loadrh_pcr:
2468+
case Hexagon::L2_loadri_pci:
2469+
case Hexagon::L2_loadri_pcr:
2470+
case Hexagon::L2_loadrub_pci:
2471+
case Hexagon::L2_loadrub_pcr:
2472+
case Hexagon::L2_loadruh_pci:
2473+
case Hexagon::L2_loadruh_pcr:
2474+
case Hexagon::S2_storerbnew_pci:
2475+
case Hexagon::S2_storerbnew_pcr:
2476+
case Hexagon::S2_storerb_pci:
2477+
case Hexagon::S2_storerb_pcr:
2478+
case Hexagon::S2_storerd_pci:
2479+
case Hexagon::S2_storerd_pcr:
2480+
case Hexagon::S2_storerf_pci:
2481+
case Hexagon::S2_storerf_pcr:
2482+
case Hexagon::S2_storerhnew_pci:
2483+
case Hexagon::S2_storerhnew_pcr:
2484+
case Hexagon::S2_storerh_pci:
2485+
case Hexagon::S2_storerh_pcr:
2486+
case Hexagon::S2_storerinew_pci:
2487+
case Hexagon::S2_storerinew_pcr:
2488+
case Hexagon::S2_storeri_pci:
2489+
case Hexagon::S2_storeri_pcr:
2490+
return true;
2491+
}
2492+
return false;
2493+
}
2494+
24392495
bool HexagonInstrInfo::isMemOp(const MachineInstr &MI) const {
24402496
switch (MI.getOpcode()) {
24412497
default: return false;

llvm/lib/Target/Hexagon/HexagonInstrInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,8 @@ class HexagonInstrInfo : public HexagonGenInstrInfo {
434434
bool predCanBeUsedAsDotNew(const MachineInstr &MI, Register PredReg) const;
435435
bool PredOpcodeHasJMP_c(unsigned Opcode) const;
436436
bool predOpcodeHasNot(ArrayRef<MachineOperand> Cond) const;
437+
bool isPostIncWithImmOffset(const MachineInstr &MI) const;
438+
bool isCircBufferInstr(const MachineInstr &MI) const;
437439

438440
unsigned getAddrMode(const MachineInstr &MI) const;
439441
MachineOperand *getBaseAndOffset(const MachineInstr &MI, int64_t &Offset,

0 commit comments

Comments
 (0)