LLVM"指令不支配所有用途" - 插入新指令

时间:2015-01-07 10:28:06

标签: llvm instrumentation llvm-ir

使用llvm传递插入指令时出现以下错误:

Instruction does not dominate all uses!
%add = add nsw i32 10, 2
%cmp3 = icmp ne i32 %a.01, %add
Broken module found, compilation aborted!

我在bitcode文件中有源代码,其代码段为:

if.then:                                          ; preds = %entry
    %add = add nsw i32 10, 2
    br label %if.end
if.else:                                          ; preds = %entry
    %sub = sub nsw i32 10, 2
    br label %if.end
if.end:                                           ; preds = %if.else, %if.then
    %a.0 = phi i32 [ %add, %if.then ], [ %sub, %if.else ] 
    %a.01 = call i32 @tauInt32Ty(i32 %a.0)            ; line A
    %add3 = add nsw i32 %a.01, 2
    %add4 = add nsw i32 %a.01, 3
    %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str2, i32 0, i32 0), i32 %add3, i32 %add4)

我想在“A行”之后插入一条新指令:

%cmp3 = icmp ne i32 %a.01, %add

我编写了一个函数传递,其执行此任务的代码片段为:

for (Function::iterator bb = F.begin(), e = F.end(); bb != e; ++bb) {
    for (BasicBlock::iterator i = bb->begin(), e = bb->end(); i != e; ++i) {
        std::string str;
        if(isa<CallInst>(i))// || true) {
            BasicBlock::iterator next_it = i;
            next_it++;
            Instruction* next = dyn_cast<Instruction>(&*next_it);
            CallInst* ci = dyn_cast<CallInst>(&*i);
            Function* ff = ci->getCalledFunction();
            str = ff->getName();
            errs()<<"> "<<str<<"\n";
            if(!str.compare("tauInt32Ty")) { 
                hotPathSSA1::varVersionWithPathsSet::iterator start = tauArguments[&*ci].begin();
                hotPathSSA1::varVersionWithPathsSet::iterator end = tauArguments[&*ci].end();
                Value* specArgs = start->second;    // specArgs points to %add
                ICmpInst* int1_cmp_56 = new ICmpInst(next, ICmpInst::ICMP_NE, ci, specArgs, "cmp3");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

我没有遇到过喷射问题,但我认为你的问题是if语句。 %add属于if.then BasicBlock,并且无法从if.end块访问它。这就是phi指令“选择”哪个值可用%add%sub的原因。所以你必须把%a.0作为你的IcmpInst作为参数而不是%add