2014-02-19 5 views
1

Я следующий ИК:заменяя использование одного опра с другим опром в LLVM IR

%2 = load i32* %b, align 4 
store i32 %2, i32* %a, align 4 
%3 = load i32* %a, align 4 
store i32 %3, i32* %b, align 4 

, который является по существу

a=b; b=a; 

Теперь, после распространения копий, я хочу что-то вроде:

a=b; b=b; 

Итак, я делаю это:

i->setOperand(0,op1) //op1 points to %b, i points to [%3 = load i32* %a, align 4] 
i->replaceUsesOfWith(op2,op1); //op2 points to %a 

Выполняя это, я получаю бесконечный цикл для выше IR. Поэтому у меня возникает ощущение, что есть некоторые проблемы с удалением i из использования op1 и добавлением i к использованию op2. Однако код работает отлично что-то вроде:

a=b; c=a; 

после трансформации я получаю: a=b; c=b;

+0

Я не знаю, почему она висит, но я уверен, что ваш код не делает то, что вы думаете. В частности, 'i-> setOperand (0, op1)' и 'i-> replaceUsesOfWith (op2, op1)' делают то же самое в этом контексте, поэтому нет смысла звонить им обоим. – Oak

+0

yup, я удалил setOperand() и тот же результат. Но, как я могу удалить инструкцию i из использования op2 после того, как я заменил op2 на op1 в i. (я также пытался ReplaceInstWithInst, но тот же бесконечный цикл) – rahuL

ответ

1

ReplaceInstWithInst() делает работу, проблема была, когда op1 и op2 обе точки в одном операнде он держать замена и идет в бесконечный цикл. Так что просто нужно было добавить одну опцию op1! = Op2

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