Hi, guys!<div><br></div><div>I write a virtual machine which uses LLVM as back-end code generator. The following function code causes strange "UNREACHABLE executed!" error:</div><div><br></div><div><div>define void @p1(%1*) {</div>
<div>  %2 = call i8* @llvm.stacksave()</div><div>  %3 = alloca %0</div><div>  %4 = getelementptr %0* %3, i64 1</div><div>  %5 = ptrtoint %0* %3 to i64</div><div>  %6 = ptrtoint %0* %4 to i64</div><div>  %7 = sub i64 %6, %5</div>
<div>  %8 = bitcast %0* %3 to i8*</div><div>  call void @llvm.memset.p0i8.i64(i8* %8, i8 0, i64 %7, i32 0, i1 false)</div><div>  %9 = bitcast %1* %0 to [8 x i8]*</div><div>  %10 = bitcast %0* %3 to [8 x i8]*</div><div>  %11 = load [8 x i8]* %9</div>
<div>  store [8 x i8] %11, [8 x i8]* %10</div><div>  %12 = call i8* @llvm.stacksave()</div><div>  %13 = alloca %0</div><div>  %14 = getelementptr %0* %13, i64 1</div><div>  %15 = ptrtoint %0* %13 to i64</div><div>  %16 = ptrtoint %0* %14 to i64</div>
<div>  %17 = sub i64 %16, %15</div><div>  %18 = bitcast %0* %13 to i8*</div><div>  call void @llvm.memset.p0i8.i64(i8* %18, i8 0, i64 %17, i32 0, i1 false)</div><div>  %19 = getelementptr %1* %0, i64 0, i32 0, i32 8</div>
<div>  %20 = bitcast i8* %19 to [8 x i8]*</div><div>  %21 = bitcast %0* %13 to [8 x i8]*</div><div>  %22 = load [8 x i8]* %20</div><div>  store [8 x i8] %22, [8 x i8]* %21</div><div>  %23 = bitcast %0* %13 to i64*</div><div>
  %24 = bitcast %0* %3 to i64*</div><div>  %25 = load i64* %23</div><div>  %26 = load i64* %24</div><div>  %27 = icmp sgt i64 %25, %26</div><div>  br i1 %27, label %29, label %28</div><div><br></div><div>; <label>:28                                      ; preds = %1</div>
<div>  ret void</div><div><br></div><div>; <label>:29                                      ; preds = %1</div><div>  %30 = call i8* @llvm.stacksave()</div><div>  %31 = alloca %0*</div><div>  store %0* zeroinitializer, %0** %31</div>
<div>  %32 = getelementptr %1* %0, i64 0, i32 0, i32 0</div><div>  %33 = bitcast i8* %32 to %0**</div><div>  %34 = load %0** %33</div><div>  %35 = ptrtoint %0* %34 to i64</div><div>  %36 = icmp ne i64 %35, 0</div><div>  br i1 %36, label %37, label %42</div>
<div><br></div><div>; <label>:37                                      ; preds = %29</div><div>  %38 = bitcast %0* %34 to i64*</div><div>  %39 = getelementptr i64* %38, i32 -1</div><div>  %40 = load i64* %39</div><div>
  %41 = add i64 %40, 1</div><div>  store i64 %41, i64* %39</div><div>  br label %42</div><div><br></div><div>; <label>:42                                      ; preds = %37, %29</div><div>  %43 = load %0** %31</div>
<div>  %44 = ptrtoint %0* %43 to i64</div><div>  %45 = icmp ne i64 %44, 0</div><div>  br i1 %45, label %46, label %52</div><div><br></div><div>; <label>:46                                      ; preds = %42</div><div>
  %47 = bitcast %0* %43 to i64*</div><div>  %48 = getelementptr i64* %47, i32 -1</div><div>  %49 = load i64* %48</div><div>  %50 = sub i64 %49, 1</div><div>  store i64 %50, i64* %48</div><div>  %51 = icmp ne i64 %50, 0</div>
<div>  br i1 %51, label %70, label %52</div><div><br></div><div>; <label>:52                                      ; preds = %70, %46, %42</div><div>  store %0* %34, %0** %31</div><div>  %53 = call i8* @llvm.stacksave()</div>
<div>  %54 = alloca %1</div><div>  %55 = getelementptr %1* %54, i64 1</div><div>  %56 = ptrtoint %1* %54 to i64</div><div>  %57 = ptrtoint %1* %55 to i64</div><div>  %58 = sub i64 %57, %56</div><div>  %59 = bitcast %1* %54 to i8*</div>
<div>  call void @llvm.memset.p0i8.i64(i8* %59, i8 0, i64 %58, i32 0, i1 false)</div><div>  %60 = bitcast %0* %3 to [8 x i8]*</div><div>  %61 = bitcast %1* %54 to [8 x i8]*</div><div>  %62 = load [8 x i8]* %60</div><div>  store [8 x i8] %62, [8 x i8]* %61</div>
<div>  %63 = bitcast %0* %13 to [8 x i8]*</div><div>  %64 = getelementptr %1* %54, i64 0, i32 0, i32 8</div><div>  %65 = bitcast i8* %64 to [8 x i8]*</div><div>  %66 = load [8 x i8]* %63</div><div>  store [8 x i8] %66, [8 x i8]* %65</div>
<div>  %67 = load %0** %31</div><div>  %68 = ptrtoint %0* %67 to i64</div><div>  %69 = icmp ne i64 %68, 0</div><div>  br i1 %69, label %72, label %77</div><div><br></div><div>; <label>:70                                      ; preds = %46</div>
<div>  %71 = bitcast %0* %43 to i8*</div><div>  call void @destroy(i8* inttoptr (i64 161025200 to i8*), i8* inttoptr (i64 161028240 to i8*), i8* %71)</div><div>  br label %52</div><div><br></div><div>; <label>:72                                      ; preds = %52</div>
<div>  %73 = bitcast %0* %67 to i64*</div><div>  %74 = getelementptr i64* %73, i32 -1</div><div>  %75 = load i64* %74</div><div>  %76 = add i64 %75, 1</div><div>  store i64 %76, i64* %74</div><div>  br label %77</div><div>
<br></div><div>; <label>:77                                      ; preds = %72, %52</div><div>  %78 = getelementptr %1* %54, i64 0, i32 0, i32 0</div><div>  %79 = bitcast i8* %78 to %0**</div><div>  %80 = load %0** %79</div>
<div>  %81 = ptrtoint %0* %80 to i64</div><div>  %82 = icmp ne i64 %81, 0</div><div>  br i1 %82, label %83, label %89</div><div><br></div><div>; <label>:83                                      ; preds = %77</div><div>
  %84 = bitcast %0* %80 to i64*</div><div>  %85 = getelementptr i64* %84, i32 -1</div><div>  %86 = load i64* %85</div><div>  %87 = sub i64 %86, 1</div><div>  store i64 %87, i64* %85</div><div>  %88 = icmp ne i64 %87, 0</div>
<div>  br i1 %88, label %109, label %89</div><div><br></div><div>; <label>:89                                      ; preds = %109, %83, %77</div><div>  store %0* %67, %0** %79</div><div>  call void @p0(%1* %54)</div>
<div>  %90 = bitcast %1* %54 to [8 x i8]*</div><div>  %91 = bitcast %0* %13 to [8 x i8]*</div><div>  %92 = load [8 x i8]* %90</div><div>  store [8 x i8] %92, [8 x i8]* %91</div><div>  %93 = bitcast %1* %54 to i64*</div><div>
  %94 = load i64* %93</div><div>  %95 = add i64 %94, 1</div><div>  store i64 %95, i64* %93</div><div>  call void @p1(%1* %54)</div><div>  %96 = bitcast %0* %3 to [8 x i8]*</div><div>  %97 = bitcast %1* %54 to [8 x i8]*</div>
<div>  %98 = load [8 x i8]* %96</div><div>  store [8 x i8] %98, [8 x i8]* %97</div><div>  %99 = bitcast %0* %13 to i64*</div><div>  %100 = load i64* %99</div><div>  %101 = sub i64 %100, 1</div><div>  store i64 %101, i64* %99</div>
<div>  %102 = bitcast %0* %13 to [8 x i8]*</div><div>  %103 = getelementptr %1* %54, i64 0, i32 0, i32 8</div><div>  %104 = bitcast i8* %103 to [8 x i8]*</div><div>  %105 = load [8 x i8]* %102</div><div>  store [8 x i8] %105, [8 x i8]* %104</div>
<div>  call void @p1(%1* %54)</div><div>  call void @llvm.stackrestore(i8* %53)</div><div>  %106 = load %0** %31</div><div>  %107 = ptrtoint %0* %106 to i64</div><div>  %108 = icmp ne i64 %107, 0</div><div>  br i1 %108, label %111, label %117</div>
<div><br></div><div>; <label>:109                                     ; preds = %83</div><div>  %110 = bitcast %0* %80 to i8*</div><div>  call void @destroy(i8* inttoptr (i64 161025200 to i8*), i8* inttoptr (i64 160883800 to i8*), i8* %110)</div>
<div>  br label %89</div><div><br></div><div>; <label>:111                                     ; preds = %89</div><div>  %112 = bitcast %0* %106 to i64*</div><div>  %113 = getelementptr i64* %112, i32 -1</div><div>  %114 = load i64* %113</div>
<div>  %115 = sub i64 %114, 1</div><div>  store i64 %115, i64* %113</div><div>  %116 = icmp ne i64 %115, 0</div><div>  br i1 %116, label %118, label %117</div><div><br></div><div>; <label>:117                                     ; preds = %118, %111, %89</div>
<div>  call void @llvm.stackrestore(i8* %30)</div><div>  call void @llvm.stackrestore(i8* %12)</div><div>  call void @llvm.stackrestore(i8* %2)</div><div>  ret void</div><div><br></div><div>; <label>:118                                     ; preds = %111</div>
<div>  %119 = bitcast %0* %106 to i8*</div><div>  call void @destroy(i8* inttoptr (i64 161025200 to i8*), i8* inttoptr (i64 161028240 to i8*), i8* %119)</div><div>  br label %117</div><div>}</div><div><br></div><div>UNREACHABLE executed!</div>
<div>Stack dump:</div><div>0.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@p1'</div><div>Aborted</div></div><div><br></div><div>I know this code is bulky and complicated, but can you just suggest me possible causes of such error? Thanks.</div>