оптимизация компилятора не учитывает `-pthreads` - PullRequest
0 голосов
/ 07 мая 2020

Я скомпилировал код:

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?

...