[PATCH] Roundtrip the inalloca bit on allocas through bitcode

Nick Lewycky nlewycky at google.com
Thu May 29 15:56:27 PDT 2014


On 29 May 2014 13:33, Reid Kleckner <rnk at google.com> wrote:

> On Thu, May 29, 2014 at 11:31 AM, Nick Lewycky <nicholas at mxc.ca> wrote:
>
>> Reid Kleckner wrote:
>>
>>> Hi nicholas, nlewycky,
>>>
>>> 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 6 bits.
>>>
>>
>> How was alloca encoded in the 3.4 release? What would it someone need to
>> have in their 3.4 .bc file to cause it to be read as inalloca in 3.5?
>> "align 18446744073709551616"?
>
>
> I think using alignment of 9223372036854775808 (2**63) will be read in as
> 'inalloca' with this patch, because it's encoded as log2(alignment)+1, and
> reconstituted with (1<<align)>>1.  Do you want to raise the bar for the
> maximum supported alignment?
>

Oh I'm quite happy with lowering the bar. 4MB should be too much stack
alignment for everybody. Half the address spaces is right out. I just want
to know the number in advance so I'm armed and ready when somebody
complains.

To be polite, if we do want to limit it, we should document the limit and
make the verifier check it. Anybody who actually had this in their bitcode
will discover that it doesn't work in newer llvm's.

Nick

   On the other hand, adding a separate
>>
>>> record might be cleaner.  Hence, I'm asking for a review, since we can't
>>> change the decision once we make it.
>>>
>>> http://reviews.llvm.org/D3943
>>>
>>> Files:
>>>    include/llvm/Bitcode/LLVMBitCodes.h
>>>    lib/Bitcode/Reader/BitcodeReader.cpp
>>>    lib/Bitcode/Writer/BitcodeWriter.cpp
>>>    test/Bitcode/inalloca.ll
>>>
>>> Index: include/llvm/Bitcode/LLVMBitCodes.h
>>> ===================================================================
>>> --- include/llvm/Bitcode/LLVMBitCodes.h
>>> +++ include/llvm/Bitcode/LLVMBitCodes.h
>>> @@ -289,7 +289,7 @@
>>>       FUNC_CODE_INST_PHI         = 16, // PHI:        [ty, val0,bb0, ...]
>>>       // 17 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]
>>>       // 21 is unused.
>>>       // 22 is unused.
>>> Index: lib/Bitcode/Reader/BitcodeReader.cpp
>>> ===================================================================
>>> --- lib/Bitcode/Reader/BitcodeReader.cpp
>>> +++ lib/Bitcode/Reader/BitcodeReader.cpp
>>> @@ -2874,10 +2874,14 @@
>>>           dyn_cast_or_null<PointerType>(getTypeByID(Record[0]));
>>>         Type *OpTy = getTypeByID(Record[1]);
>>>         Value *Size = getFnValueByID(Record[2], OpTy);
>>> -      unsigned Align = Record[3];
>>> +      unsigned AlignBits = Record[3];
>>> +      bool InAlloca = AlignBits&  (1<<  6);
>>> +      unsigned Align = AlignBits&  ((1<<  6) - 1);
>>>
>>>         if (!Ty || !Size)
>>>           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);
>>>         break;
>>>       }
>>> Index: lib/Bitcode/Writer/BitcodeWriter.cpp
>>> ===================================================================
>>> --- lib/Bitcode/Writer/BitcodeWriter.cpp
>>> +++ lib/Bitcode/Writer/BitcodeWriter.cpp
>>> @@ -1397,13 +1397,18 @@
>>>       break;
>>>     }
>>>
>>> -  case Instruction::Alloca:
>>> +  case Instruction::Alloca: {
>>>       Code = bitc::FUNC_CODE_INST_ALLOCA;
>>>       Vals.push_back(VE.getTypeID(I.getType()));
>>>       Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
>>>       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(AlignRecord<  1<<  6&&  "alignment greater than 1<<  64");
>>>
>>> +    AlignRecord |= AI.isUsedWithInAlloca()<<  6;
>>> +    Vals.push_back(AlignRecord);
>>>       break;
>>> +  }
>>>
>>>     case Instruction::Load:
>>>       if (cast<LoadInst>(I).isAtomic()) {
>>> Index: test/Bitcode/inalloca.ll
>>> ===================================================================
>>> --- /dev/null
>>> +++ test/Bitcode/inalloca.ll
>>> @@ -0,0 +1,17 @@
>>> +; 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() {
>>> +  %args = alloca inalloca i32
>>> +  call void @foo(i32* inalloca %args)
>>> +  ret void
>>> +}
>>> +; CHECK-LABEL: define void @bar() {
>>> +; CHECK: %args = alloca inalloca i32
>>> +; CHECK: call void @foo(i32* inalloca %args)
>>>
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140529/814f3e4c/attachment.html>


More information about the llvm-commits mailing list