Я пытаюсь выяснить, могут ли временные ИК LLVM использоваться вне цикла, в котором они были определены . Для этого я скомпилировал следующий простой код C:
while (*s == 'a')
{
c = *s++;
}
*s = c;
и, как я и подозревал, окончательная запись вне цикла (* s = c) выполнена
с другим временным (%tmp5
), чем тот, который читается внутри цикла (%tmp4
)
while.body: ; preds = %while.cond
%tmp3 = load i8*, i8** %s.addr, align 8
%incdec.ptr = getelementptr inbounds i8, i8* %tmp3, i32 1
store i8* %incdec.ptr, i8** %s.addr, align 8
%tmp4 = load i8, i8* %tmp3, align 1
store i8 %tmp4, i8* %c, align 1
br label %while.cond
while.end: ; preds = %while.cond
%tmp5 = load i8, i8* %c, align 1
%tmp6 = load i8*, i8** %s.addr, align 8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; store i8 %tmp4, i8* %tmp6, align 1 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
store i8 %tmp5, i8* %tmp6, align 1
Когда я редактирую файл * .ll и вручную заменяю %tmp5
на %tmp4
,
тогда llvm-as
несчастен:
$ llvm-as modified.ll
Instruction does not dominate all uses!
%tmp4 = load i8, i8* %tmp3, align 1
store i8 %tmp4, i8* %tmp6, align 1
Есть ли пример, где временное значение будет определено
внутри цикла и используется вне его ? Спасибо!