[LLVMdev] Cast failure in SelectionDAGBuilder
Talin
viridia at gmail.com
Mon Oct 25 09:44:51 PDT 2010
Sorry about the formatting on the code samples...I was trying to get them
not to line wrap. (What the world really needs is a pretty-printer for LLVM
IR.)
On Fri, Oct 22, 2010 at 6:10 PM, Talin <viridia at gmail.com> wrote:
> I'm trying to track down the problem with the assertion failure in
> SelectionDAGBuilder.cpp. This is the code:
>
> *case* *Intrinsic*::gcroot:
> *if* (GFI) {
> *const* Value *Alloca = I.getArgOperand(0);
> *const* Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
> * FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());* GFI->addStackRoot(FI->getIndex(), TypeMap);
> }
> *return* 0
>
> The cast<FrameIndexSDNode> is what's failing. Apparently the node isn't a
> FrameIndexSDNode.
>
> Now, we discussed a similar problem on this list earlier, and it was stated
> that the cause was due to calls to llvm.gcroot() not being in the first
> block. However, that's not the case this time - here's the function being
> processed (according to I.Parent.Parent->dump()):
>
> define internal %tart.core.Object*
> @"tart.core.Object.coerce[int32](int32)->tart.core.Object"(i32 %value) gc
> "tart-gc" {
> prologue:
> call void @llvm.dbg.declare(metadata !{i32 %value}, metadata !48487)
> %gc_root = alloca %"tart.core.ValueRef[char]"*, !dbg !48488
> store %"tart.core.ValueRef[char]"* null, %"tart.core.ValueRef[char]"**
> %gc_root
> %0 = bitcast %"tart.core.ValueRef[char]"** %gc_root to i8**, !dbg !48488
> call void @llvm.gcroot(i8** %0, i8* null), !dbg !48488
> br label %entry, !dbg !48488
>
> entry: ; preds = %prologue
> %ValueRef_new = call %"tart.core.ValueRef[char]"*
> @"tart.core.ValueRef[int32].type.alloc"(), !dbg !48488
> store %"tart.core.ValueRef[char]"* %ValueRef_new,
> %"tart.core.ValueRef[char]"** %gc_root, !dbg !48488
> %construct = call %tart.core.Hashable
> @"tart.core.ValueRef[int32].construct(int32)"(%"tart.core.ValueRef[char]"*
> %ValueRef_new, i32 %value), !dbg !48488
> store %"tart.core.ValueRef[char]"* null, %"tart.core.ValueRef[char]"**
> %gc_root, !dbg !48488
> %upcast = getelementptr inbounds %"tart.core.ValueRef[char]"*
> %ValueRef_new, i32 0, i32 0, i32 0, !dbg !48488
> ret %tart.core.Object* %upcast, !dbg !48488
> }
>
>
> As you can see, the only call to llvm.gcroot() is in fact in the first
> block.
>
> Now, here's the weird part: If I turn on optimization, the assertion
> failure no longer happens. What's the difference? Here's what the function
> looks like (I.Parent.Parent->dump()) with -O2:
>
> define internal %7*
> @"tart.reflect.Type[].iterate->tart.core.Iterator[tart.reflect.Type]"(%"tart.reflect.Type[]"*
> %self) nounwind gc "tart-gc" {
> prologue:
> %gc_root = alloca i8*, align 8
> store i8* null, i8** %gc_root
> call void @llvm.gcroot(i8** %gc_root, i8* null), !dbg !48487
> %new.i = call i8* @malloc(i64 32) nounwind, !dbg !48488
> %0 = bitcast i8* %new.i to %tart.core.TypeInfoBlock**
> store %tart.core.TypeInfoBlock* bitcast (%25*
> @"tart.reflect.Type[].ArrayIterator.type.tib" to %tart.core.TypeInfoBlock*),
> %tart.core.TypeInfoBlock** %0, align 8, !dbg !48488
> tail call void @llvm.dbg.declare(metadata !{null}, metadata !48489)
> %1 = getelementptr inbounds i8* %new.i, i64 16
> %2 = bitcast i8* %1 to %"tart.reflect.Type[]"**
> store %"tart.reflect.Type[]"* %self, %"tart.reflect.Type[]"** %2, align
> 8, !dbg !48490
> %3 = getelementptr inbounds i8* %new.i, i64 24
> %4 = bitcast i8* %3 to i64*
> store i64 0, i64* %4, align 8, !dbg !48491
> %intf_ptr = bitcast i8* %new.i to %7*
> ret %7* %intf_ptr, !dbg !48487
> }
>
> OK, I'm looking at the crash in the debugger, and it looks like the
> NodeType (getValue(Alloca).getNode().getOpcode()) is value 41. According to
> what the debugger is telling me, that value corresponse to
> llvm::ISD::CopyFromReg.
>
> When I debug the optimized version, the node value is 13
> (llvm::ISD::FrameIndex) which seems right.
>
> Does any of that make any sense?
>
> --
> -- Talin
>
--
-- Talin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101025/7de68797/attachment.html>
More information about the llvm-dev
mailing list