From 974d5d32c8af742058dec16aa6f2cb7cc51222e1 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 28 Apr 2015 04:30:29 +0000 Subject: [PATCH] [opaque pointer type] Encode the pointee type in the bitcode for 'cmpxchg' As a space optimization, this instruction would just encode the pointer type of the first operand and use the knowledge that the second and third operands would be of the pointee type of the first. When typed pointers go away, this assumption will no longer be available - so encode the type of the second operand explicitly and rely on that for the third. Test case added to demonstrate the backwards compatibility concern, which only comes up when the definition of the second operand comes after the use (hence the weird basic block sequence) - at which point the type needs to be explicitly encoded in the bitcode and the record length changes to accommodate this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235966 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Bitcode/LLVMBitCodes.h | 4 +++- lib/Bitcode/Reader/BitcodeReader.cpp | 13 ++++++++----- lib/Bitcode/Writer/BitcodeWriter.cpp | 2 +- test/Bitcode/cmpxchg.3.6.ll | 13 +++++++++++++ test/Bitcode/cmpxchg.3.6.ll.bc | Bin 0 -> 488 bytes 5 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 test/Bitcode/cmpxchg.3.6.ll create mode 100644 test/Bitcode/cmpxchg.3.6.ll.bc diff --git a/include/llvm/Bitcode/LLVMBitCodes.h b/include/llvm/Bitcode/LLVMBitCodes.h index 2db9d809c4f..fe6d3662954 100644 --- a/include/llvm/Bitcode/LLVMBitCodes.h +++ b/include/llvm/Bitcode/LLVMBitCodes.h @@ -336,7 +336,7 @@ namespace bitc { FUNC_CODE_DEBUG_LOC = 35, // DEBUG_LOC: [Line,Col,ScopeVal, IAVal] FUNC_CODE_INST_FENCE = 36, // FENCE: [ordering, synchscope] - FUNC_CODE_INST_CMPXCHG = 37, // CMPXCHG: [ptrty,ptr,cmp,new, align, vol, + FUNC_CODE_INST_CMPXCHG_OLD = 37, // CMPXCHG: [ptrty,ptr,cmp,new, align, vol, // ordering, synchscope] FUNC_CODE_INST_ATOMICRMW = 38, // ATOMICRMW: [ptrty,ptr,val, operation, // align, vol, @@ -350,6 +350,8 @@ namespace bitc { FUNC_CODE_INST_GEP = 43, // GEP: [inbounds, n x operands] FUNC_CODE_INST_STORE = 44, // STORE: [ptrty,ptr,valty,val, align, vol] FUNC_CODE_INST_STOREATOMIC = 45, // STORE: [ptrty,ptr,val, align, vol + FUNC_CODE_INST_CMPXCHG = 46, // CMPXCHG: [ptrty,ptr,valty,cmp,new, align, + // vol,ordering,synchscope] }; enum UseListCodes { diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 1e9a8eb7fd1..cc554a91bea 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -4146,17 +4146,20 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) { InstructionList.push_back(I); break; } + case bitc::FUNC_CODE_INST_CMPXCHG_OLD: case bitc::FUNC_CODE_INST_CMPXCHG: { // CMPXCHG:[ptrty, ptr, cmp, new, vol, successordering, synchscope, // failureordering?, isweak?] unsigned OpNum = 0; Value *Ptr, *Cmp, *New; if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || - popValue(Record, OpNum, NextValueNo, - cast(Ptr->getType())->getElementType(), Cmp) || - popValue(Record, OpNum, NextValueNo, - cast(Ptr->getType())->getElementType(), New) || - (Record.size() < OpNum + 3 || Record.size() > OpNum + 5)) + (BitCode == bitc::FUNC_CODE_INST_CMPXCHG + ? getValueTypePair(Record, OpNum, NextValueNo, Cmp) + : popValue(Record, OpNum, NextValueNo, + cast(Ptr->getType())->getElementType(), + Cmp)) || + popValue(Record, OpNum, NextValueNo, Cmp->getType(), New) || + Record.size() < OpNum + 3 || Record.size() > OpNum + 5) return Error("Invalid record"); AtomicOrdering SuccessOrdering = GetDecodedOrdering(Record[OpNum+1]); if (SuccessOrdering == NotAtomic || SuccessOrdering == Unordered) diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index 840b75e496f..b6444b2d060 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1917,7 +1917,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, case Instruction::AtomicCmpXchg: Code = bitc::FUNC_CODE_INST_CMPXCHG; PushValueAndType(I.getOperand(0), InstID, Vals, VE); // ptrty + ptr - pushValue(I.getOperand(1), InstID, Vals, VE); // cmp. + PushValueAndType(I.getOperand(1), InstID, Vals, VE); // cmp. pushValue(I.getOperand(2), InstID, Vals, VE); // newval. Vals.push_back(cast(I).isVolatile()); Vals.push_back(GetEncodedOrdering( diff --git a/test/Bitcode/cmpxchg.3.6.ll b/test/Bitcode/cmpxchg.3.6.ll new file mode 100644 index 00000000000..bec51a128c3 --- /dev/null +++ b/test/Bitcode/cmpxchg.3.6.ll @@ -0,0 +1,13 @@ +; RUN: llvm-dis < %s.bc | FileCheck %s + +define void @f2(i32* %x, i32 %y.orig, i32 %z) { +entry: + br label %a +b: + cmpxchg i32* %x, i32 %y, i32 %z acquire acquire +; CHECK: cmpxchg i32* %x, i32 %y, i32 %z acquire acquire + ret void +a: + %y = add i32 %y.orig, 1 + br label %a +} diff --git a/test/Bitcode/cmpxchg.3.6.ll.bc b/test/Bitcode/cmpxchg.3.6.ll.bc new file mode 100644 index 0000000000000000000000000000000000000000..1c66f934324a8ab1190f449a9d93dee974fc92cd GIT binary patch literal 488 zcmZ>AK5$Qwhk>D-fq{X$Nr8b0NDBiod!zD1#}h1`Yyw7>lNeigR9QJB}F$U~Vl5k}h%XN#7@Jx&eml@;v8GYWa0G4Q_?;QP|R zXUyXycj%z(xrH)m2CQIZ&C+L>ZBIDc_AuL?spu&wV6Wz2uk>gyC}6KDU@og@FHmTg zJR`{WW&+LBqJ_PU?3mlQXrzmqnQT9-xT$(|r^`2(y3(l5Xm~Hkn+q5uS zpZOqCmcU+}!ET<>UIZi?+6yMM7bLKkX|R|5U-hyAOQt z9`JoV!1sosP=Ns)-fRjYW*{FX0{J39TA0OIM*v7O0K!aiZeHeQyQk}MKHX*d7?g_DXn literal 0 HcmV?d00001