diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-10-03 02:37:15 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-10-03 02:37:15 +0000 |
commit | 0f83d66ae72cf51927ef592affe85ce9a2f9386f (patch) | |
tree | 070cf659876f7bcd78a690ce2a3e951aab25d7e1 /llvm | |
parent | 34eac35a6096163bce8a889f0c9a696cedfca08a (diff) | |
download | bcm5719-llvm-0f83d66ae72cf51927ef592affe85ce9a2f9386f.tar.gz bcm5719-llvm-0f83d66ae72cf51927ef592affe85ce9a2f9386f.zip |
Add atomicrmw operation to error messages
llvm-svn: 343656
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Assembler/invalid-atomicrmw-add-must-be-integer-type.ll | 7 |
3 files changed, 19 insertions, 5 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 30d3b49d9d7..ce45bfcbb6a 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -6724,8 +6724,13 @@ int LLParser::ParseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) { return Error(PtrLoc, "atomicrmw operand must be a pointer"); if (cast<PointerType>(Ptr->getType())->getElementType() != Val->getType()) return Error(ValLoc, "atomicrmw value and pointer type do not match"); - if (!Val->getType()->isIntegerTy()) - return Error(ValLoc, "atomicrmw operand must be an integer"); + + if (!Val->getType()->isIntegerTy()) { + return Error(ValLoc, "atomicrmw " + + AtomicRMWInst::getOperationName(Operation) + + " operand must be an integer"); + } + unsigned Size = Val->getType()->getPrimitiveSizeInBits(); if (Size < 8 || (Size & (Size - 1))) return Error(ValLoc, "atomicrmw operand must be power-of-two byte-sized" diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 40d1edc33e7..cd032a840b0 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -3348,17 +3348,19 @@ void Verifier::visitAtomicRMWInst(AtomicRMWInst &RMWI) { "atomicrmw instructions must be atomic.", &RMWI); Assert(RMWI.getOrdering() != AtomicOrdering::Unordered, "atomicrmw instructions cannot be unordered.", &RMWI); + auto Op = RMWI.getOperation(); PointerType *PTy = dyn_cast<PointerType>(RMWI.getOperand(0)->getType()); Assert(PTy, "First atomicrmw operand must be a pointer.", &RMWI); Type *ElTy = PTy->getElementType(); - Assert(ElTy->isIntegerTy(), "atomicrmw operand must have integer type!", + Assert(ElTy->isIntegerTy(), "atomicrmw " + + AtomicRMWInst::getOperationName(Op) + + " operand must have integer type!", &RMWI, ElTy); checkAtomicMemAccessSize(ElTy, &RMWI); Assert(ElTy == RMWI.getOperand(1)->getType(), "Argument value type does not match pointer operand type!", &RMWI, ElTy); - Assert(AtomicRMWInst::FIRST_BINOP <= RMWI.getOperation() && - RMWI.getOperation() <= AtomicRMWInst::LAST_BINOP, + Assert(AtomicRMWInst::FIRST_BINOP <= Op && Op <= AtomicRMWInst::LAST_BINOP, "Invalid binary operation!", &RMWI); visitInstruction(RMWI); } diff --git a/llvm/test/Assembler/invalid-atomicrmw-add-must-be-integer-type.ll b/llvm/test/Assembler/invalid-atomicrmw-add-must-be-integer-type.ll new file mode 100644 index 00000000000..1fc00b0b90d --- /dev/null +++ b/llvm/test/Assembler/invalid-atomicrmw-add-must-be-integer-type.ll @@ -0,0 +1,7 @@ +; RUN: not llvm-as -disable-output %s 2>&1 | FileCheck %s + +; CHECK: error: atomicrmw add operand must be an integer +define void @f(float* %ptr) { + atomicrmw add float* %ptr, float 1.0 seq_cst + ret void +} |