Skip to content

Commit de0c2d7

Browse files
committed
[RISCV] Use tablegen size for getInstSizeInBytes.
Fix the pseudos to have the correct size in the MCInstrDesc description. Inspired by D118009 and D117970. Reviewed By: asb Differential Revision: https://reviews.llvm.org/D118175
1 parent cec8b61 commit de0c2d7

File tree

4 files changed

+39
-89
lines changed

4 files changed

+39
-89
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 15 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -965,93 +965,29 @@ bool RISCVInstrInfo::isBranchOffsetInRange(unsigned BranchOp,
965965
}
966966

967967
unsigned RISCVInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
968+
if (MI.isMetaInstruction())
969+
return 0;
970+
968971
unsigned Opcode = MI.getOpcode();
969972

970-
switch (Opcode) {
971-
default: {
972-
if (MI.getParent() && MI.getParent()->getParent()) {
973-
const auto MF = MI.getMF();
974-
const auto &TM = static_cast<const RISCVTargetMachine &>(MF->getTarget());
975-
const MCRegisterInfo &MRI = *TM.getMCRegisterInfo();
976-
const MCSubtargetInfo &STI = *TM.getMCSubtargetInfo();
977-
const RISCVSubtarget &ST = MF->getSubtarget<RISCVSubtarget>();
978-
if (isCompressibleInst(MI, &ST, MRI, STI))
979-
return 2;
980-
}
981-
return get(Opcode).getSize();
982-
}
983-
case TargetOpcode::EH_LABEL:
984-
case TargetOpcode::IMPLICIT_DEF:
985-
case TargetOpcode::KILL:
986-
case TargetOpcode::DBG_VALUE:
987-
return 0;
988-
// These values are determined based on RISCVExpandAtomicPseudoInsts,
989-
// RISCVExpandPseudoInsts and RISCVMCCodeEmitter, depending on where the
990-
// pseudos are expanded.
991-
case RISCV::PseudoCALLReg:
992-
case RISCV::PseudoCALL:
993-
case RISCV::PseudoJump:
994-
case RISCV::PseudoTAIL:
995-
case RISCV::PseudoLLA:
996-
case RISCV::PseudoLA:
997-
case RISCV::PseudoLA_TLS_IE:
998-
case RISCV::PseudoLA_TLS_GD:
999-
return 8;
1000-
case RISCV::PseudoAtomicLoadNand32:
1001-
case RISCV::PseudoAtomicLoadNand64:
1002-
return 20;
1003-
case RISCV::PseudoMaskedAtomicSwap32:
1004-
case RISCV::PseudoMaskedAtomicLoadAdd32:
1005-
case RISCV::PseudoMaskedAtomicLoadSub32:
1006-
return 28;
1007-
case RISCV::PseudoMaskedAtomicLoadNand32:
1008-
return 32;
1009-
case RISCV::PseudoMaskedAtomicLoadMax32:
1010-
case RISCV::PseudoMaskedAtomicLoadMin32:
1011-
return 44;
1012-
case RISCV::PseudoMaskedAtomicLoadUMax32:
1013-
case RISCV::PseudoMaskedAtomicLoadUMin32:
1014-
return 36;
1015-
case RISCV::PseudoCmpXchg32:
1016-
case RISCV::PseudoCmpXchg64:
1017-
return 16;
1018-
case RISCV::PseudoMaskedCmpXchg32:
1019-
return 32;
1020-
case TargetOpcode::INLINEASM:
1021-
case TargetOpcode::INLINEASM_BR: {
973+
if (Opcode == TargetOpcode::INLINEASM ||
974+
Opcode == TargetOpcode::INLINEASM_BR) {
1022975
const MachineFunction &MF = *MI.getParent()->getParent();
1023976
const auto &TM = static_cast<const RISCVTargetMachine &>(MF.getTarget());
1024977
return getInlineAsmLength(MI.getOperand(0).getSymbolName(),
1025978
*TM.getMCAsmInfo());
1026979
}
1027-
case RISCV::PseudoVSPILL2_M1:
1028-
case RISCV::PseudoVSPILL2_M2:
1029-
case RISCV::PseudoVSPILL2_M4:
1030-
case RISCV::PseudoVSPILL3_M1:
1031-
case RISCV::PseudoVSPILL3_M2:
1032-
case RISCV::PseudoVSPILL4_M1:
1033-
case RISCV::PseudoVSPILL4_M2:
1034-
case RISCV::PseudoVSPILL5_M1:
1035-
case RISCV::PseudoVSPILL6_M1:
1036-
case RISCV::PseudoVSPILL7_M1:
1037-
case RISCV::PseudoVSPILL8_M1:
1038-
case RISCV::PseudoVRELOAD2_M1:
1039-
case RISCV::PseudoVRELOAD2_M2:
1040-
case RISCV::PseudoVRELOAD2_M4:
1041-
case RISCV::PseudoVRELOAD3_M1:
1042-
case RISCV::PseudoVRELOAD3_M2:
1043-
case RISCV::PseudoVRELOAD4_M1:
1044-
case RISCV::PseudoVRELOAD4_M2:
1045-
case RISCV::PseudoVRELOAD5_M1:
1046-
case RISCV::PseudoVRELOAD6_M1:
1047-
case RISCV::PseudoVRELOAD7_M1:
1048-
case RISCV::PseudoVRELOAD8_M1: {
1049-
// The values are determined based on expandVSPILL and expandVRELOAD that
1050-
// expand the pseudos depending on NF.
1051-
unsigned NF = isRVVSpillForZvlsseg(Opcode)->first;
1052-
return 4 * (2 * NF - 1);
1053-
}
980+
981+
if (MI.getParent() && MI.getParent()->getParent()) {
982+
const auto MF = MI.getMF();
983+
const auto &TM = static_cast<const RISCVTargetMachine &>(MF->getTarget());
984+
const MCRegisterInfo &MRI = *TM.getMCRegisterInfo();
985+
const MCSubtargetInfo &STI = *TM.getMCSubtargetInfo();
986+
const RISCVSubtarget &ST = MF->getSubtarget<RISCVSubtarget>();
987+
if (isCompressibleInst(MI, &ST, MRI, STI))
988+
return 2;
1054989
}
990+
return get(Opcode).getSize();
1055991
}
1056992

1057993
bool RISCVInstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const {

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@ def : Pat<(brind (add GPRJALR:$rs1, simm12:$imm12)),
11831183
// destination.
11841184
// Define AsmString to print "call" when compile with -S flag.
11851185
// Define isCodeGenOnly = 0 to support parsing assembly "call" instruction.
1186-
let isCall = 1, isBarrier = 1, isCodeGenOnly = 0, hasSideEffects = 0,
1186+
let isCall = 1, isBarrier = 1, isCodeGenOnly = 0, Size = 8, hasSideEffects = 0,
11871187
mayStore = 0, mayLoad = 0 in
11881188
def PseudoCALLReg : Pseudo<(outs GPR:$rd), (ins call_symbol:$func), []> {
11891189
let AsmString = "call\t$rd, $func";
@@ -1195,7 +1195,7 @@ def PseudoCALLReg : Pseudo<(outs GPR:$rd), (ins call_symbol:$func), []> {
11951195
// if the offset fits in a signed 21-bit immediate.
11961196
// Define AsmString to print "call" when compile with -S flag.
11971197
// Define isCodeGenOnly = 0 to support parsing assembly "call" instruction.
1198-
let isCall = 1, Defs = [X1], isCodeGenOnly = 0 in
1198+
let isCall = 1, Defs = [X1], isCodeGenOnly = 0, Size = 8 in
11991199
def PseudoCALL : Pseudo<(outs), (ins call_symbol:$func), []> {
12001200
let AsmString = "call\t$func";
12011201
}
@@ -1220,7 +1220,7 @@ def PseudoRET : Pseudo<(outs), (ins), [(riscv_ret_flag)]>,
12201220
// expand to auipc and jalr while encoding.
12211221
// Define AsmString to print "tail" when compile with -S flag.
12221222
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [X2],
1223-
isCodeGenOnly = 0 in
1223+
Size = 8, isCodeGenOnly = 0 in
12241224
def PseudoTAIL : Pseudo<(outs), (ins call_symbol:$dst), []> {
12251225
let AsmString = "tail\t$dst";
12261226
}
@@ -1235,28 +1235,28 @@ def : Pat<(riscv_tail (iPTR tglobaladdr:$dst)),
12351235
def : Pat<(riscv_tail (iPTR texternalsym:$dst)),
12361236
(PseudoTAIL texternalsym:$dst)>;
12371237

1238-
let isCall = 0, isBarrier = 1, isBranch = 1, isTerminator = 1,
1238+
let isCall = 0, isBarrier = 1, isBranch = 1, isTerminator = 1, Size = 8,
12391239
isCodeGenOnly = 0, hasSideEffects = 0, mayStore = 0, mayLoad = 0 in
12401240
def PseudoJump : Pseudo<(outs GPR:$rd), (ins pseudo_jump_symbol:$target), []> {
12411241
let AsmString = "jump\t$target, $rd";
12421242
}
12431243

1244-
let hasSideEffects = 0, mayLoad = 0, mayStore = 0, isCodeGenOnly = 0,
1244+
let hasSideEffects = 0, mayLoad = 0, mayStore = 0, Size = 8, isCodeGenOnly = 0,
12451245
isAsmParserOnly = 1 in
12461246
def PseudoLLA : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
12471247
"lla", "$dst, $src">;
12481248

1249-
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, isCodeGenOnly = 0,
1249+
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, Size = 8, isCodeGenOnly = 0,
12501250
isAsmParserOnly = 1 in
12511251
def PseudoLA : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
12521252
"la", "$dst, $src">;
12531253

1254-
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, isCodeGenOnly = 0,
1254+
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, Size = 8, isCodeGenOnly = 0,
12551255
isAsmParserOnly = 1 in
12561256
def PseudoLA_TLS_IE : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
12571257
"la.tls.ie", "$dst, $src">;
12581258

1259-
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, isCodeGenOnly = 0,
1259+
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, Size = 8, isCodeGenOnly = 0,
12601260
isAsmParserOnly = 1 in
12611261
def PseudoLA_TLS_GD : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
12621262
"la.tls.gd", "$dst, $src">;

llvm/lib/Target/RISCV/RISCVInstrInfoA.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ class PseudoAMO : Pseudo<(outs GPR:$res, GPR:$scratch),
188188
let hasSideEffects = 0;
189189
}
190190

191+
let Size = 20 in
191192
def PseudoAtomicLoadNand32 : PseudoAMO;
192193
// Ordering constants must be kept in sync with the AtomicOrdering enum in
193194
// AtomicOrdering.h.
@@ -242,27 +243,35 @@ class PseudoMaskedAMOMinMaxPat<Intrinsic intrin, Pseudo AMOInst>
242243
(AMOInst GPR:$addr, GPR:$incr, GPR:$mask, GPR:$shiftamt,
243244
timm:$ordering)>;
244245

246+
let Size = 28 in
245247
def PseudoMaskedAtomicSwap32 : PseudoMaskedAMO;
246248
def : PseudoMaskedAMOPat<int_riscv_masked_atomicrmw_xchg_i32,
247249
PseudoMaskedAtomicSwap32>;
250+
let Size = 28 in
248251
def PseudoMaskedAtomicLoadAdd32 : PseudoMaskedAMO;
249252
def : PseudoMaskedAMOPat<int_riscv_masked_atomicrmw_add_i32,
250253
PseudoMaskedAtomicLoadAdd32>;
254+
let Size = 28 in
251255
def PseudoMaskedAtomicLoadSub32 : PseudoMaskedAMO;
252256
def : PseudoMaskedAMOPat<int_riscv_masked_atomicrmw_sub_i32,
253257
PseudoMaskedAtomicLoadSub32>;
258+
let Size = 32 in
254259
def PseudoMaskedAtomicLoadNand32 : PseudoMaskedAMO;
255260
def : PseudoMaskedAMOPat<int_riscv_masked_atomicrmw_nand_i32,
256261
PseudoMaskedAtomicLoadNand32>;
262+
let Size = 44 in
257263
def PseudoMaskedAtomicLoadMax32 : PseudoMaskedAMOMinMax;
258264
def : PseudoMaskedAMOMinMaxPat<int_riscv_masked_atomicrmw_max_i32,
259265
PseudoMaskedAtomicLoadMax32>;
266+
let Size = 44 in
260267
def PseudoMaskedAtomicLoadMin32 : PseudoMaskedAMOMinMax;
261268
def : PseudoMaskedAMOMinMaxPat<int_riscv_masked_atomicrmw_min_i32,
262269
PseudoMaskedAtomicLoadMin32>;
270+
let Size = 36 in
263271
def PseudoMaskedAtomicLoadUMax32 : PseudoMaskedAMOUMinUMax;
264272
def : PseudoMaskedAMOPat<int_riscv_masked_atomicrmw_umax_i32,
265273
PseudoMaskedAtomicLoadUMax32>;
274+
let Size = 36 in
266275
def PseudoMaskedAtomicLoadUMin32 : PseudoMaskedAMOUMinUMax;
267276
def : PseudoMaskedAMOPat<int_riscv_masked_atomicrmw_umin_i32,
268277
PseudoMaskedAtomicLoadUMin32>;
@@ -276,6 +285,7 @@ class PseudoCmpXchg
276285
let mayLoad = 1;
277286
let mayStore = 1;
278287
let hasSideEffects = 0;
288+
let Size = 16;
279289
}
280290

281291
// Ordering constants must be kept in sync with the AtomicOrdering enum in
@@ -304,6 +314,7 @@ def PseudoMaskedCmpXchg32
304314
let mayLoad = 1;
305315
let mayStore = 1;
306316
let hasSideEffects = 0;
317+
let Size = 32;
307318
}
308319

309320
def : Pat<(int_riscv_masked_cmpxchg_i32
@@ -347,6 +358,7 @@ def : Pat<(i64 (atomic_load_sub_64_seq_cst GPR:$addr, GPR:$incr)),
347358

348359
/// 64-bit pseudo AMOs
349360

361+
let Size = 20 in
350362
def PseudoAtomicLoadNand64 : PseudoAMO;
351363
// Ordering constants must be kept in sync with the AtomicOrdering enum in
352364
// AtomicOrdering.h.

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3899,11 +3899,13 @@ let hasSideEffects = 0, mayLoad = 1, mayStore = 0, isCodeGenOnly = 1 in {
38993899
foreach lmul = MxList in {
39003900
foreach nf = NFSet<lmul>.L in {
39013901
defvar vreg = SegRegClass<lmul, nf>.RC;
3902-
let hasSideEffects = 0, mayLoad = 0, mayStore = 1, isCodeGenOnly = 1 in {
3902+
let hasSideEffects = 0, mayLoad = 0, mayStore = 1, isCodeGenOnly = 1,
3903+
Size = !mul(4, !sub(!mul(nf, 2), 1)) in {
39033904
def "PseudoVSPILL" # nf # "_" # lmul.MX :
39043905
Pseudo<(outs), (ins vreg:$rs1, GPR:$rs2, GPR:$vlenb), []>;
39053906
}
3906-
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, isCodeGenOnly = 1 in {
3907+
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, isCodeGenOnly = 1,
3908+
Size = !mul(4, !sub(!mul(nf, 2), 1)) in {
39073909
def "PseudoVRELOAD" # nf # "_" # lmul.MX :
39083910
Pseudo<(outs vreg:$rs1), (ins GPR:$rs2, GPR:$vlenb), []>;
39093911
}

0 commit comments

Comments
 (0)