Skip to content

Commit 3424023

Browse files
quic-asaravanhjagasiaAMDkparzysz
committed
[HEXAGON] Utilize new mask instruction
Co-authored-by: Harsha Jagasia <[email protected]> Co-authored-by: Krzysztof Parzyszek <[email protected]>
1 parent a8e1c3e commit 3424023

File tree

4 files changed

+140
-0
lines changed

4 files changed

+140
-0
lines changed

llvm/lib/Target/Hexagon/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ add_llvm_target(HexagonCodeGen
4848
HexagonLoopIdiomRecognition.cpp
4949
HexagonMachineFunctionInfo.cpp
5050
HexagonMachineScheduler.cpp
51+
HexagonMask.cpp
5152
HexagonMCInstLower.cpp
5253
HexagonNewValueJump.cpp
5354
HexagonOptAddrMode.cpp
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
//===-- HexagonMask.cpp - replace const ext tfri with mask ------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
//===----------------------------------------------------------------------===//
10+
11+
#define DEBUG_TYPE "mask"
12+
13+
#include "HexagonMachineFunctionInfo.h"
14+
#include "HexagonSubtarget.h"
15+
#include "HexagonTargetMachine.h"
16+
#include "llvm/ADT/SmallString.h"
17+
#include "llvm/ADT/Statistic.h"
18+
#include "llvm/ADT/Twine.h"
19+
#include "llvm/CodeGen/MachineFunction.h"
20+
#include "llvm/CodeGen/MachineFunctionPass.h"
21+
#include "llvm/CodeGen/MachineInstrBuilder.h"
22+
#include "llvm/CodeGen/Passes.h"
23+
#include "llvm/CodeGen/TargetInstrInfo.h"
24+
#include "llvm/IR/Function.h"
25+
#include "llvm/IR/Module.h"
26+
#include "llvm/Support/CommandLine.h"
27+
#include "llvm/Support/Debug.h"
28+
#include "llvm/Support/MathExtras.h"
29+
#include "llvm/Target/TargetMachine.h"
30+
31+
#if defined(_MSC_VER)
32+
#include <intrin.h>
33+
#endif
34+
35+
using namespace llvm;
36+
37+
namespace llvm {
38+
FunctionPass *createHexagonMask();
39+
void initializeHexagonMaskPass(PassRegistry &);
40+
41+
class HexagonMask : public MachineFunctionPass {
42+
public:
43+
static char ID;
44+
HexagonMask() : MachineFunctionPass(ID) {
45+
PassRegistry &Registry = *PassRegistry::getPassRegistry();
46+
initializeHexagonMaskPass(Registry);
47+
}
48+
49+
StringRef getPassName() const override {
50+
return "Hexagon replace const ext tfri with mask";
51+
}
52+
bool runOnMachineFunction(MachineFunction &MF) override;
53+
54+
private:
55+
const HexagonInstrInfo *HII;
56+
void replaceConstExtTransferImmWithMask(MachineFunction &MF);
57+
};
58+
59+
char HexagonMask::ID = 0;
60+
61+
void HexagonMask::replaceConstExtTransferImmWithMask(MachineFunction &MF) {
62+
for (auto &MBB : MF) {
63+
for (auto &MI : llvm::make_early_inc_range(MBB)) {
64+
if (MI.getOpcode() != Hexagon::A2_tfrsi)
65+
continue;
66+
67+
const MachineOperand &Op0 = MI.getOperand(0);
68+
const MachineOperand &Op1 = MI.getOperand(1);
69+
if (!Op1.isImm())
70+
continue;
71+
int32_t V = Op1.getImm();
72+
if (isInt<16>(V))
73+
continue;
74+
75+
unsigned Idx, Len;
76+
if (!isShiftedMask_32(V, Idx, Len))
77+
continue;
78+
if (!isUInt<5>(Idx) || !isUInt<5>(Len))
79+
continue;
80+
81+
BuildMI(MBB, MI, MI.getDebugLoc(), HII->get(Hexagon::S2_mask),
82+
Op0.getReg())
83+
.addImm(Len)
84+
.addImm(Idx);
85+
MBB.erase(MI);
86+
}
87+
}
88+
}
89+
90+
bool HexagonMask::runOnMachineFunction(MachineFunction &MF) {
91+
auto &HST = MF.getSubtarget<HexagonSubtarget>();
92+
HII = HST.getInstrInfo();
93+
const Function &F = MF.getFunction();
94+
95+
if (!F.hasFnAttribute(Attribute::OptimizeForSize))
96+
return false;
97+
98+
replaceConstExtTransferImmWithMask(MF);
99+
100+
return true;
101+
}
102+
103+
} // namespace llvm
104+
105+
//===----------------------------------------------------------------------===//
106+
// Public Constructor Functions
107+
//===----------------------------------------------------------------------===//
108+
109+
INITIALIZE_PASS(HexagonMask, "hexagon-mask", "Hexagon mask", false, false)
110+
111+
FunctionPass *llvm::createHexagonMask() { return new HexagonMask(); }

llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ static cl::opt<bool>
5959
DisableHCP("disable-hcp", cl::Hidden,
6060
cl::desc("Disable Hexagon constant propagation"));
6161

62+
static cl::opt<bool> DisableHexagonMask(
63+
"disable-mask", cl::Hidden,
64+
cl::desc("Disable Hexagon specific Mask generation pass"));
65+
6266
static cl::opt<bool> DisableStoreWidening("disable-store-widen", cl::Hidden,
6367
cl::init(false),
6468
cl::desc("Disable store widening"));
@@ -180,6 +184,8 @@ void initializeHexagonGenMuxPass(PassRegistry &);
180184
void initializeHexagonHardwareLoopsPass(PassRegistry &);
181185
void initializeHexagonLoopIdiomRecognizeLegacyPassPass(PassRegistry &);
182186
void initializeHexagonLoopAlignPass(PassRegistry &);
187+
void initializeHexagonMaskPass(PassRegistry &);
188+
void initializeHexagonMergeActivateWeightPass(PassRegistry &);
183189
void initializeHexagonNewValueJumpPass(PassRegistry &);
184190
void initializeHexagonOptAddrModePass(PassRegistry &);
185191
void initializeHexagonPacketizerPass(PassRegistry &);
@@ -213,6 +219,8 @@ FunctionPass *createHexagonISelDag(HexagonTargetMachine &TM,
213219
CodeGenOptLevel OptLevel);
214220
FunctionPass *createHexagonLoopAlign();
215221
FunctionPass *createHexagonLoopRescheduling();
222+
FunctionPass *createHexagonMask();
223+
FunctionPass *createHexagonMergeActivateWeight();
216224
FunctionPass *createHexagonNewValueJump();
217225
FunctionPass *createHexagonOptAddrMode();
218226
FunctionPass *createHexagonOptimizeSZextends();
@@ -474,10 +482,13 @@ void HexagonPassConfig::addPostRegAlloc() {
474482
}
475483

476484
void HexagonPassConfig::addPreSched2() {
485+
bool NoOpt = (getOptLevel() == CodeGenOptLevel::None);
477486
addPass(createHexagonCopyToCombine());
478487
if (getOptLevel() != CodeGenOptLevel::None)
479488
addPass(&IfConverterID);
480489
addPass(createHexagonSplitConst32AndConst64());
490+
if (!NoOpt && !DisableHexagonMask)
491+
addPass(createHexagonMask());
481492
}
482493

483494
void HexagonPassConfig::addPreEmitPass() {

llvm/test/CodeGen/Hexagon/mask.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; RUN: llc -mtriple=hexagon -mcpu=hexagonv73 < %s | FileCheck %s
2+
3+
target triple = "hexagon"
4+
5+
; CHECK-LABEL: test1:
6+
; CHECK: r0 = mask(#25,#2)
7+
; Function Attrs: optsize
8+
define i32 @test1() #1 {
9+
entry:
10+
%0 = call i32 @llvm.hexagon.A2.tfr(i32 134217724)
11+
ret i32 %0
12+
}
13+
14+
declare i32 @llvm.hexagon.A2.tfr(i32) #0
15+
16+
attributes #0 = { nounwind readnone }
17+
attributes #1 = { optsize }

0 commit comments

Comments
 (0)