mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-30 15:10:30 +00:00
[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
This commit is contained in:
parent
e1f835ab59
commit
974d5d32c8
@ -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 {
|
||||
|
@ -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<PointerType>(Ptr->getType())->getElementType(), Cmp) ||
|
||||
popValue(Record, OpNum, NextValueNo,
|
||||
cast<PointerType>(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<PointerType>(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)
|
||||
|
@ -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<AtomicCmpXchgInst>(I).isVolatile());
|
||||
Vals.push_back(GetEncodedOrdering(
|
||||
|
13
test/Bitcode/cmpxchg.3.6.ll
Normal file
13
test/Bitcode/cmpxchg.3.6.ll
Normal file
@ -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
|
||||
}
|
BIN
test/Bitcode/cmpxchg.3.6.ll.bc
Normal file
BIN
test/Bitcode/cmpxchg.3.6.ll.bc
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user