[llvm] [RISCV] Implement Relaxation for Xqcilb Jumps (PR #142702)
Sam Elliott via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 3 17:26:04 PDT 2025
================
@@ -135,22 +135,42 @@ bool RISCVAsmBackend::fixupNeedsRelaxationAdvanced(const MCFixup &Fixup,
// For conditional branch instructions the immediate must be
// in the range [-4096, 4095].
return !isInt<13>(Offset);
+ case RISCV::fixup_riscv_jal:
+ // For jump instructions the immediate must be in the range
+ // [-1048576, 1048574]
+ return Offset > 1048574 || Offset < -1048576;
}
}
// Given a compressed control flow instruction this function returns
-// the expanded instruction.
-static unsigned getRelaxedOpcode(unsigned Op) {
- switch (Op) {
- default:
- return Op;
+// the expanded instruction, or the original instruction code if no
+// expansion is available.
+static unsigned getRelaxedOpcode(const MCInst &Inst,
+ const MCSubtargetInfo &STI) {
+ switch (Inst.getOpcode()) {
case RISCV::C_BEQZ:
return RISCV::BEQ;
case RISCV::C_BNEZ:
return RISCV::BNE;
case RISCV::C_J:
case RISCV::C_JAL: // fall through.
+ // This only relaxes one "step" - i.e. from C.J to JAL, not from C.J to
+ // QC.E.J, because we can always relax again if needed.
return RISCV::JAL;
+ case RISCV::JAL: {
+ // We can only relax JAL if we have Xqcilb
+ if (!STI.hasFeature(RISCV::FeatureVendorXqcilb))
+ break;
+
+ // And only if it is using X0 or X1 for rd.
+ const MCRegister &Reg = Inst.getOperand(0).getReg();
----------------
lenary wrote:
Done.
https://github.com/llvm/llvm-project/pull/142702
More information about the llvm-commits
mailing list