Я скомпилировал код:
extern int x;
int main(int argc, char **argv)
{
while (x != 1) {}
return 0;
}
с
$ clang -c -O3 -pthread -emit-llvm main.c
$ llvm-dis main.bc
И когда я изучил полученный битовый код, я был удивлен, увидев следующую оптимизацию:
- от
while (x != 1) {}
до if (x != 1) while (1);
Вот соответствующие строки файла битового кода:
$ sed -n '10,16p;17q' main.ll
entry:
%.pr = load i32, i32* @x, align 4, !tbaa !2
%cmp = icmp eq i32 %.pr, 1
br i1 %cmp, label %while.end.split, label %while.cond
while.cond: ; preds = %entry, %while.cond
br label %while.cond
Что делать, если какой-то другой поток изменился x
?