Skip to content

Commit bb90f32

Browse files
committed
[RISCV] Use TableGen-based macro fusion
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.
1 parent 00ad97e commit bb90f32

9 files changed

+113
-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
@@ -1016,30 +1016,6 @@ def TuneDLenFactor2
10161016
: SubtargetFeature<"dlen-factor-2", "DLenFactor2", "true",
10171017
"Vector unit DLEN(data path width) is half of VLEN">;
10181018

1019-
def TuneLUIADDIFusion
1020-
: SubtargetFeature<"lui-addi-fusion", "HasLUIADDIFusion",
1021-
"true", "Enable LUI+ADDI macrofusion">;
1022-
1023-
def TuneAUIPCADDIFusion
1024-
: SubtargetFeature<"auipc-addi-fusion", "HasAUIPCADDIFusion",
1025-
"true", "Enable AUIPC+ADDI macrofusion">;
1026-
1027-
def TuneZExtHFusion
1028-
: SubtargetFeature<"zexth-fusion", "HasZExtHFusion",
1029-
"true", "Enable SLLI+SRLI to be fused to zero extension of halfword">;
1030-
1031-
def TuneZExtWFusion
1032-
: SubtargetFeature<"zextw-fusion", "HasZExtWFusion",
1033-
"true", "Enable SLLI+SRLI to be fused to zero extension of word">;
1034-
1035-
def TuneShiftedZExtWFusion
1036-
: SubtargetFeature<"shifted-zextw-fusion", "HasShiftedZExtWFusion",
1037-
"true", "Enable SLLI+SRLI to be fused when computing (shifted) zero extension of word">;
1038-
1039-
def TuneLDADDFusion
1040-
: SubtargetFeature<"ld-add-fusion", "HasLDADDFusion",
1041-
"true", "Enable LD+ADD macrofusion.">;
1042-
10431019
def TuneNoDefaultUnroll
10441020
: SubtargetFeature<"no-default-unroll", "EnableDefaultUnroll", "false",
10451021
"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.
+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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", "Enable LUI+ADDI macro fusion",
18+
CheckOpcode<[LUI]>,
19+
CheckOpcode<[ADDI, ADDIW]>>;
20+
21+
// Fuse AUIPC followed by ADDI
22+
// auipc rd, imm20
23+
// addi rd, rd, imm12
24+
def TuneAUIPCADDIFusion
25+
: SimpleFusion<"auipc-addi-fusion", "HasAUIPCADDIFusion",
26+
"Enable AUIPC+ADDI macrofusion",
27+
CheckOpcode<[AUIPC]>,
28+
CheckOpcode<[ADDI, ADDIW]>>;
29+
30+
// Fuse zero extension of halfword:
31+
// slli rd, rs1, 48
32+
// srli rd, rd, 48
33+
def TuneZExtHFusion
34+
: SimpleFusion<"zexth-fusion", "HasZExtHFusion",
35+
"Enable SLLI+SRLI to be fused to zero extension of halfword",
36+
CheckAll<[
37+
CheckOpcode<[SLLI]>,
38+
CheckImmOperand<2, 48>
39+
]>,
40+
CheckAll<[
41+
CheckOpcode<[SRLI]>,
42+
CheckIsImmOperand<2>,
43+
CheckImmOperand<2, 48>
44+
]>>;
45+
46+
// Fuse zero extension of word:
47+
// slli rd, rs1, 32
48+
// srli rd, rd, 32
49+
def TuneZExtWFusion
50+
: SimpleFusion<"zextw-fusion", "HasZExtWFusion",
51+
"Enable SLLI+SRLI to be fused to zero extension of word",
52+
CheckAll<[
53+
CheckOpcode<[SLLI]>,
54+
CheckImmOperand<2, 32>
55+
]>,
56+
CheckAll<[
57+
CheckOpcode<[SRLI]>,
58+
CheckIsImmOperand<2>,
59+
CheckImmOperand<2, 32>
60+
]>>;
61+
62+
// Fuse shifted zero extension of word:
63+
// slli rd, rs1, 32
64+
// srli rd, rd, x
65+
// where 0 <= x < 32
66+
def TuneShiftedZExtWFusion
67+
: SimpleFusion<"shifted-zextw-fusion", "HasShiftedZExtWFusion",
68+
"Enable SLLI+SRLI to be fused when computing (shifted) word zero extension",
69+
CheckAll<[
70+
CheckOpcode<[SLLI]>,
71+
CheckImmOperand<2, 32>
72+
]>,
73+
CheckAll<[
74+
CheckOpcode<[SRLI]>,
75+
CheckIsImmOperand<2>,
76+
CheckImmOperandRange<2, 0, 31>
77+
]>>;
78+
79+
// Fuse load with add:
80+
// add rd, rs1, rs2
81+
// ld rd, 0(rd)
82+
def TuneLDADDFusion
83+
: SimpleFusion<"ld-add-fusion", "HasLDADDFusion", "Enable LD+ADD macrofusion",
84+
CheckOpcode<[ADD]>,
85+
CheckAll<[
86+
CheckOpcode<[LD]>,
87+
CheckIsImmOperand<2>,
88+
CheckImmOperand<2, 0>
89+
]>>;

0 commit comments

Comments
 (0)