[llvm-dev] Assertion failed: "Node emitted out of order - late"

Boris Boesler via llvm-dev llvm-dev at lists.llvm.org
Thu Dec 10 07:26:37 PST 2015


> I get the error 'Assertion failed: (I != VRBaseMap.end() && "Node emitted out of order - late")' in a simple test function. LLVM dis-assembly looks like this:

[full disassembly and original code at the end]

> After scheduling there is a CopyToReg node and a llvm.lifetime.start node, both have a TargetFrameIndex<0> as operand (it is a TargetFrameIndex from the very first pass - but I expected a FrameIndex). I guess this is %a. The instruction emitter tries to get the virtual register number from the CopyToReg's operand, the TargetFrameIndex. But there is no virtual register number for TargetFrameIndex and that raises the assertion.
> Well, I have lots of [Target]FrameIndex operations in other test code, but probably no arrays, and that works as expected.
> 
> I do not touch the llvm.lifetime.X intrinsics. I can leave them, right?
> What did I miss to do? Why is there no virtual register for that TargetFrameIndex?

I worked on that a little bit more: the TargetFrameIndex is only used by CopToReg and llvm.lifetime.start; it seems that these operations do not trigger the generation of virtual registers? If I add some access/write to that array a[0]=0; in the entry block, then the generation of the virtual register is triggered.

I compared "my" IR graphs to the IR graphs generated by the ARM backend: the ARM backend generates an extra "ADD #0" and gets a virtual register number.

I'm really stuck and need some help.
Boris

--8<--

void bug_no190 (int* result, int *sptr, int end_index)
{
  int a[16];
  int *cptr = a;
  int v = *sptr++;

  //a[0] = 0; // this avoids the crash
  for(int i = 1; i < 3; i++) {
    if(v != 0) {
      *cptr++ = 0;
    }
    v = *sptr++;
  }
}

--8<--

; Function Attrs: nounwind
define void @bug_no190(i32* nocapture readnone %result, i32* nocapture readonly %sptr, i32 %end_index) #0 {
entry:
  %a = alloca [16 x i32], align 8
  %0 = bitcast [16 x i32]* %a to i8*
  call void @llvm.lifetime.start(i64 64, i8* %0) #1
  %arraydecay = getelementptr inbounds [16 x i32]* %a, i16 0, i16 0
  %sptr.addr.010 = getelementptr inbounds i32* %sptr, i16 1
  %v.0 = load i32* %sptr, align 8
  %cmp1 = icmp eq i32 %v.0, 0
  br i1 %cmp1, label %if.end, label %if.then

if.then:                                          ; preds = %entry
  %incdec.ptr2 = getelementptr inbounds [16 x i32]* %a, i16 0, i16 1
  store i32 0, i32* %arraydecay, align 8, !tbaa !1
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
  %cptr.1 = phi i32* [ %incdec.ptr2, %if.then ], [ %arraydecay, %entry ]
  %v.0.1 = load i32* %sptr.addr.010, align 8
  %cmp1.1 = icmp eq i32 %v.0.1, 0
  br i1 %cmp1.1, label %if.end.1, label %if.then.1

if.then.1:                                        ; preds = %if.end
  store i32 0, i32* %cptr.1, align 8, !tbaa !1
  br label %if.end.1

if.end.1:                                         ; preds = %if.then.1, %if.end
  call void @llvm.lifetime.end(i64 64, i8* %0) #1
  ret void
}

; Function Attrs: nounwind
declare void @llvm.lifetime.start(i64, i8* nocapture) #1

; Function Attrs: nounwind
declare void @llvm.lifetime.end(i64, i8* nocapture) #1

attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }

!llvm.ident = !{!0}

!0 = metadata !{metadata !"clang version 3.4.2 (tags/RELEASE_34/dot2-final)"}
!1 = metadata !{metadata !2, metadata !2, i64 0}
!2 = metadata !{metadata !"int", metadata !3, i64 0}
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
!4 = metadata !{metadata !"Simple C/C++ TBAA"}



More information about the llvm-dev mailing list