Я следующий ИК:заменяя использование одного опра с другим опром в 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;
Я не знаю, почему она висит, но я уверен, что ваш код не делает то, что вы думаете. В частности, 'i-> setOperand (0, op1)' и 'i-> replaceUsesOfWith (op2, op1)' делают то же самое в этом контексте, поэтому нет смысла звонить им обоим. – Oak
yup, я удалил setOperand() и тот же результат. Но, как я могу удалить инструкцию i из использования op2 после того, как я заменил op2 на op1 в i. (я также пытался ReplaceInstWithInst, но тот же бесконечный цикл) – rahuL