[llvm] 12336bb - [RISC-V] Use an optional offset operand instead of zero-offset InstAliases
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 7 18:16:58 PDT 2026
Author: Alexander Richardson
Date: 2026-08-07T18:16:53-07:00
New Revision: 12336bb0e16d8ece7ec501fecfdb79f7966fda46
URL: https://github.com/llvm/llvm-project/commit/12336bb0e16d8ece7ec501fecfdb79f7966fda46
DIFF: https://github.com/llvm/llvm-project/commit/12336bb0e16d8ece7ec501fecfdb79f7966fda46.diff
LOG: [RISC-V] Use an optional offset operand instead of zero-offset InstAliases
Introduce OptionalMemOffsetAsmOperand, which wraps a memory-offset
operand class into a variant with `IsOptional` set so that a memory
operand written without an offset, e.g. "lb a0, (a1)", parses with a
default offset of 0, and use it for a simm12_lo_optional operand. This
replaces the hand-written "(${rs1})" zero-offset InstAlias that every
load/store-style instruction needed (scalar and FP loads/stores, Zilsd,
jr/jalr and the .insn_i/.insn_s memory forms).
OptionalMemOffsetAsmOperand is somewhat complicated, but this makes it
easier to replace all the other optional zero memory operands which I
will do in follow-up commits, removing all the InstAlias duplication.
This change was assisted by AI.
Pull Request: https://github.com/llvm/llvm-project/pull/210901
Added:
Modified:
llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
llvm/lib/Target/RISCV/RISCVInstrInfo.td
llvm/lib/Target/RISCV/RISCVInstrInfoD.td
llvm/lib/Target/RISCV/RISCVInstrInfoF.td
llvm/lib/Target/RISCV/RISCVInstrInfoQ.td
llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
llvm/lib/Target/RISCV/RISCVInstrInfoZilsd.td
llvm/test/MC/RISCV/rv32i-invalid.s
llvm/test/MC/RISCV/tlsdesc.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index b5886d284e486..f9c1b8275108f 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -307,6 +307,7 @@ class RISCVAsmParser : public MCTargetAsmParser {
std::unique_ptr<RISCVOperand> defaultFRMArgOp() const;
std::unique_ptr<RISCVOperand> defaultFRMArgLegacyOp() const;
std::unique_ptr<RISCVOperand> defaultSMTVType();
+ std::unique_ptr<RISCVOperand> defaultZeroOffset();
public:
enum RISCVMatchResultTy : unsigned {
@@ -958,6 +959,19 @@ struct RISCVOperand final : public MCParsedAsmOperand {
VK == ELF::R_RISCV_TLSDESC_ADD_LO12);
}
+ /// Returns NoMatch rather than the NearMatch of the underlying predicate
+ /// for anything that is not an immediate at all (such as the '(' token of an
+ /// offset-less memory operand). This lets the matcher skip this optional
+ /// operand and insert the default 0 offset. An immediate that fails Pred
+ /// (e.g. out of range) still reports the wrapped class diagnostic.
+ template <bool (RISCVOperand::*Pred)() const>
+ DiagnosticPredicate isOptionalMemOffset() const {
+ if (!isImm())
+ return DiagnosticPredicate::NoMatch;
+ return (this->*Pred)() ? DiagnosticPredicate::Match
+ : DiagnosticPredicate::NearMatch;
+ }
+
bool isSImm12Lsb00000() const {
return isSImmPred([](int64_t Imm) { return isShiftedInt<7, 5>(Imm); });
}
@@ -4106,6 +4120,11 @@ std::unique_ptr<RISCVOperand> RISCVAsmParser::defaultFRMArgLegacyOp() const {
llvm::SMLoc());
}
+std::unique_ptr<RISCVOperand> RISCVAsmParser::defaultZeroOffset() {
+ return RISCVOperand::createExpr(MCConstantExpr::create(0, getContext()),
+ llvm::SMLoc(), llvm::SMLoc(), isRV64());
+}
+
static unsigned getNFforLXSEG(unsigned Opcode) {
switch (Opcode) {
default:
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
index a8b423e6910e1..5d93509477102 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -206,6 +206,7 @@ class ImmXLenAsmOperand<string prefix, string suffix = ""> : AsmOperandClass {
class ImmAsmOperand<string prefix, int width, string suffix> : AsmOperandClass {
let Name = prefix # "Imm" # width # suffix;
+ let PredicateMethod = "is" # prefix # "Imm" # width # suffix;
let RenderMethod = "addImmOperands";
let DiagnosticType = !strconcat("Invalid", Name);
}
@@ -253,6 +254,18 @@ class BareSImmNLsb0AsmOperand<int width>
let PredicateMethod = "isBareSimmNLsb0<" # width # ">";
}
+// Use for memory operands where offset may be omitted entirely: "lb a0, (a1)"
+// parses as an offset of 0 without needing a separate zero-offset InstAlias
+// for every load/store instruction.
+class OptionalMemOffsetAsmOperand<AsmOperandClass base> : AsmOperandClass {
+ let Name = "Optional" # base.Name;
+ let PredicateMethod = "isOptionalMemOffset<&RISCVOperand::" # base.PredicateMethod # ">";
+ let RenderMethod = "addImmOperands";
+ let DiagnosticType = base.DiagnosticType;
+ let IsOptional = 1;
+ let DefaultMethod = "defaultZeroOffset";
+}
+
class RISCVOp<ValueType vt = XLenVT> : Operand<vt> {
let OperandNamespace = "RISCVOp";
}
@@ -372,8 +385,7 @@ def uimm64 : RISCVUImmOp<64>;
def simm12 : RISCVSImmLeafOp<12>;
-def simm12_lo : RISCVSImmLeafOp<12> {
- let ParserMatchClass = SImmAsmOperand<12, "LO">;
+class Simm12LoOp : RISCVSImmLeafOp<12> {
let MCOperandPredicate = [{
int64_t Imm;
if (MCOp.evaluateAsConstantImm(Imm))
@@ -383,6 +395,19 @@ def simm12_lo : RISCVSImmLeafOp<12> {
let OperandType = "OPERAND_SIMM12_LO";
}
+def simm12_lo : Simm12LoOp {
+ let ParserMatchClass = SImmAsmOperand<12, "LO">;
+}
+
+// Variants of simm12(_lo) for memory-operand offsets that may be omitted
+// entirely, e.g. "lb a0, (a1)". See OptionalMemOffsetAsmOperand.
+def simm12_optional : RISCVSImmLeafOp<12> {
+ let ParserMatchClass = OptionalMemOffsetAsmOperand<simm12.ParserMatchClass>;
+}
+def simm12_lo_optional : Simm12LoOp {
+ let ParserMatchClass = OptionalMemOffsetAsmOperand<simm12_lo.ParserMatchClass>;
+}
+
// A 12-bit signed immediate which cannot fit in 6-bit signed immediate,
// but even negative value fit in 12-bit.
def simm12_no6 : ImmLeaf<XLenVT, [{
@@ -676,7 +701,8 @@ class BranchCC_rri<bits<3> funct3, string opcodestr>
let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in {
class Load_ri<bits<3> funct3, string opcodestr, DAGOperand rty = GPR>
- : RVInstI<funct3, OPC_LOAD, (outs rty:$rd), (ins BasePtr:$rs1, simm12_lo:$imm12),
+ : RVInstI<funct3, OPC_LOAD, (outs rty:$rd),
+ (ins BasePtr:$rs1, simm12_lo_optional:$imm12),
opcodestr, "$rd, ${imm12}(${rs1})">;
class HLoad_r<bits<7> funct7, bits<5> funct5, string opcodestr>
@@ -692,7 +718,7 @@ class HLoad_r<bits<7> funct7, bits<5> funct5, string opcodestr>
let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in {
class Store_rri<bits<3> funct3, string opcodestr, DAGOperand rty = GPR>
: RVInstS<funct3, OPC_STORE, (outs),
- (ins rty:$rs2, BasePtr:$rs1, simm12_lo:$imm12),
+ (ins rty:$rs2, BasePtr:$rs1, simm12_lo_optional:$imm12),
opcodestr, "$rs2, ${imm12}(${rs1})">;
class HStore_rr<bits<7> funct7, string opcodestr>
@@ -788,7 +814,7 @@ def JAL : RVInstJ<OPC_JAL, (outs GPR:$rd), (ins simm21_lsb0_jal:$imm20),
"jal", "$rd, $imm20">, Sched<[WriteJal]>;
def JALR : RVInstI<0b000, OPC_JALR, (outs GPR:$rd),
- (ins GPR:$rs1, simm12_lo:$imm12),
+ (ins GPR:$rs1, simm12_lo_optional:$imm12),
"jalr", "$rd, ${imm12}(${rs1})">,
Sched<[WriteJalr, ReadJalr]>;
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
@@ -1128,11 +1154,12 @@ def : InstAlias<"j $offset", (JAL X0, simm21_lsb0_jal:$offset)>;
def : InstAlias<"jal $offset", (JAL X1, simm21_lsb0_jal:$offset)>;
// Non-zero offset aliases of "jalr" are the lowest weight, followed by the
-// two-register form, then the one-register forms and finally "ret".
+// two-register form, then the one-register forms and finally "ret". The
+// "(${rs})" offset-less forms are covered by simm12_lo_optional.
def : InstAlias<"jr $rs", (JALR X0, GPR:$rs, 0), 3>;
-def : InstAlias<"jr ${offset}(${rs})", (JALR X0, GPR:$rs, simm12_lo:$offset)>;
+def : InstAlias<"jr ${offset}(${rs})", (JALR X0, GPR:$rs, simm12_lo_optional:$offset)>;
def : InstAlias<"jalr $rs", (JALR X1, GPR:$rs, 0), 3>;
-def : InstAlias<"jalr ${offset}(${rs})", (JALR X1, GPR:$rs, simm12_lo:$offset)>;
+def : InstAlias<"jalr ${offset}(${rs})", (JALR X1, GPR:$rs, simm12_lo_optional:$offset)>;
def : InstAlias<"jalr $rd, $rs", (JALR GPR:$rd, GPR:$rs, 0), 2>;
def : InstAlias<"ret", (JALR X0, X1, 0), 4>;
@@ -1140,9 +1167,6 @@ def : InstAlias<"ret", (JALR X0, X1, 0), 4>;
def : InstAlias<"jr $rs, $offset", (JALR X0, GPR:$rs, simm12_lo:$offset), 0>;
def : InstAlias<"jalr $rs, $offset", (JALR X1, GPR:$rs, simm12_lo:$offset), 0>;
def : InstAlias<"jalr $rd, $rs, $offset", (JALR GPR:$rd, GPR:$rs, simm12_lo:$offset), 0>;
-def : InstAlias<"jr (${rs})", (JALR X0, GPR:$rs, 0), 0>;
-def : InstAlias<"jalr (${rs})", (JALR X1, GPR:$rs, 0), 0>;
-def : InstAlias<"jalr $rd, (${rs})", (JALR GPR:$rd, GPR:$rs, 0), 0>;
def : InstAlias<"fence", (FENCE 0xF, 0xF)>; // 0xF == iorw
@@ -1199,24 +1223,6 @@ def : InstAlias<"ntl.s1", (ADD X0, X0, X4)>;
def : InstAlias<"ntl.all", (ADD X0, X0, X5)>;
let EmitPriority = 0 in {
-def : InstAlias<"lb $rd, (${rs1})",
- (LB GPR:$rd, GPR:$rs1, 0)>;
-def : InstAlias<"lh $rd, (${rs1})",
- (LH GPR:$rd, GPR:$rs1, 0)>;
-def : InstAlias<"lw $rd, (${rs1})",
- (LW GPR:$rd, GPR:$rs1, 0)>;
-def : InstAlias<"lbu $rd, (${rs1})",
- (LBU GPR:$rd, GPR:$rs1, 0)>;
-def : InstAlias<"lhu $rd, (${rs1})",
- (LHU GPR:$rd, GPR:$rs1, 0)>;
-
-def : InstAlias<"sb $rs2, (${rs1})",
- (SB GPR:$rs2, GPR:$rs1, 0)>;
-def : InstAlias<"sh $rs2, (${rs1})",
- (SH GPR:$rs2, GPR:$rs1, 0)>;
-def : InstAlias<"sw $rs2, (${rs1})",
- (SW GPR:$rs2, GPR:$rs1, 0)>;
-
def : InstAlias<"add $rd, $rs1, $imm12",
(ADDI GPR:$rd, GPR:$rs1, simm12_lo:$imm12)>;
def : InstAlias<"and $rd, $rs1, $imm12",
@@ -1232,13 +1238,6 @@ def : InstAlias<"srl $rd, $rs1, $shamt",
def : InstAlias<"sra $rd, $rs1, $shamt",
(SRAI GPR:$rd, GPR:$rs1, uimmlog2xlen:$shamt)>;
let Predicates = [IsRV64] in {
-def : InstAlias<"lwu $rd, (${rs1})",
- (LWU GPR:$rd, GPR:$rs1, 0)>;
-def : InstAlias<"ld $rd, (${rs1})",
- (LD GPR:$rd, GPR:$rs1, 0)>;
-def : InstAlias<"sd $rs2, (${rs1})",
- (SD GPR:$rs2, GPR:$rs1, 0)>;
-
def : InstAlias<"addw $rd, $rs1, $imm12",
(ADDIW GPR:$rd, GPR:$rs1, simm12_lo:$imm12)>;
def : InstAlias<"sllw $rd, $rs1, $shamt",
@@ -1329,7 +1328,7 @@ def InsnI : DirectiveInsnI<(outs AnyReg:$rd), (ins uimm7_opcode:$opcode, uimm3:$
def InsnI_Mem : DirectiveInsnI<(outs AnyReg:$rd), (ins uimm7_opcode:$opcode,
uimm3:$funct3,
AnyReg:$rs1,
- simm12_lo:$imm12),
+ simm12_lo_optional:$imm12),
"$opcode, $funct3, $rd, ${imm12}(${rs1})">;
def InsnB : DirectiveInsnB<(outs), (ins uimm7_opcode:$opcode, uimm3:$funct3,
AnyReg:$rs1, AnyReg:$rs2,
@@ -1343,7 +1342,7 @@ def InsnJ : DirectiveInsnJ<(outs AnyReg:$rd), (ins uimm7_opcode:$opcode,
"$opcode, $rd, $imm20">;
def InsnS : DirectiveInsnS<(outs), (ins uimm7_opcode:$opcode, uimm3:$funct3,
AnyReg:$rs2, AnyReg:$rs1,
- simm12_lo:$imm12),
+ simm12_lo_optional:$imm12),
"$opcode, $funct3, $rs2, ${imm12}(${rs1})">;
} // isCodeGenOnly, hasSideEffects, mayLoad, mayStore, hasNoSchedulingInfo
@@ -1367,10 +1366,7 @@ def : InstAlias<".insn_i $opcode, $funct3, $rd, $rs1, $imm12",
simm12_lo:$imm12)>;
def : InstAlias<".insn_i $opcode, $funct3, $rd, ${imm12}(${rs1})",
(InsnI_Mem AnyReg:$rd, uimm7_opcode:$opcode, uimm3:$funct3,
- AnyReg:$rs1, simm12_lo:$imm12)>;
-def : InstAlias<".insn_i $opcode, $funct3, $rd, (${rs1})",
- (InsnI_Mem AnyReg:$rd, uimm7_opcode:$opcode, uimm3:$funct3,
- AnyReg:$rs1, 0)>;
+ AnyReg:$rs1, simm12_lo_optional:$imm12)>;
def : InstAlias<".insn_b $opcode, $funct3, $rs1, $rs2, $imm12",
(InsnB uimm7_opcode:$opcode, uimm3:$funct3, AnyReg:$rs1,
AnyReg:$rs2, bare_simm13_lsb0:$imm12)>;
@@ -1387,10 +1383,7 @@ def : InstAlias<".insn_uj $opcode, $rd, $imm20",
(InsnJ AnyReg:$rd, uimm7_opcode:$opcode, simm21_lsb0_jal:$imm20)>;
def : InstAlias<".insn_s $opcode, $funct3, $rs2, ${imm12}(${rs1})",
(InsnS uimm7_opcode:$opcode, uimm3:$funct3, AnyReg:$rs2,
- AnyReg:$rs1, simm12_lo:$imm12)>;
-def : InstAlias<".insn_s $opcode, $funct3, $rs2, (${rs1})",
- (InsnS uimm7_opcode:$opcode, uimm3:$funct3, AnyReg:$rs2,
- AnyReg:$rs1, 0)>;
+ AnyReg:$rs1, simm12_lo_optional:$imm12)>;
}
//===----------------------------------------------------------------------===//
@@ -1804,10 +1797,14 @@ let isBarrier = 1, isBranch = 1, isIndirectBranch = 1, isTerminator = 1 in {
// Use GPRJALRNonX7 to avoid X7 which is reserved for landing pad labels
// in cf-protection-branch. The NonX7 constraint is applied unconditionally
// to simplify the code at a negligible performance cost.
-def PseudoBRIND : Pseudo<(outs), (ins GPRJALRNonX7:$rs1, simm12_lo:$imm12), []>,
- PseudoInstExpansion<(JALR X0, GPR:$rs1, simm12_lo:$imm12)>;
-def PseudoBRINDX7 : Pseudo<(outs), (ins GPRX7:$rs1, simm12_lo:$imm12), []>,
- PseudoInstExpansion<(JALR X0, GPR:$rs1, simm12_lo:$imm12)>;
+def PseudoBRIND : Pseudo<(outs),
+ (ins GPRJALRNonX7:$rs1, simm12_lo_optional:$imm12), []>,
+ PseudoInstExpansion<(JALR X0, GPR:$rs1,
+ simm12_lo_optional:$imm12)>;
+def PseudoBRINDX7 : Pseudo<(outs), (ins GPRX7:$rs1, simm12_lo_optional:$imm12),
+ []>,
+ PseudoInstExpansion<(JALR X0, GPR:$rs1,
+ simm12_lo_optional:$imm12)>;
}
def : Pat<(riscv_sw_guarded_brind GPRX7:$rs1), (PseudoBRINDX7 GPRX7:$rs1, 0)>;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td
index 060d70abc7113..74f0801a92136 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td
@@ -187,9 +187,6 @@ def FMV_D_X : FPUnaryOp_r<0b1111001, 0b00000, 0b000, FPR64, GPR, "fmv.d.x">,
//===----------------------------------------------------------------------===//
let Predicates = [HasStdExtD] in {
-def : InstAlias<"fld $rd, (${rs1})", (FLD FPR64:$rd, GPR:$rs1, 0), 0>;
-def : InstAlias<"fsd $rs2, (${rs1})", (FSD FPR64:$rs2, GPR:$rs1, 0), 0>;
-
def : InstAlias<"fmv.d $rd, $rs", (FSGNJ_D FPR64:$rd, FPR64:$rs, FPR64:$rs)>;
def : InstAlias<"fabs.d $rd, $rs", (FSGNJX_D FPR64:$rd, FPR64:$rs, FPR64:$rs)>;
def : InstAlias<"fneg.d $rd, $rs", (FSGNJN_D FPR64:$rd, FPR64:$rs, FPR64:$rs)>;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td
index b4c5046234efe..737a3bcdf0342 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td
@@ -200,7 +200,7 @@ let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in
class FPLoad_r<bits<3> funct3, string opcodestr, DAGOperand rty,
SchedWrite sw>
: RVInstI<funct3, OPC_LOAD_FP, (outs rty:$rd),
- (ins BasePtr:$rs1, simm12_lo:$imm12),
+ (ins BasePtr:$rs1, simm12_lo_optional:$imm12),
opcodestr, "$rd, ${imm12}(${rs1})">,
Sched<[sw, ReadFMemBase]>;
@@ -208,7 +208,7 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in
class FPStore_r<bits<3> funct3, string opcodestr, DAGOperand rty,
SchedWrite sw>
: RVInstS<funct3, OPC_STORE_FP, (outs),
- (ins rty:$rs2, BasePtr:$rs1, simm12_lo:$imm12),
+ (ins rty:$rs2, BasePtr:$rs1, simm12_lo_optional:$imm12),
opcodestr, "$rs2, ${imm12}(${rs1})">,
Sched<[sw, ReadFStoreData, ReadFMemBase]>;
@@ -476,9 +476,6 @@ def : InstAlias<"fsflagsi $imm", (CSRRWI X0, SysRegFFLAGS.Encoding, ui
} // Predicates = [HasStdExtFOrZfinx]
let Predicates = [HasStdExtF] in {
-def : InstAlias<"flw $rd, (${rs1})", (FLW FPR32:$rd, GPR:$rs1, 0), 0>;
-def : InstAlias<"fsw $rs2, (${rs1})", (FSW FPR32:$rs2, GPR:$rs1, 0), 0>;
-
def : InstAlias<"fmv.s $rd, $rs", (FSGNJ_S FPR32:$rd, FPR32:$rs, FPR32:$rs)>;
def : InstAlias<"fabs.s $rd, $rs", (FSGNJX_S FPR32:$rd, FPR32:$rs, FPR32:$rs)>;
def : InstAlias<"fneg.s $rd, $rs", (FSGNJN_S FPR32:$rd, FPR32:$rs, FPR32:$rs)>;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoQ.td b/llvm/lib/Target/RISCV/RISCVInstrInfoQ.td
index 4d0d71b93a055..1bb3d30eda1ea 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoQ.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoQ.td
@@ -145,9 +145,6 @@ foreach Ext = QExtsRV64 in {
//===----------------------------------------------------------------------===//
let Predicates = [HasStdExtQ] in {
- def : InstAlias<"flq $rd, (${rs1})", (FLQ FPR128:$rd, GPR:$rs1, 0), 0>;
- def : InstAlias<"fsq $rs2, (${rs1})", (FSQ FPR128:$rs2, GPR:$rs1, 0), 0>;
-
def : InstAlias<"fmv.q $rd, $rs", (FSGNJ_Q FPR128:$rd, FPR128:$rs,
FPR128:$rs)>;
def : InstAlias<"fabs.q $rd, $rs", (FSGNJX_Q FPR128:$rd, FPR128:$rs,
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
index ea3c5927f1da8..71c8e5f78bc65 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
@@ -1392,13 +1392,13 @@ let hasSideEffects = false, mayLoad = true, mayStore = false, Size = 4,
isCodeGenOnly = false in
class PseudoQCAccessLoad_ri<string opcodestr>
: Pseudo<(outs GPR:$rd),
- (ins BasePtr:$rs1, simm12:$imm12, qc_access_symbol:$expr), [],
+ (ins BasePtr:$rs1, simm12_optional:$imm12, qc_access_symbol:$expr), [],
opcodestr, "$rd, ${imm12}(${rs1}), $expr">;
let hasSideEffects = false, mayLoad = false, mayStore = true, Size = 4,
isCodeGenOnly = false in
class PseudoQCAccessStore_rri<string opcodestr>
- : Pseudo<(outs), (ins GPR:$rs2, BasePtr:$rs1, simm12:$imm12, qc_access_symbol:$expr),
+ : Pseudo<(outs), (ins GPR:$rs2, BasePtr:$rs1, simm12_optional:$imm12, qc_access_symbol:$expr),
[], opcodestr, "$rs2, ${imm12}(${rs1}), $expr">;
@@ -1409,31 +1409,10 @@ def PseudoQCAccessLH : PseudoQCAccessLoad_ri<"lh">;
def PseudoQCAccessLHU : PseudoQCAccessLoad_ri<"lhu">;
def PseudoQCAccessLW : PseudoQCAccessLoad_ri<"lw">;
-let EmitPriority = 0 in {
-def : InstAlias<"lb $rd, (${rs1}), $expr",
- (PseudoQCAccessLB GPR:$rd, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-def : InstAlias<"lbu $rd, (${rs1}), $expr",
- (PseudoQCAccessLB GPR:$rd, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-def : InstAlias<"lh $rd, (${rs1}), $expr",
- (PseudoQCAccessLH GPR:$rd, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-def : InstAlias<"lhu $rd, (${rs1}), $expr",
- (PseudoQCAccessLHU GPR:$rd, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-def : InstAlias<"lw $rd, (${rs1}), $expr",
- (PseudoQCAccessLW GPR:$rd, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-}
-
def PseudoQCAccessSW : PseudoQCAccessStore_rri<"sw">;
def PseudoQCAccessSH : PseudoQCAccessStore_rri<"sh">;
def PseudoQCAccessSB : PseudoQCAccessStore_rri<"sb">;
-let EmitPriority = 0 in {
-def : InstAlias<"sb $rs2, (${rs1}), $expr",
- (PseudoQCAccessSB GPR:$rs2, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-def : InstAlias<"sh $rs2, (${rs1}), $expr",
- (PseudoQCAccessSH GPR:$rs2, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-def : InstAlias<"sw $rs2, (${rs1}), $expr",
- (PseudoQCAccessSW GPR:$rs2, BasePtr:$rs1, 0, qc_access_symbol:$expr)>;
-}
}
let hasSideEffects = false, mayLoad = true, mayStore = false, Size = 2,
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
index f24ae6b2bfba6..753772ba09ab0 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
@@ -229,11 +229,6 @@ foreach Ext = ZfhminDExts in {
// Assembler Pseudo Instructions (User-Level ISA, Version 2.2, Chapter 20)
//===----------------------------------------------------------------------===//
-let Predicates = [HasHalfFPLoadStoreMove] in {
-def : InstAlias<"flh $rd, (${rs1})", (FLH FPR16:$rd, GPR:$rs1, 0), 0>;
-def : InstAlias<"fsh $rs2, (${rs1})", (FSH FPR16:$rs2, GPR:$rs1, 0), 0>;
-} // Predicates = [HasStdExtZfhmin]
-
let Predicates = [HasStdExtZfh] in {
def : InstAlias<"fmv.h $rd, $rs", (FSGNJ_H FPR16:$rd, FPR16:$rs, FPR16:$rs)>;
def : InstAlias<"fabs.h $rd, $rs", (FSGNJX_H FPR16:$rd, FPR16:$rs, FPR16:$rs)>;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZilsd.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZilsd.td
index 4fc859f2547c1..26b826ac6d691 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoZilsd.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZilsd.td
@@ -50,7 +50,7 @@ def PseudoSD_RV32 : PseudoStore<"sd", GPRPairRV32>;
// Pseudo instructions for load/store optimization with 2 separate registers
def PseudoLD_RV32_OPT :
Pseudo<(outs GPR:$rd1, GPR:$rd2),
- (ins GPR:$rs1, simm12_lo:$imm12), [], "", ""> {
+ (ins GPR:$rs1, simm12_lo_optional:$imm12), [], "", ""> {
let hasSideEffects = 0;
let mayLoad = 1;
let mayStore = 0;
@@ -58,12 +58,9 @@ def PseudoLD_RV32_OPT :
def PseudoSD_RV32_OPT :
Pseudo<(outs),
- (ins GPR:$rs1, GPR:$rs2, GPR:$rs3, simm12_lo:$imm12), [], "", ""> {
+ (ins GPR:$rs1, GPR:$rs2, GPR:$rs3, simm12_lo_optional:$imm12), [], "", ""> {
let hasSideEffects = 0;
let mayLoad = 0;
let mayStore = 1;
}
-
-def : InstAlias<"ld $rd, (${rs1})", (LD_RV32 GPRPairRV32:$rd, GPR:$rs1, 0), 0>;
-def : InstAlias<"sd $rs2, (${rs1})", (SD_RV32 GPRPairRV32:$rs2, GPR:$rs1, 0), 0>;
}
diff --git a/llvm/test/MC/RISCV/rv32i-invalid.s b/llvm/test/MC/RISCV/rv32i-invalid.s
index 6d9f0ca18e232..80af2c12d5287 100644
--- a/llvm/test/MC/RISCV/rv32i-invalid.s
+++ b/llvm/test/MC/RISCV/rv32i-invalid.s
@@ -79,9 +79,8 @@ lw a0, -2049(a3)
lw a0, -2049(f0)
# CHECK: :[[@LINE-1]]:1: error: invalid instruction, any one of the following would fix this:
# CHECK: :[[@LINE-2]]:8: note: operand must be a bare symbol name
-# CHECK: :[[@LINE-3]]:8: note: expected '('
-# CHECK: :[[@LINE-4]]:8: note: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo specifier or an integer in the range [-2048, 2047]
-# CHECK: :[[@LINE-5]]:8: note: immediate must be an integer in the range [-2048, 2047]
+# CHECK: :[[@LINE-3]]:8: note: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo specifier or an integer in the range [-2048, 2047]
+# CHECK: :[[@LINE-4]]:8: note: immediate must be an integer in the range [-2048, 2047]
ld a0, (a3)
# CHECK: :[[@LINE-1]]:1: error: instruction requires the following: 'Zilsd' (Load/Store pair instructions)
diff --git a/llvm/test/MC/RISCV/tlsdesc.s b/llvm/test/MC/RISCV/tlsdesc.s
index b75934f3ff4d7..32a110d789392 100644
--- a/llvm/test/MC/RISCV/tlsdesc.s
+++ b/llvm/test/MC/RISCV/tlsdesc.s
@@ -5,8 +5,8 @@
# RUN: llvm-mc -filetype=obj -triple riscv64 < %s --mattr=+relax | llvm-objdump -dr -M no-aliases - | FileCheck %s --check-prefixes=INST,RELAX,RV64
-# RUN: not llvm-mc -triple riscv32 < %s --defsym RV32=1 --defsym ERR=1 2>&1 | FileCheck %s --check-prefixes=ERR
-# RUN: not llvm-mc -triple riscv64 < %s --defsym ERR=1 2>&1 | FileCheck %s --check-prefixes=ERR
+# RUN: not llvm-mc -triple riscv32 < %s --defsym RV32=1 --defsym ERR=1 2>&1 | FileCheck %s --check-prefixes=ERR --implicit-check-not="error:" --implicit-check-not="note:"
+# RUN: not llvm-mc -triple riscv64 < %s --defsym ERR=1 2>&1 | FileCheck %s --check-prefixes=ERR --implicit-check-not="error:" --implicit-check-not="note:"
start: # @start
# %bb.0: # %entry
@@ -40,25 +40,32 @@ start: # @start
## Check invalid usage
.ifdef ERR
- auipc x1, %tlsdesc_call(foo) # ERR: :[[#@LINE]]:12: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi specifier or an integer in the range
- auipc x1, %tlsdesc_call(1234) # ERR: :[[#@LINE]]:12: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi specifier or an integer in the range
- auipc a0, %tlsdesc_hi(a+b) # ERR: :[[#@LINE]]:12: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi specifier or an integer in the range
+ auipc x1, %tlsdesc_call(foo)
+# ERR: :[[#@LINE-1]]:12: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi specifier or an integer in the range
+ auipc x1, %tlsdesc_call(1234)
+# ERR: :[[#@LINE-1]]:12: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi specifier or an integer in the range
+ auipc a0, %tlsdesc_hi(a+b)
+# ERR: :[[#@LINE-1]]:12: error: operand must be a symbol with a %pcrel_hi/%got_pcrel_hi/%tls_ie_pcrel_hi/%tls_gd_pcrel_hi specifier or an integer in the range
- lw a0, t0, %tlsdesc_load_lo(a_symbol) # ERR: :[[#@LINE]]:15: error: unexpected extra operand for instruction
+ lw a0, t0, %tlsdesc_load_lo(a_symbol)
+# ERR: :[[#@LINE-1]]:15: error: unexpected extra operand for instruction
lw a0, t0, %tlsdesc_load_lo(a_symbol)(a4)
# ERR: :[[#@LINE-1]]:2: error: invalid instruction, any one of the following would fix this:
# ERR: :[[#@LINE-2]]:15: note: unexpected extra operand for instruction
-# ERR: :[[#@LINE-3]]:11: note: expected '('
-# ERR: :[[#@LINE-4]]:11: note: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo specifier or an integer in the range [-2048, 2047]
-# ERR: :[[#@LINE-5]]:11: note: immediate must be an integer in the range [-2048, 2047]
+# ERR: :[[#@LINE-3]]:11: note: operand must be a symbol with %lo/%pcrel_lo/%tprel_lo specifier or an integer in the range [-2048, 2047]
+# ERR: :[[#@LINE-4]]:11: note: immediate must be an integer in the range [-2048, 2047]
- addi a0, t0, %tlsdesc_add_lo(a_symbol)(a4) # ERR: :[[#@LINE]]:41: error: unexpected extra operand for instruction
- addi a0, %tlsdesc_add_lo(a_symbol) # ERR: :[[#@LINE]]:11: error: register must be a GPR
- addi x1, %tlsdesc_load_lo(a_symbol)(a0) # ERR: :[[#@LINE]]:11: error: register must be a GPR
+ addi a0, t0, %tlsdesc_add_lo(a_symbol)(a4)
+# ERR: :[[#@LINE-1]]:41: error: unexpected extra operand for instruction
+ addi a0, %tlsdesc_add_lo(a_symbol)
+# ERR: :[[#@LINE-1]]:11: error: register must be a GPR
+ addi x1, %tlsdesc_load_lo(a_symbol)(a0)
+# ERR: :[[#@LINE-1]]:11: error: register must be a GPR
jalr x5, 0(a1), %tlsdesc_hi(a_symbol)
# ERR: :[[#@LINE-1]]:2: error: invalid instruction, any one of the following would fix this:
# ERR: :[[#@LINE-2]]:18: note: unexpected extra operand for instruction
# ERR: :[[#@LINE-3]]:18: note: operand must be a symbol with %tlsdesc_call specifier
- jalr x1, 0(a1), %tlsdesc_call(a_symbol) # ERR: :[[#@LINE]]:13: error: the output operand must be t0/x5 when using %tlsdesc_call specifier
+ jalr x1, 0(a1), %tlsdesc_call(a_symbol)
+# ERR: :[[#@LINE-1]]:13: error: the output operand must be t0/x5 when using %tlsdesc_call specifier
.endif
More information about the llvm-commits
mailing list