aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff options
context:
space:
mode:
authorGuillaume Chatelet <gchatelet@google.com>2021-02-11 15:17:50 -0500
committerJames Y Knight <jyknight@google.com>2021-02-11 15:17:50 -0500
commit17517f3178b5cdda832c4e90f618437c13560013 (patch)
treef0ae92a136f5e5d9229e5038102a73d57801efd0 /llvm/lib/Bitcode/Reader/BitcodeReader.cpp
parentd06ab79816785fa362e7d96d7a398bea8064cba7 (diff)
downloadllvm-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.cpp29
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;