mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04: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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315735 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
...
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user