2017-12-02 20 views
0

最近、llvm 4.0にアップグレードされましたが、今は最も良質なコードであると思われる最適なエラーから異常です。私は以下のエラーを示すようなコードを特定しました.llvmが<badref>に関連するアサーションからのプリントアウトを示していますが、<badref>というコードは表示されません。これは、コンパイラエラーまたは生成されたコードが間違っている可能性があると私に思い出させます。llvm irの最適化 "Defが破棄された後もまだまだ使用されています"エラー関数の削除

; ModuleID = '__form__module.$static.196' 
source_filename = "__form__module.$static.196" 
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" 

%struct.clousure_type = type { void()*, %struct.closure_vtable*, i8* } 
%struct.closure_vtable = type { %struct.type_info*, void (i8*, i8*)*, void (i8*)*, i8 (i8*, i8*)*, i64 (i8*, i8*)* } 
%struct.type_info = type { i8*, i8*, i64, i8, i8, i8, i8, %struct.type_info**, %struct.member_info* } 
%struct.member_info = type { i8, %struct.type_info* } 

@"$static.159$stub_ptr" = external hidden externally_initialized global void (%struct.clousure_type*, %struct.clousure_type*)* 

define hidden void @"$static.196"(%struct.clousure_type*, %struct.clousure_type*, %struct.clousure_type*, i8) { 
entry: 
    %4 = icmp eq i8 %3, 0 
    br i1 %4, label %bb2, label %bb4 

bb2:            ; preds = %entry 
    %5 = icmp eq %struct.clousure_type* %0, %2 
    br i1 %5, label %bb3, label %bb6 

bb3:            ; preds = %bb4, %bb2 
    ret void 

bb4:            ; preds = %entry 
    %6 = icmp eq %struct.clousure_type* %1, %2 
    br i1 %6, label %bb3, label %bb6 

bb6:            ; preds = %bb4, %bb2 
    tail call void @"$static.159"(%struct.clousure_type* %0, %struct.clousure_type* %1) 
    ret void 
} 

; Function Attrs: alwaysinline 
define available_externally hidden void @"$static.159"(%struct.clousure_type*, %struct.clousure_type*) #0 { 
entry: 
    %2 = load void (%struct.clousure_type*, %struct.clousure_type*)*, void (%struct.clousure_type*, %struct.clousure_type*)** @"$static.159$stub_ptr", align 8 
    tail call void %2(%struct.clousure_type* %0, %struct.clousure_type* %1) 
    ret void 
} 

attributes #0 = { alwaysinline } 


While deleting: void (%struct.clousure_type*, %struct.clousure_type*)* %$static.159 
Use still stuck around after Def is destroyed: call void @"$static.159"(%struct.clousure_type* <badref>, %struct.clousure_type* %0) 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 
Assertion failed! 

Program: C:\Users\RICH\workspace\formvm\Debug\formvm.exe 
File: C:\llvm-4.0.0.src\lib\IR\Value.cpp, Line 85 

Expression: use_empty() && "Uses remain when a value is destroyed!" 

上記の2つの機能を表すオプティマイザが取り組んでいるLLVMのIRコードは、(C++から生成された)次の2つの機能です。

define private void @gen__fun__return_copy85(%struct.clousure_type*, %struct.clousure_type*, %struct.clousure_type*, i8) { 
entry: 
    %4 = alloca %struct.clousure_type*, align 8 
    store %struct.clousure_type* %0, %struct.clousure_type** %4, align 8 
    %5 = load %struct.clousure_type*, %struct.clousure_type** %4, align 8 
    %6 = alloca %struct.clousure_type*, align 8 
    store %struct.clousure_type* %1, %struct.clousure_type** %6, align 8 
    %7 = load %struct.clousure_type*, %struct.clousure_type** %6, align 8 
    %8 = alloca %struct.clousure_type*, align 8 
    store %struct.clousure_type* %2, %struct.clousure_type** %8, align 8 
    %9 = load %struct.clousure_type*, %struct.clousure_type** %8, align 8 
    %10 = alloca i8, align 8 
    store i8 %3, i8* %10, align 8 
    %11 = load i8, i8* %10, align 8 
    %12 = icmp eq i8 %11, 0 
    br i1 %12, label %bb2, label %bb4 

bb2:            ; preds = %entry 
    %13 = icmp eq %struct.clousure_type* %5, %9 
    br i1 %13, label %bb3, label %bb6 

bb3:            ; preds = %bb2 
    ret void 

bb4:            ; preds = %entry 
    %14 = icmp eq %struct.clousure_type* %7, %9 
    br i1 %14, label %bb5, label %bb6 

bb5:            ; preds = %bb4 
    ret void 

bb6:            ; preds = %bb4, %bb2 
    call void @_ZN13clousure_typeC2ERKS_(%struct.clousure_type* %5, %struct.clousure_type* %7) 
    ret void 
} 

define private void @_ZN13clousure_typeC2ERKS_(%struct.clousure_type* %this, %struct.clousure_type* %rhs) { 
    %1 = alloca %struct.clousure_type*, align 8 
    %2 = alloca %struct.clousure_type*, align 8 
    store %struct.clousure_type* %this, %struct.clousure_type** %1, align 8 
    store %struct.clousure_type* %rhs, %struct.clousure_type** %2, align 8 
    %3 = load %struct.clousure_type*, %struct.clousure_type** %1, align 8 
    %4 = getelementptr %struct.clousure_type, %struct.clousure_type* %3, i32 0, i32 0 
    store void()* null, void()** %4, align 8 
    %5 = getelementptr %struct.clousure_type, %struct.clousure_type* %3, i32 0, i32 1 
    store %struct.closure_vtable* null, %struct.closure_vtable** %5, align 8 
    %6 = getelementptr %struct.clousure_type, %struct.clousure_type* %3, i32 0, i32 2 
    store i8* null, i8** %6, align 8 
    %7 = load %struct.clousure_type*, %struct.clousure_type** %2, align 8 
    call void @_ZN13clousure_type4copyERKS_(%struct.clousure_type* %3, %struct.clousure_type* %7) 
    ret void 
} 

以下のパスが追加されました。追加するものを変更する必要がありますか?問題の原因になっている可能性があります。

すべてのパスを削除しても編集できますが、まだエラーが発生します。

現時点では、問題が次の関数に由来すると思われます。@"$static.159"この関数はload @"$static.159$stub_ptr"を試していません。その理論は、自分自身をロードしようとしているときにそれを取り除くことができないということですか?

; Function Attrs: alwaysinline 
define available_externally hidden void @"$static.159"(%struct.clousure_type*, %struct.clousure_type*) #0 { 
entry: 
    %2 = load void (%struct.clousure_type*, %struct.clousure_type*)*, void (%struct.clousure_type*, %struct.clousure_type*)** @"$static.159$stub_ptr" 
    tail call void %2(%struct.clousure_type* %0, %struct.clousure_type* %1) 
    ret void 
} 

答えて

0

最終的にこのエラーを処理するには、llvm 5.0にアップグレードしました。

理論化された問題ではありませんでした。単に私が関数ポインタに格納していた関数の1つに入れて、上記の<badref>につながる上記のコードを生成したC++コードのポインタが正しく初期化されていないため、allocaは作成されませんでした。 <badref>は、後でオプティマイザが関数ポインタを使用するためにしか見つからなかったことに注意してください。

なぜこのポインターがセグメンテーションを引き起こさなかったのか分かりませんが、誤ったコード生成が可能です。 llvm 5.0では、ポインタがsegfaultを期待通りに与え、エラーを見つけることができます。

関連する問題