2015-01-07 4 views
2

Я получаю следующее сообщение об ошибке при вставке инструкции с использованием LLVM проход: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! 

У меня есть исходный код в виде битового кода файла, который фрагмент является :

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) 

Я хочу, чтобы вставить новую команду после того, как "линии А", которая:

%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"); 
      } 
     } 
    } 
} 

ответ

4

Я не сталкивался с такой проблемой самолета, но я думаю, что ваша проблема, если заявление. %add относится к базовому блоку if.then BasicBlock и недоступен из блока if.end. Вот почему инструкция phi «выбирает», какое значение доступно %add или %sub. Поэтому вы должны принять %a.0 для своего IcmpInst в качестве аргумента не %add.

 Смежные вопросы

  • Нет связанных вопросов^_^