Skip to content

Commit 085e8f1

Browse files
authored
[RISCV] Relax destination instruction dag operand matching in CompresInstEmitter (#148660)
We have some 48-bit instructions in the `Xqci` spec that currently cannot be compressed to their 32-bit variants due to the constraint in `CompressInstEmitter` on destination instruction operands not being allowed to mismatch with the DAG operands. For eg. the` QC_E_ADDI` instruction can be compressed to the `ADDI` instruction when the immediate is signed-12 bit but this is currently not possible since the `QC_E_ADDI` instruction has `GPRNoX0` register operands while the `ADDI` instruction has `GPR` register operands leading to an operand type validation error. I think we can remove the check that only source instruction operands can mismatch with the corresponding DAG operands and rely on the fact that we check if the DAG register operand type is a subclass of the instruction register operand type.
1 parent ad9a953 commit 085e8f1

File tree

3 files changed

+61
-7
lines changed

3 files changed

+61
-7
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,6 +1638,24 @@ def : CompressPat<(QC_E_ADDAI X2, simm10_lsb0000nonzero:$imm),
16381638
(C_ADDI16SP X2, simm10_lsb0000nonzero:$imm)>;
16391639
def : CompressPat<(QC_E_ADDI X2, X2, simm10_lsb0000nonzero:$imm),
16401640
(C_ADDI16SP X2, simm10_lsb0000nonzero:$imm)>;
1641+
1642+
def : CompressPat<(QC_E_ADDI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm),
1643+
(ADDI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm)>;
1644+
def : CompressPat<(QC_E_ANDI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm),
1645+
(ANDI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm)>;
1646+
def : CompressPat<(QC_E_ORI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm),
1647+
(ORI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm)>;
1648+
def : CompressPat<(QC_E_XORI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm),
1649+
(XORI GPRNoX0:$rs1, GPRNoX0:$rs2, simm12:$imm)>;
1650+
1651+
def : CompressPat<(QC_E_ADDAI GPRNoX0:$rd, simm12:$imm),
1652+
(ADDI GPRNoX0:$rd, GPRNoX0:$rd, simm12:$imm)>;
1653+
def : CompressPat<(QC_E_ANDAI GPRNoX0:$rd, simm12:$imm),
1654+
(ANDI GPRNoX0:$rd, GPRNoX0:$rd, simm12:$imm)>;
1655+
def : CompressPat<(QC_E_ORAI GPRNoX0:$rd, simm12:$imm),
1656+
(ORI GPRNoX0:$rd, GPRNoX0:$rd, simm12:$imm)>;
1657+
def : CompressPat<(QC_E_XORAI GPRNoX0:$rd, simm12:$imm),
1658+
(XORI GPRNoX0:$rd, GPRNoX0:$rd, simm12:$imm)>;
16411659
} // let isCompressOnly = true, Predicates = [HasVendorXqcilia, IsRV32]
16421660

16431661
let Predicates = [HasVendorXqciac, IsRV32] in {

llvm/test/MC/RISCV/xqcilia-valid.s

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,43 @@ qc.e.addai x2, 48
123123
# CHECK-NOALIAS: c.andi s1, -1
124124
# CHECK-ENC: encoding: [0xfd,0x98]
125125
qc.e.andai x9, 4294967295
126+
127+
# CHECK-ALIAS: addi t0, t2, 400
128+
# CHECK-NOALIAS: addi t0, t2, 400
129+
# CHECK-ENC: encoding: [0x93,0x82,0x03,0x19]
130+
qc.e.addi x5, x7, 400
131+
132+
# CHECK-ALIAS: andi t0, t2, 750
133+
# CHECK-NOALIAS: andi t0, t2, 750
134+
# CHECK-ENC: encoding: [0x93,0xf2,0xe3,0x2e]
135+
qc.e.andi x5, x7, 750
136+
137+
# CHECK-ALIAS: ori t0, t2, 854
138+
# CHECK-NOALIAS: ori t0, t2, 854
139+
# CHECK-ENC: encoding: [0x93,0xe2,0x63,0x35]
140+
qc.e.ori x5, x7, 854
141+
142+
# CHECK-ALIAS: xori t0, t2, -200
143+
# CHECK-NOALIAS: xori t0, t2, -200
144+
# CHECK-ENC: encoding: [0x93,0xc2,0x83,0xf3]
145+
qc.e.xori x5, x7, -200
146+
147+
# CHECK-ALIAS: addi t2, t2, 400
148+
# CHECK-NOALIAS: addi t2, t2, 400
149+
# CHECK-ENC: encoding: [0x93,0x83,0x03,0x19]
150+
qc.e.addai x7, 400
151+
152+
# CHECK-ALIAS: andi t2, t2, 750
153+
# CHECK-NOALIAS: andi t2, t2, 750
154+
# CHECK-ENC: encoding: [0x93,0xf3,0xe3,0x2e]
155+
qc.e.andai x7, 750
156+
157+
# CHECK-ALIAS: ori t2, t2, 854
158+
# CHECK-NOALIAS: ori t2, t2, 854
159+
# CHECK-ENC: encoding: [0x93,0xe3,0x63,0x35]
160+
qc.e.orai x7, 854
161+
162+
# CHECK-ALIAS: xori t2, t2, -200
163+
# CHECK-NOALIAS: xori t2, t2, -200
164+
# CHECK-ENC: encoding: [0x93,0xc3,0x83,0xf3]
165+
qc.e.xorai x7, -200

llvm/utils/TableGen/CompressInstEmitter.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,6 @@ bool CompressInstEmitter::validateTypes(const Record *DagOpType,
171171
bool IsSourceInst) {
172172
if (DagOpType == InstOpType)
173173
return true;
174-
// Only source instruction operands are allowed to not match Input Dag
175-
// operands.
176-
if (!IsSourceInst)
177-
return false;
178174

179175
if (DagOpType->isSubClassOf("RegisterClass") &&
180176
InstOpType->isSubClassOf("RegisterClass")) {
@@ -258,9 +254,9 @@ void CompressInstEmitter::addDagOperandMapping(const Record *Rec,
258254
continue;
259255
}
260256
// Validate that Dag operand type matches the type defined in the
261-
// corresponding instruction. Operands in the input Dag pattern are
262-
// allowed to be a subclass of the type specified in corresponding
263-
// instruction operand instead of being an exact match.
257+
// corresponding instruction. Operands in the input and output Dag
258+
// patterns are allowed to be a subclass of the type specified in the
259+
// corresponding instruction operand instead of being an exact match.
264260
if (!validateTypes(DI->getDef(), OpndRec, IsSourceInst))
265261
PrintFatalError(Rec->getLoc(),
266262
"Error in Dag '" + Dag->getAsString() +

0 commit comments

Comments
 (0)