2017-06-16 143 views
0

我试图运行简化CFG通行证在LLVM和运行我自己的IR变换一个删除后不可到达的基本块,但我不断收到 错误 -simplifyCFG传递LLVM

虽然删除: 8-18 *%G

使用还停留各地的防守被破坏后:商店I8 0,6-18 *%G

我很清楚的是什么意思,但不是的全部目的“简化CFGPass”删除无法访问的bas ic块为我们?为什么一定要抛出这个错误?我假设它应该能够管理所有use-def依赖关系,并删除下面无法访问的“continuation”基本块中的说明。

以下是相关的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 
} 

能有人请解释为什么这个错误影响了? API是否应该处理这个问题?

+0

当您运行转换或当您运行simplifyCFGPass是否会出现这个错误? – deLta

+0

我运行CFG通行证(使用FPM->运行(* F)) ......我的传球简直就是一些C++代码,改变了IR,我不使用它在可选工具或类似的东西... – mal

回答

0

您的IR显然已损坏。你具有:

%iftmp =披I32 [32,然后%],[64,%别的],范围0

然而,每LLVM IR规范(http://llvm.org/docs/LangRef.html#phi-instruction)!:

传入值的类型用第一个类型 字段指定。在此之后,'phi'指令将对的列表作为 自变量,其中一对用于当前块的每个前驱基本块。只有第一类类型的值可以用作PHI节点的值参数 。只有标签可以用作标签 参数。

这很明显违反了你的情况,因此后续的IR转换过程可能很容易失败。我建议您在转换通过后运行IR验证通行证(例如,通过opt -verify)。

+0

没有。我想我已经在“在运行我自己的IR转换之一后删除无法访问的基本块”这个问题中明确提到过了。 披节点不破(和验证通未检测到问题) – mal

+0

披节点肯定是坏。 %else和%都不是%延续的前辈 –