Skip to content

Commit d9e26c2

Browse files
wangpc-pptstellar
authored andcommitted
[RISCV] Use TableGen-based macro fusion (#72224)
We convert existed macro fusions to TableGen. Bacause `Fusion` depend on `Instruction` definitions which is defined below `RISCVFeatures.td`, so we recommend user to add fusion features when defining new processor. (cherry picked from commit 3fdb431)
1 parent 7cfa0c1 commit d9e26c2

9 files changed

+117
-275
lines changed

llvm/lib/Target/RISCV/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ set(LLVM_TARGET_DEFINITIONS RISCV.td)
55
tablegen(LLVM RISCVGenAsmMatcher.inc -gen-asm-matcher)
66
tablegen(LLVM RISCVGenAsmWriter.inc -gen-asm-writer)
77
tablegen(LLVM RISCVGenCompressInstEmitter.inc -gen-compress-inst-emitter)
8+
tablegen(LLVM RISCVGenMacroFusion.inc -gen-macro-fusion-pred)
89
tablegen(LLVM RISCVGenDAGISel.inc -gen-dag-isel)
910
tablegen(LLVM RISCVGenDisassemblerTables.inc -gen-disassembler)
1011
tablegen(LLVM RISCVGenInstrInfo.inc -gen-instr-info)
@@ -43,7 +44,6 @@ add_llvm_target(RISCVCodeGen
4344
RISCVISelDAGToDAG.cpp
4445
RISCVISelLowering.cpp
4546
RISCVMachineFunctionInfo.cpp
46-
RISCVMacroFusion.cpp
4747
RISCVMergeBaseOffset.cpp
4848
RISCVOptWInstrs.cpp
4949
RISCVPostRAExpandPseudoInsts.cpp

llvm/lib/Target/RISCV/RISCV.td

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ include "RISCVCallingConv.td"
3030
include "RISCVInstrInfo.td"
3131
include "GISel/RISCVRegisterBanks.td"
3232

33+
//===----------------------------------------------------------------------===//
34+
// RISC-V macro fusions.
35+
//===----------------------------------------------------------------------===//
36+
37+
include "RISCVMacroFusion.td"
38+
3339
//===----------------------------------------------------------------------===//
3440
// RISC-V Scheduling Models
3541
//===----------------------------------------------------------------------===//

llvm/lib/Target/RISCV/RISCVFeatures.td

-24
Original file line numberDiff line numberDiff line change
@@ -1044,30 +1044,6 @@ def TuneDLenFactor2
10441044
: SubtargetFeature<"dlen-factor-2", "DLenFactor2", "true",
10451045
"Vector unit DLEN(data path width) is half of VLEN">;
10461046

1047-
def TuneLUIADDIFusion
1048-
: SubtargetFeature<"lui-addi-fusion", "HasLUIADDIFusion",
1049-
"true", "Enable LUI+ADDI macrofusion">;
1050-
1051-
def TuneAUIPCADDIFusion
1052-
: SubtargetFeature<"auipc-addi-fusion", "HasAUIPCADDIFusion",
1053-
"true", "Enable AUIPC+ADDI macrofusion">;
1054-
1055-
def TuneZExtHFusion
1056-
: SubtargetFeature<"zexth-fusion", "HasZExtHFusion",
1057-
"true", "Enable SLLI+SRLI to be fused to zero extension of halfword">;
1058-
1059-
def TuneZExtWFusion
1060-
: SubtargetFeature<"zextw-fusion", "HasZExtWFusion",
1061-
"true", "Enable SLLI+SRLI to be fused to zero extension of word">;
1062-
1063-
def TuneShiftedZExtWFusion
1064-
: SubtargetFeature<"shifted-zextw-fusion", "HasShiftedZExtWFusion",
1065-
"true", "Enable SLLI+SRLI to be fused when computing (shifted) zero extension of word">;
1066-
1067-
def TuneLDADDFusion
1068-
: SubtargetFeature<"ld-add-fusion", "HasLDADDFusion",
1069-
"true", "Enable LD+ADD macrofusion.">;
1070-
10711047
def TuneNoDefaultUnroll
10721048
: SubtargetFeature<"no-default-unroll", "EnableDefaultUnroll", "false",
10731049
"Disable default unroll preference.">;

llvm/lib/Target/RISCV/RISCVMacroFusion.cpp

-210
This file was deleted.

llvm/lib/Target/RISCV/RISCVMacroFusion.h

-28
This file was deleted.
+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
//==----- RISCVMacroFusion.td - Macro Fusion Definitions -----*- tablegen -*-=//
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+
// The following definitions describe the macro fusion predicators.
11+
12+
// Fuse LUI followed by ADDI or ADDIW:
13+
// rd = imm[31:0] which decomposes to
14+
// lui rd, imm[31:12]
15+
// addi(w) rd, rd, imm[11:0]
16+
def TuneLUIADDIFusion
17+
: SimpleFusion<"lui-addi-fusion", "HasLUIADDIFusion",
18+
"Enable LUI+ADDI macro fusion",
19+
CheckOpcode<[LUI]>,
20+
CheckOpcode<[ADDI, ADDIW]>>;
21+
22+
// Fuse AUIPC followed by ADDI:
23+
// auipc rd, imm20
24+
// addi rd, rd, imm12
25+
def TuneAUIPCADDIFusion
26+
: SimpleFusion<"auipc-addi-fusion", "HasAUIPCADDIFusion",
27+
"Enable AUIPC+ADDI macrofusion",
28+
CheckOpcode<[AUIPC]>,
29+
CheckOpcode<[ADDI]>>;
30+
31+
// Fuse zero extension of halfword:
32+
// slli rd, rs1, 48
33+
// srli rd, rd, 48
34+
def TuneZExtHFusion
35+
: SimpleFusion<"zexth-fusion", "HasZExtHFusion",
36+
"Enable SLLI+SRLI to be fused to zero extension of halfword",
37+
CheckAll<[
38+
CheckOpcode<[SLLI]>,
39+
CheckIsImmOperand<2>,
40+
CheckImmOperand<2, 48>
41+
]>,
42+
CheckAll<[
43+
CheckOpcode<[SRLI]>,
44+
CheckIsImmOperand<2>,
45+
CheckImmOperand<2, 48>
46+
]>>;
47+
48+
// Fuse zero extension of word:
49+
// slli rd, rs1, 32
50+
// srli rd, rd, 32
51+
def TuneZExtWFusion
52+
: SimpleFusion<"zextw-fusion", "HasZExtWFusion",
53+
"Enable SLLI+SRLI to be fused to zero extension of word",
54+
CheckAll<[
55+
CheckOpcode<[SLLI]>,
56+
CheckIsImmOperand<2>,
57+
CheckImmOperand<2, 32>
58+
]>,
59+
CheckAll<[
60+
CheckOpcode<[SRLI]>,
61+
CheckIsImmOperand<2>,
62+
CheckImmOperand<2, 32>
63+
]>>;
64+
65+
// Fuse shifted zero extension of word:
66+
// slli rd, rs1, 32
67+
// srli rd, rd, x
68+
// where 0 <= x < 32
69+
def TuneShiftedZExtWFusion
70+
: SimpleFusion<"shifted-zextw-fusion", "HasShiftedZExtWFusion",
71+
"Enable SLLI+SRLI to be fused when computing (shifted) word zero extension",
72+
CheckAll<[
73+
CheckOpcode<[SLLI]>,
74+
CheckIsImmOperand<2>,
75+
CheckImmOperand<2, 32>
76+
]>,
77+
CheckAll<[
78+
CheckOpcode<[SRLI]>,
79+
CheckIsImmOperand<2>,
80+
CheckImmOperandRange<2, 0, 31>
81+
]>>;
82+
83+
// Fuse load with add:
84+
// add rd, rs1, rs2
85+
// ld rd, 0(rd)
86+
def TuneLDADDFusion
87+
: SimpleFusion<"ld-add-fusion", "HasLDADDFusion", "Enable LD+ADD macrofusion",
88+
CheckOpcode<[ADD]>,
89+
CheckAll<[
90+
CheckOpcode<[LD]>,
91+
CheckIsImmOperand<2>,
92+
CheckImmOperand<2, 0>
93+
]>>;

0 commit comments

Comments
 (0)