1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[Hexagon] Minimize number of repeated constant extenders

Each constant extender requires an extra instruction, which adds to the
code size and also reduces the number of available slots in an instruction
packet. In most cases, the value of a repeated constant extender could be
loaded into a register, and the instructions using the extender could be
replaced with their counterparts that use that register instead.

This patch adds a pass that tries to reduce the number of constant
extenders, including extenders which differ only in an immediate offset
known at compile time, e.g. @global and @global+12.

llvm-svn: 315735
This commit is contained in:
Krzysztof Parzyszek 2017-10-13 19:02:59 +00:00
parent 7e5a45423e
commit fb2c0df237
5 changed files with 1939 additions and 1 deletions

View File

@ -20,6 +20,7 @@ add_llvm_target(HexagonCodeGen
HexagonBranchRelaxation.cpp
HexagonCFGOptimizer.cpp
HexagonCommonGEP.cpp
HexagonConstExtenders.cpp
HexagonConstPropagation.cpp
HexagonCopyToCombine.cpp
HexagonEarlyIfConv.cpp

File diff suppressed because it is too large Load Diff

View File

@ -28,6 +28,9 @@
using namespace llvm;
static cl::opt<bool> EnableCExtOpt("hexagon-cext", cl::Hidden, cl::ZeroOrMore,
cl::init(true), cl::desc("Enable Hexagon constant-extender optimization"));
static cl::opt<bool> EnableRDFOpt("rdf-opt", cl::Hidden, cl::ZeroOrMore,
cl::init(true), cl::desc("Enable RDF-based optimizations"));
@ -119,6 +122,7 @@ SchedCustomRegistry("hexagon", "Run Hexagon's custom scheduler",
namespace llvm {
extern char &HexagonExpandCondsetsID;
void initializeHexagonConstExtendersPass(PassRegistry&);
void initializeHexagonEarlyIfConversionPass(PassRegistry&);
void initializeHexagonExpandCondsetsPass(PassRegistry&);
void initializeHexagonGenMuxPass(PassRegistry&);
@ -135,6 +139,7 @@ namespace llvm {
FunctionPass *createHexagonCallFrameInformation();
FunctionPass *createHexagonCFGOptimizer();
FunctionPass *createHexagonCommonGEP();
FunctionPass *createHexagonConstExtenders();
FunctionPass *createHexagonConstPropagationPass();
FunctionPass *createHexagonCopyToCombine();
FunctionPass *createHexagonEarlyIfConversion();
@ -176,6 +181,7 @@ extern "C" void LLVMInitializeHexagonTarget() {
RegisterTargetMachine<HexagonTargetMachine> X(getTheHexagonTarget());
PassRegistry &PR = *PassRegistry::getPassRegistry();
initializeHexagonConstExtendersPass(PR);
initializeHexagonEarlyIfConversionPass(PR);
initializeHexagonGenMuxPass(PR);
initializeHexagonLoopIdiomRecognizePass(PR);
@ -340,6 +346,8 @@ bool HexagonPassConfig::addInstSelector() {
void HexagonPassConfig::addPreRegAlloc() {
if (getOptLevel() != CodeGenOpt::None) {
if (EnableCExtOpt)
addPass(createHexagonConstExtenders());
if (EnableExpandCondsets)
insertPass(&RegisterCoalescerID, &HexagonExpandCondsetsID);
if (!DisableStoreWidening)

View File

@ -0,0 +1,75 @@
# RUN: llc -march=hexagon -run-pass hexagon-cext-opt -hexagon-cext-threshold=3 %s -o - | FileCheck %s
--- |
define void @test0() { ret void }
define void @test1() { ret void }
define void @test2() { ret void }
@global_address = global [1024 x i32] zeroinitializer, align 8
...
# CHECK-LABEL: name: test0
# CHECK: [[B:%[0-9]+]] = A2_tfrsi @global_address
# CHECK: L2_loadri_io [[B]], 0
# CHECK: L2_loadri_io [[B]], 4
# CHECK: L2_loadri_io [[B]], 8
---
name: test0
registers:
- { id: 0, class: intregs }
- { id: 1, class: intregs }
- { id: 2, class: intregs }
body: |
bb.0:
%0 = PS_loadriabs @global_address
%1 = PS_loadriabs @global_address+4
%2 = PS_loadriabs @global_address+8
...
# CHECK-LABEL: name: test1
# CHECK: [[C:%[0-9]+]] = COPY %r0
# CHECK: [[B:%[0-9]+]] = A2_addi [[C]], @global_address
# CHECK: L2_loadri_io [[B]], 0
# CHECK: L2_loadri_io [[B]], 4
# CHECK: L2_loadri_io [[B]], 8
---
name: test1
registers:
- { id: 0, class: intregs }
- { id: 1, class: intregs }
- { id: 2, class: intregs }
- { id: 3, class: intregs }
body: |
bb.0:
liveins: %r0
%0 = COPY %r0
%1 = L4_loadri_ur %0, 0, @global_address
%2 = L4_loadri_ur %0, 0, @global_address+4
%3 = L4_loadri_ur %0, 0, @global_address+8
...
# CHECK-LABEL: name: test2
# CHECK: [[C:%[0-9]+]] = COPY %r0
# CHECK: [[B:%[0-9]+]] = A2_tfrsi @global_address + 4
# CHECK: [[T0:%[0-9]+]] = A2_addi [[B]], -4
# CHECK: %r0 = COPY [[T0]]
# CHECK: [[T1:%[0-9]+]] = A2_addi [[B]], -2
# CHECK: %r1 = COPY [[T1]]
# CHECK: L4_loadri_rr [[B]], [[C]], 0
---
name: test2
registers:
- { id: 0, class: intregs }
- { id: 1, class: intregs }
- { id: 2, class: intregs }
- { id: 3, class: intregs }
body: |
bb.0:
liveins: %r0
%0 = COPY %r0
%1 = A2_tfrsi @global_address
%r0 = COPY %1
%2 = A2_tfrsi @global_address+2
%r1 = COPY %2
%3 = L4_loadri_ur %0, 0, @global_address+4
...

View File

@ -1,4 +1,4 @@
; RUN: llc -march=hexagon < %s | FileCheck %s
; RUN: llc -march=hexagon -hexagon-cext=0 < %s | FileCheck %s
@i65_l = external global i65
@i65_s = external global i65