diff options
author | Lu Weining <luweining@loongson.cn> | 2024-03-04 08:38:52 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-04 08:38:52 +0800 |
commit | 5f058aa211995d2f0df2a0e063532832569cb7a8 (patch) | |
tree | 5930b61d53c4a55c4042da9df0e431992036d44a /llvm/lib/Target/LoongArch | |
parent | b29301cd40441b5eb8cef9356429fb081e6b6a72 (diff) | |
download | llvm-5f058aa211995d2f0df2a0e063532832569cb7a8.zip llvm-5f058aa211995d2f0df2a0e063532832569cb7a8.tar.gz llvm-5f058aa211995d2f0df2a0e063532832569cb7a8.tar.bz2 |
[LoongArch] Override LoongArchTargetLowering::getExtendForAtomicCmpSwapArg (#83656)
This patch aims to solve Firefox issue:
https://bugzilla.mozilla.org/show_bug.cgi?id=1882301
Similar to 616289ed2922. Currently LoongArch uses an ll.[wd]/sc.[wd]
loop for ATOMIC_CMP_XCHG. Because the comparison in the loop is
full-width (i.e. the `bne` instruction), we must sign extend the input
comparsion argument.
Note that LoongArch ISA manual V1.1 has introduced compare-and-swap
instructions. We would change the implementation (return `ANY_EXTEND`)
when we support them.
Diffstat (limited to 'llvm/lib/Target/LoongArch')
-rw-r--r-- | llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/LoongArch/LoongArchISelLowering.h | 2 |
2 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp index 3324dd2..c8e955a 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp @@ -4963,3 +4963,8 @@ bool LoongArchTargetLowering::hasAndNotCompare(SDValue Y) const { return !isa<ConstantSDNode>(Y); } + +ISD::NodeType LoongArchTargetLowering::getExtendForAtomicCmpSwapArg() const { + // TODO: LAMCAS will use amcas{_DB,}.[bhwd] which does not require extension. + return ISD::SIGN_EXTEND; +} diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h index 7218262..9e9ac0b 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h @@ -206,6 +206,8 @@ public: return ISD::SIGN_EXTEND; } + ISD::NodeType getExtendForAtomicCmpSwapArg() const override; + Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override; bool mayBeEmittedAsTailCall(const CallInst *CI) const override; |