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>