Skip to content

Commit 300f4ed

Browse files
committed
[CHERI] Set canFoldAsLoad and isReMaterializable on CHERI loads to match upstream RISCV loads.
1 parent eb99bc0 commit 300f4ed

File tree

1 file changed

+36
-35
lines changed

1 file changed

+36
-35
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoXCheri.td

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,12 @@ multiclass AMO_C_rr_aq_rl<string YLenstr, bits<5> funct5, bits<3> funct3,
201201
}
202202

203203
multiclass CheriLoad_ri<bits<3> funct3, string opcodestr> {
204-
let hasSideEffects = 0, mayLoad = 1, mayStore = 0,
205-
DecoderNamespace = "CapModeOnly_" in def ""
206-
: RVInstI<funct3, OPC_LOAD, (outs GPR:$rd),
207-
(ins YGPR:$rs1, simm12:$imm12), "c"#opcodestr,
208-
"$rd, ${imm12}(${rs1})">;
204+
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1,
205+
DecoderNamespace = "CapModeOnly_" in {
206+
def "" : RVInstI<funct3, OPC_LOAD, (outs GPR:$rd),
207+
(ins YGPR:$rs1, simm12:$imm12), "c"#opcodestr,
208+
"$rd, ${imm12}(${rs1})">;
209+
}
209210
def : InstAlias<opcodestr#" $rd, ${imm12}(${rs1})",
210211
(!cast<Instruction>(NAME) GPR:$rd, YGPR:$rs1, simm12:$imm12),
211212
0>;
@@ -326,9 +327,9 @@ class CCheriStackStore<bits<3> funct3, string OpcodeStr,
326327
: RVInst16CSS<funct3, 0b10, (outs), (ins cls:$rs2, CSP:$rs1, opnd:$imm),
327328
OpcodeStr, "$rs2, ${imm}(${rs1})">;
328329

329-
let hasSideEffects = 0, mayLoad = 1,
330-
mayStore = 0 in class CCheriLoad_ri<bits<3> funct3, string OpcodeStr,
331-
RegisterClass cls, DAGOperand opnd>
330+
let hasSideEffects = 0, mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1 in
331+
class CCheriLoad_ri<bits<3> funct3, string OpcodeStr,
332+
RegisterClass cls, DAGOperand opnd>
332333
: RVInst16CL<funct3, 0b00, (outs cls:$rd), (ins YGPRC:$rs1, opnd:$imm),
333334
OpcodeStr, "$rd, ${imm}(${rs1})">;
334335

@@ -906,25 +907,25 @@ defm CSD : CheriStore_ri<0b011, "sd">;
906907
} // Predicates = [HasCheri, IsRV64, IsCapMode]
907908

908909
let Predicates = [HasCheri, IsRV32, IsCapMode] in {
909-
let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0, mayLoad = 1,
910-
mayStore = 0 in def CLC_64
911-
: RVInstI<0x3, OPC_LOAD, (outs YGPR:$rd), (ins YGPR:$rs1, simm12:$imm12),
912-
"clc", "$rd, ${imm12}(${rs1})">;
910+
let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0,
911+
mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1 in {
912+
def CLC_64 : RVInstI<0x3, OPC_LOAD, (outs YGPR:$rd), (ins YGPR:$rs1, simm12:$imm12),
913+
"clc", "$rd, ${imm12}(${rs1})">;
914+
}
913915
def : InstAlias<"lc $rd, ${imm12}(${rs1})",
914916
(CLC_64 YGPR:$rd, YGPR:$rs1, simm12:$imm12), 0>;
915917

916-
let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0, mayLoad = 0,
917-
mayStore =
918-
1 in def CSC_64 : RVInstS<0x3, OPC_STORE, (outs),
919-
(ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
920-
"csc", "$rs2, ${imm12}(${rs1})">;
918+
let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0, mayLoad = 0, mayStore = 1 in {
919+
def CSC_64 : RVInstS<0x3, OPC_STORE, (outs), (ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
920+
"csc", "$rs2, ${imm12}(${rs1})">;
921+
}
921922
def : InstAlias<"sc $rs2, ${imm12}(${rs1})",
922-
(CSC_64 YGPR:$rs2, YGPR:$rs1, simm12:$imm12), 0>;
923+
(CSC_64 YGPR:$rs2, YGPR:$rs1, simm12:$imm12), 0>;
923924

924-
defm : CPrefixedInstAlias<"lc $rd, (${rs1})", (CLC_64 YGPR:$rd, YGPR:$rs1,
925-
0)>;
926-
defm : CPrefixedInstAlias<"sc $rs2, (${rs1})", (CSC_64 YGPR:$rs2, YGPR:$rs1,
927-
0)>;
925+
defm : CPrefixedInstAlias<"lc $rd, (${rs1})",
926+
(CLC_64 YGPR:$rd, YGPR:$rs1, 0)>;
927+
defm : CPrefixedInstAlias<"sc $rs2, (${rs1})",
928+
(CSC_64 YGPR:$rs2, YGPR:$rs1, 0)>;
928929
}
929930

930931
let Predicates = [HasCheriot] in {
@@ -935,25 +936,25 @@ let Predicates = [HasCheriot] in {
935936
}
936937

937938
let Predicates = [HasCheri, IsRV64, IsCapMode] in {
938-
let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0, mayLoad = 1,
939-
mayStore = 0 in def CLC_128
940-
: RVInstI<0x2, OPC_MISC_MEM, (outs YGPR:$rd),
941-
(ins YGPR:$rs1, simm12:$imm12), "clc", "$rd, ${imm12}(${rs1})">;
939+
let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0,
940+
mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1 in {
941+
def CLC_128 : RVInstI<0x2, OPC_MISC_MEM, (outs YGPR:$rd), (ins YGPR:$rs1, simm12:$imm12),
942+
"clc", "$rd, ${imm12}(${rs1})">;
943+
}
942944
def : InstAlias<"lc $rd, ${imm12}(${rs1})",
943945
(CLC_128 YGPR:$rd, YGPR:$rs1, simm12:$imm12), 0>;
944946

945-
let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0, mayLoad = 0,
946-
mayStore =
947-
1 in def CSC_128 : RVInstS<0x4, OPC_STORE, (outs),
948-
(ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
949-
"csc", "$rs2, ${imm12}(${rs1})">;
947+
let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0, mayLoad = 0, mayStore = 1 in {
948+
def CSC_128 : RVInstS<0x4, OPC_STORE, (outs), (ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
949+
"csc", "$rs2, ${imm12}(${rs1})">;
950+
}
950951
def : InstAlias<"sc $rs2, ${imm12}(${rs1})",
951952
(CSC_128 YGPR:$rs2, YGPR:$rs1, simm12:$imm12), 0>;
952953

953-
defm : CPrefixedInstAlias<"lc $rd, (${rs1})", (CLC_128 YGPR:$rd, YGPR:$rs1,
954-
0)>;
955-
defm : CPrefixedInstAlias<"sc $rs2, (${rs1})", (CSC_128 YGPR:$rs2, YGPR:$rs1,
956-
0)>;
954+
defm : CPrefixedInstAlias<"lc $rd, (${rs1})",
955+
(CLC_128 YGPR:$rd, YGPR:$rs1, 0)>;
956+
defm : CPrefixedInstAlias<"sc $rs2, (${rs1})",
957+
(CSC_128 YGPR:$rs2, YGPR:$rs1, 0)>;
957958
}
958959

959960
let Predicates = [HasCheri, IsCapMode] in {

0 commit comments

Comments
 (0)