diff --git a/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp b/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp --- a/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp +++ b/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp @@ -318,7 +318,8 @@ LoongArchMCExpr::VariantKind VK = LoongArchMCExpr::VK_LoongArch_None; bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); bool IsValidKind = VK == LoongArchMCExpr::VK_LoongArch_None || - VK == LoongArchMCExpr::VK_LoongArch_B16; + VK == LoongArchMCExpr::VK_LoongArch_B16 || + VK == LoongArchMCExpr::VK_LoongArch_PCALA_LO12; return IsConstantImm ? isShiftedInt<16, 2>(Imm) && IsValidKind : LoongArchAsmParser::classifySymbolRef(getImm(), VK) && diff --git a/llvm/test/MC/LoongArch/Relocations/relocations.s b/llvm/test/MC/LoongArch/Relocations/relocations.s --- a/llvm/test/MC/LoongArch/Relocations/relocations.s +++ b/llvm/test/MC/LoongArch/Relocations/relocations.s @@ -74,6 +74,11 @@ # INSTR: addi.d $t1, $t1, %pc_lo12(foo+4) # FIXUP: fixup A - offset: 0, value: %pc_lo12(foo+4), kind: FK_NONE +jirl $zero, $t1, %pc_lo12(foo) +# RELOC: R_LARCH_PCALA_LO12 foo 0x0 +# INSTR: jirl $zero, $t1, %pc_lo12(foo) +# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo), kind: FK_NONE + st.b $t1, $a2, %pc_lo12(foo) # RELOC: R_LARCH_PCALA_LO12 foo 0x0 # INSTR: st.b $t1, $a2, %pc_lo12(foo)