diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-17 10:49:01 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-17 10:49:01 +0000 |
commit | 0cb08e448af7167ada767e0526aa44980e72ad08 (patch) | |
tree | 59214d5b7a046471bf9645a0828f4f6e2dd7215e /llvm/lib/AsmParser/LLParser.cpp | |
parent | bd13c9787f7076207f1b09823565572b16d31c10 (diff) | |
download | bcm5719-llvm-0cb08e448af7167ada767e0526aa44980e72ad08.tar.gz bcm5719-llvm-0cb08e448af7167ada767e0526aa44980e72ad08.zip |
Allow FP types for atomicrmw xchg
llvm-svn: 351427
Diffstat (limited to 'llvm/lib/AsmParser/LLParser.cpp')
-rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index ee634505581..816bb4e9401 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -6850,12 +6850,20 @@ int LLParser::ParseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) { if (cast<PointerType>(Ptr->getType())->getElementType() != Val->getType()) return Error(ValLoc, "atomicrmw value and pointer type do not match"); - if (!Val->getType()->isIntegerTy()) { + if (Operation != AtomicRMWInst::Xchg && !Val->getType()->isIntegerTy()) { return Error(ValLoc, "atomicrmw " + AtomicRMWInst::getOperationName(Operation) + " operand must be an integer"); } + if (Operation == AtomicRMWInst::Xchg && + !Val->getType()->isIntegerTy() && + !Val->getType()->isFloatingPointTy()) { + return Error(ValLoc, "atomicrmw " + + AtomicRMWInst::getOperationName(Operation) + + " operand must be an integer or floating point type"); + } + unsigned Size = Val->getType()->getPrimitiveSizeInBits(); if (Size < 8 || (Size & (Size - 1))) return Error(ValLoc, "atomicrmw operand must be power-of-two byte-sized" |