[LLVMdev] [LLVMDev]: UNREACHABLE executed!

Semion Prihodko semion.ababo at gmail.com
Wed Nov 2 03:25:23 PDT 2011


Hi, guys!

I write a virtual machine which uses LLVM as back-end code generator. The
following function code causes strange "UNREACHABLE executed!" error:

define void @p1(%1*) {
  %2 = call i8* @llvm.stacksave()
  %3 = alloca %0
  %4 = getelementptr %0* %3, i64 1
  %5 = ptrtoint %0* %3 to i64
  %6 = ptrtoint %0* %4 to i64
  %7 = sub i64 %6, %5
  %8 = bitcast %0* %3 to i8*
  call void @llvm.memset.p0i8.i64(i8* %8, i8 0, i64 %7, i32 0, i1 false)
  %9 = bitcast %1* %0 to [8 x i8]*
  %10 = bitcast %0* %3 to [8 x i8]*
  %11 = load [8 x i8]* %9
  store [8 x i8] %11, [8 x i8]* %10
  %12 = call i8* @llvm.stacksave()
  %13 = alloca %0
  %14 = getelementptr %0* %13, i64 1
  %15 = ptrtoint %0* %13 to i64
  %16 = ptrtoint %0* %14 to i64
  %17 = sub i64 %16, %15
  %18 = bitcast %0* %13 to i8*
  call void @llvm.memset.p0i8.i64(i8* %18, i8 0, i64 %17, i32 0, i1 false)
  %19 = getelementptr %1* %0, i64 0, i32 0, i32 8
  %20 = bitcast i8* %19 to [8 x i8]*
  %21 = bitcast %0* %13 to [8 x i8]*
  %22 = load [8 x i8]* %20
  store [8 x i8] %22, [8 x i8]* %21
  %23 = bitcast %0* %13 to i64*
  %24 = bitcast %0* %3 to i64*
  %25 = load i64* %23
  %26 = load i64* %24
  %27 = icmp sgt i64 %25, %26
  br i1 %27, label %29, label %28

; <label>:28                                      ; preds = %1
  ret void

; <label>:29                                      ; preds = %1
  %30 = call i8* @llvm.stacksave()
  %31 = alloca %0*
  store %0* zeroinitializer, %0** %31
  %32 = getelementptr %1* %0, i64 0, i32 0, i32 0
  %33 = bitcast i8* %32 to %0**
  %34 = load %0** %33
  %35 = ptrtoint %0* %34 to i64
  %36 = icmp ne i64 %35, 0
  br i1 %36, label %37, label %42

; <label>:37                                      ; preds = %29
  %38 = bitcast %0* %34 to i64*
  %39 = getelementptr i64* %38, i32 -1
  %40 = load i64* %39
  %41 = add i64 %40, 1
  store i64 %41, i64* %39
  br label %42

; <label>:42                                      ; preds = %37, %29
  %43 = load %0** %31
  %44 = ptrtoint %0* %43 to i64
  %45 = icmp ne i64 %44, 0
  br i1 %45, label %46, label %52

; <label>:46                                      ; preds = %42
  %47 = bitcast %0* %43 to i64*
  %48 = getelementptr i64* %47, i32 -1
  %49 = load i64* %48
  %50 = sub i64 %49, 1
  store i64 %50, i64* %48
  %51 = icmp ne i64 %50, 0
  br i1 %51, label %70, label %52

; <label>:52                                      ; preds = %70, %46, %42
  store %0* %34, %0** %31
  %53 = call i8* @llvm.stacksave()
  %54 = alloca %1
  %55 = getelementptr %1* %54, i64 1
  %56 = ptrtoint %1* %54 to i64
  %57 = ptrtoint %1* %55 to i64
  %58 = sub i64 %57, %56
  %59 = bitcast %1* %54 to i8*
  call void @llvm.memset.p0i8.i64(i8* %59, i8 0, i64 %58, i32 0, i1 false)
  %60 = bitcast %0* %3 to [8 x i8]*
  %61 = bitcast %1* %54 to [8 x i8]*
  %62 = load [8 x i8]* %60
  store [8 x i8] %62, [8 x i8]* %61
  %63 = bitcast %0* %13 to [8 x i8]*
  %64 = getelementptr %1* %54, i64 0, i32 0, i32 8
  %65 = bitcast i8* %64 to [8 x i8]*
  %66 = load [8 x i8]* %63
  store [8 x i8] %66, [8 x i8]* %65
  %67 = load %0** %31
  %68 = ptrtoint %0* %67 to i64
  %69 = icmp ne i64 %68, 0
  br i1 %69, label %72, label %77

; <label>:70                                      ; preds = %46
  %71 = bitcast %0* %43 to i8*
  call void @destroy(i8* inttoptr (i64 161025200 to i8*), i8* inttoptr (i64
161028240 to i8*), i8* %71)
  br label %52

; <label>:72                                      ; preds = %52
  %73 = bitcast %0* %67 to i64*
  %74 = getelementptr i64* %73, i32 -1
  %75 = load i64* %74
  %76 = add i64 %75, 1
  store i64 %76, i64* %74
  br label %77

; <label>:77                                      ; preds = %72, %52
  %78 = getelementptr %1* %54, i64 0, i32 0, i32 0
  %79 = bitcast i8* %78 to %0**
  %80 = load %0** %79
  %81 = ptrtoint %0* %80 to i64
  %82 = icmp ne i64 %81, 0
  br i1 %82, label %83, label %89

; <label>:83                                      ; preds = %77
  %84 = bitcast %0* %80 to i64*
  %85 = getelementptr i64* %84, i32 -1
  %86 = load i64* %85
  %87 = sub i64 %86, 1
  store i64 %87, i64* %85
  %88 = icmp ne i64 %87, 0
  br i1 %88, label %109, label %89

; <label>:89                                      ; preds = %109, %83, %77
  store %0* %67, %0** %79
  call void @p0(%1* %54)
  %90 = bitcast %1* %54 to [8 x i8]*
  %91 = bitcast %0* %13 to [8 x i8]*
  %92 = load [8 x i8]* %90
  store [8 x i8] %92, [8 x i8]* %91
  %93 = bitcast %1* %54 to i64*
  %94 = load i64* %93
  %95 = add i64 %94, 1
  store i64 %95, i64* %93
  call void @p1(%1* %54)
  %96 = bitcast %0* %3 to [8 x i8]*
  %97 = bitcast %1* %54 to [8 x i8]*
  %98 = load [8 x i8]* %96
  store [8 x i8] %98, [8 x i8]* %97
  %99 = bitcast %0* %13 to i64*
  %100 = load i64* %99
  %101 = sub i64 %100, 1
  store i64 %101, i64* %99
  %102 = bitcast %0* %13 to [8 x i8]*
  %103 = getelementptr %1* %54, i64 0, i32 0, i32 8
  %104 = bitcast i8* %103 to [8 x i8]*
  %105 = load [8 x i8]* %102
  store [8 x i8] %105, [8 x i8]* %104
  call void @p1(%1* %54)
  call void @llvm.stackrestore(i8* %53)
  %106 = load %0** %31
  %107 = ptrtoint %0* %106 to i64
  %108 = icmp ne i64 %107, 0
  br i1 %108, label %111, label %117

; <label>:109                                     ; preds = %83
  %110 = bitcast %0* %80 to i8*
  call void @destroy(i8* inttoptr (i64 161025200 to i8*), i8* inttoptr (i64
160883800 to i8*), i8* %110)
  br label %89

; <label>:111                                     ; preds = %89
  %112 = bitcast %0* %106 to i64*
  %113 = getelementptr i64* %112, i32 -1
  %114 = load i64* %113
  %115 = sub i64 %114, 1
  store i64 %115, i64* %113
  %116 = icmp ne i64 %115, 0
  br i1 %116, label %118, label %117

; <label>:117                                     ; preds = %118, %111, %89
  call void @llvm.stackrestore(i8* %30)
  call void @llvm.stackrestore(i8* %12)
  call void @llvm.stackrestore(i8* %2)
  ret void

; <label>:118                                     ; preds = %111
  %119 = bitcast %0* %106 to i8*
  call void @destroy(i8* inttoptr (i64 161025200 to i8*), i8* inttoptr (i64
161028240 to i8*), i8* %119)
  br label %117
}

UNREACHABLE executed!
Stack dump:
0.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@p1'
Aborted

I know this code is bulky and complicated, but can you just suggest me
possible causes of such error? Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111102/721ecd95/attachment.html>


More information about the llvm-dev mailing list