diff options
author | Guillaume Chatelet <gchatelet@google.com> | 2021-02-11 15:17:50 -0500 |
---|---|---|
committer | James Y Knight <jyknight@google.com> | 2021-02-11 15:17:50 -0500 |
commit | 17517f3178b5cdda832c4e90f618437c13560013 (patch) | |
tree | f0ae92a136f5e5d9229e5038102a73d57801efd0 /llvm/lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | d06ab79816785fa362e7d96d7a398bea8064cba7 (diff) | |
download | llvm-17517f3178b5cdda832c4e90f618437c13560013.zip llvm-17517f3178b5cdda832c4e90f618437c13560013.tar.gz llvm-17517f3178b5cdda832c4e90f618437c13560013.tar.bz2 |
Encode alignment attribute for `cmpxchg`
This is a follow up patch to D83136 adding the align attribute to `cmpxchg`.
See also D83465 for `atomicrmw`.
Differential Revision: https://reviews.llvm.org/D87443
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 365cf5f..4a77f8c 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -5085,7 +5085,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) { } case bitc::FUNC_CODE_INST_CMPXCHG: { // CMPXCHG: [ptrty, ptr, cmp, val, vol, success_ordering, synchscope, - // failure_ordering, weak] + // failure_ordering, weak, align?] const size_t NumRecords = Record.size(); unsigned OpNum = 0; Value *Ptr = nullptr; @@ -5100,10 +5100,14 @@ Error BitcodeReader::parseFunctionBody(Function *F) { return error("Invalid record"); Value *Val = nullptr; - if (popValue(Record, OpNum, NextValueNo, Cmp->getType(), Val) || - NumRecords < OpNum + 3 || NumRecords > OpNum + 5) + if (popValue(Record, OpNum, NextValueNo, Cmp->getType(), Val)) + return error("Invalid record"); + + if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6) return error("Invalid record"); + const bool IsVol = Record[OpNum]; + const AtomicOrdering SuccessOrdering = getDecodedOrdering(Record[OpNum + 1]); if (SuccessOrdering == AtomicOrdering::NotAtomic || @@ -5118,14 +5122,23 @@ Error BitcodeReader::parseFunctionBody(Function *F) { const AtomicOrdering FailureOrdering = getDecodedOrdering(Record[OpNum + 3]); - const Align Alignment( - TheModule->getDataLayout().getTypeStoreSize(Cmp->getType())); + const bool IsWeak = Record[OpNum + 4]; + + MaybeAlign Alignment; - I = new AtomicCmpXchgInst(Ptr, Cmp, Val, Alignment, SuccessOrdering, + if (NumRecords == (OpNum + 6)) { + if (Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment)) + return Err; + } + if (!Alignment) + Alignment = + Align(TheModule->getDataLayout().getTypeStoreSize(Cmp->getType())); + + I = new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering, FailureOrdering, SSID); FullTy = StructType::get(Context, {FullTy, Type::getInt1Ty(Context)}); - cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); - cast<AtomicCmpXchgInst>(I)->setWeak(Record[OpNum + 4]); + cast<AtomicCmpXchgInst>(I)->setVolatile(IsVol); + cast<AtomicCmpXchgInst>(I)->setWeak(IsWeak); InstructionList.push_back(I); break; |