Ich habe versucht, den simplify CFG Pass in LLVM laufen und einen unerreichbaren Basisblock löschen, nachdem meinen eigenen von laufenden IR verwandelt, aber ich halte den Fehler bekommen -simplifyCFG passiert in llvm
beim Löschen: i8 *% g
Gebrauch immer noch um steckt nach Def zerstört: store i8 0, i8 *% g
ich bin mir sehr wohl bewusst, was das bedeutet, aber nicht der ganze Zweck der "simplifyCFGPass" zum Löschen des nicht erreichbaren Bas ic Blöcke für uns? Warum muss es dann diesen Fehler werfen? Ich würde annehmen, dass es einfach in der Lage sein sollte, alle Nutzungs-Def-Abhängigkeiten zu verwalten und die Anweisungen in dem unerreichbaren Basisblock "continuation" unten zu löschen.
Es folgt der entsprechenden IR -
entry:
%a3 = alloca i32
store i32 %a, i32* %a3
%a4 = load i32, i32* %a3
%ifcond = icmp ne i32 %a4, 0
br i1 %ifcond, label %then, label %else
then: ; preds = %entry
%gclone1 = alloca i32
store i32 0, i32* %gclone1
ret i5 0
else: ; preds = %entry
%gclone4 = alloca i64
store i64 0, i64* %gclone4
ret i5 0
continuation: ; No predecessors!
%iftmp = phi i32 [ 32, %then ], [ 64, %else ], !range !0
%datasize = alloca i32
store i32 %iftmp, i32* %datasize
%g = alloca i8 ---------------------> Issue
store i8 0, i8* %g ---------------------> Issue
ret i5 0
}
Kann jemand bitte erklären, warum dieser Fehler auftaucht? Soll die API das nicht handhaben?
Tritt dieser Fehler auf, wenn Sie Ihre Umwandlung ausführen oder wenn Sie simplifyCFGPass ausführen? – deLta
Ich führe den CFG Pass (mit FPM-> run (* F)) ... mein Pass ist einfach einige C++ - Code, der die IR ändert, ich benutze es nicht in der Opt-Tool oder so etwas ... – mal