forked from OSchip/llvm-project
Roundtrip the inalloca bit on allocas through bitcode
This was an oversight in the original support. As it is, I stuffed this bit into the alignment. The alignment is stored in log2 form, so it doesn't need more than 5 bits, given that Value::MaximumAlignment is 1 << 29. Reviewers: nicholas Differential Revision: http://reviews.llvm.org/D3943 llvm-svn: 213118
This commit is contained in:
parent
b4db99c76a
commit
56b56ea15b
|
@ -290,7 +290,7 @@ namespace bitc {
|
||||||
FUNC_CODE_INST_PHI = 16, // PHI: [ty, val0,bb0, ...]
|
FUNC_CODE_INST_PHI = 16, // PHI: [ty, val0,bb0, ...]
|
||||||
// 17 is unused.
|
// 17 is unused.
|
||||||
// 18 is unused.
|
// 18 is unused.
|
||||||
FUNC_CODE_INST_ALLOCA = 19, // ALLOCA: [instty, op, align]
|
FUNC_CODE_INST_ALLOCA = 19, // ALLOCA: [instty, opty, op, align]
|
||||||
FUNC_CODE_INST_LOAD = 20, // LOAD: [opty, op, align, vol]
|
FUNC_CODE_INST_LOAD = 20, // LOAD: [opty, op, align, vol]
|
||||||
// 21 is unused.
|
// 21 is unused.
|
||||||
// 22 is unused.
|
// 22 is unused.
|
||||||
|
|
|
@ -2889,10 +2889,14 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
|
||||||
dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));
|
dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));
|
||||||
Type *OpTy = getTypeByID(Record[1]);
|
Type *OpTy = getTypeByID(Record[1]);
|
||||||
Value *Size = getFnValueByID(Record[2], OpTy);
|
Value *Size = getFnValueByID(Record[2], OpTy);
|
||||||
unsigned Align = Record[3];
|
unsigned AlignRecord = Record[3];
|
||||||
|
bool InAlloca = AlignRecord & (1 << 5);
|
||||||
|
unsigned Align = AlignRecord & ((1 << 5) - 1);
|
||||||
if (!Ty || !Size)
|
if (!Ty || !Size)
|
||||||
return Error(InvalidRecord);
|
return Error(InvalidRecord);
|
||||||
I = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1);
|
AllocaInst *AI = new AllocaInst(Ty->getElementType(), Size, (1 << Align) >> 1);
|
||||||
|
AI->setUsedWithInAlloca(InAlloca);
|
||||||
|
I = AI;
|
||||||
InstructionList.push_back(I);
|
InstructionList.push_back(I);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1431,13 +1431,20 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Instruction::Alloca:
|
case Instruction::Alloca: {
|
||||||
Code = bitc::FUNC_CODE_INST_ALLOCA;
|
Code = bitc::FUNC_CODE_INST_ALLOCA;
|
||||||
Vals.push_back(VE.getTypeID(I.getType()));
|
Vals.push_back(VE.getTypeID(I.getType()));
|
||||||
Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
|
Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
|
||||||
Vals.push_back(VE.getValueID(I.getOperand(0))); // size.
|
Vals.push_back(VE.getValueID(I.getOperand(0))); // size.
|
||||||
Vals.push_back(Log2_32(cast<AllocaInst>(I).getAlignment())+1);
|
const AllocaInst &AI = cast<AllocaInst>(I);
|
||||||
|
unsigned AlignRecord = Log2_32(AI.getAlignment()) + 1;
|
||||||
|
assert(Log2_32(Value::MaximumAlignment) + 1 < 1 << 5 &&
|
||||||
|
"not enough bits for maximum alignment");
|
||||||
|
assert(AlignRecord < 1 << 5 && "alignment greater than 1 << 64");
|
||||||
|
AlignRecord |= AI.isUsedWithInAlloca() << 5;
|
||||||
|
Vals.push_back(AlignRecord);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case Instruction::Load:
|
case Instruction::Load:
|
||||||
if (cast<LoadInst>(I).isAtomic()) {
|
if (cast<LoadInst>(I).isAtomic()) {
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
||||||
|
|
||||||
|
; inalloca should roundtrip.
|
||||||
|
|
||||||
|
define void @foo(i32* inalloca %args) {
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
; CHECK-LABEL: define void @foo(i32* inalloca %args)
|
||||||
|
|
||||||
|
define void @bar() {
|
||||||
|
; Use the maximum alignment, since we stuff our bit with alignment.
|
||||||
|
%args = alloca inalloca i32, align 536870912
|
||||||
|
call void @foo(i32* inalloca %args)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
; CHECK-LABEL: define void @bar() {
|
||||||
|
; CHECK: %args = alloca inalloca i32, align 536870912
|
||||||
|
; CHECK: call void @foo(i32* inalloca %args)
|
Loading…
Reference in New Issue