From f0dc236d3384e5d5dce2e39a8a3202325899eae5 Mon Sep 17 00:00:00 2001 From: Sam Elliott Date: Sat, 12 Apr 2025 13:57:29 -0700 Subject: [PATCH] [RISCV][NFC] Correct c_lui_imm (#135448) The MCOperandPredicate seems to allow symbols as well as immediates, but the parser/matcher does not due to `isCLUIImm`. This brings both in line with each other, and should prevent trying to compress a `lui` with a symbol, which cannot be emitted as a `c.lui` as there are no relocations for this as `R_RISCV_RVC_LUI` is deprecated/removed. --- llvm/lib/Target/RISCV/RISCVInstrInfoC.td | 8 ++++---- llvm/test/MC/RISCV/rv32c-invalid.s | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td index fc036f651611..252100c814f2 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -85,10 +85,10 @@ def c_lui_imm : RISCVOp, let OperandType = "OPERAND_CLUI_IMM"; let MCOperandPredicate = [{ int64_t Imm; - if (MCOp.evaluateAsConstantImm(Imm)) - return (Imm != 0) && (isUInt<5>(Imm) || - (Imm >= 0xfffe0 && Imm <= 0xfffff)); - return MCOp.isBareSymbolRef(); + if (!MCOp.evaluateAsConstantImm(Imm)) + return false; + return (Imm != 0) && (isUInt<5>(Imm) || + (Imm >= 0xfffe0 && Imm <= 0xfffff)); }]; } diff --git a/llvm/test/MC/RISCV/rv32c-invalid.s b/llvm/test/MC/RISCV/rv32c-invalid.s index 1027c08505d5..8dddbf887c87 100644 --- a/llvm/test/MC/RISCV/rv32c-invalid.s +++ b/llvm/test/MC/RISCV/rv32c-invalid.s @@ -69,6 +69,7 @@ c.lui t0, 0 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xffff c.lui t0, 32 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31] c.lui t0, 0xffffdf # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31] c.lui t0, 0x1000000 # CHECK: :[[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31] +c.lui t0, foo # CHECK: [[@LINE]]:11: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31] ## uimm8_lsb00 c.lwsp ra, 256(sp) # CHECK: :[[@LINE]]:13: error: immediate must be a multiple of 4 bytes in the range [0, 252]