Как llvm ir справляется с короткими замыканиями различного типа? - PullRequest
0 голосов
/ 16 июня 2020

Для следующего кода в C:

void test(int a, int b, int c){
   if(a > 1 && (b == 2 || c == 3))
      b = a + c;
   else
      c = a + b;
   return;
}

CFG выглядит следующим образом:

enter image description here

Но когда Я меняю if в строке 2 на while:

void test(int a, int b, int c){
   while(a > 1 && (b == 2 || c == 3))
      b = a + c;
   c = a + b;
   return;
}

Затем CFG изменяется на:

enter image description here

Итак, c генерируются блоки lor.end и land.end, но они не соответствуют ни одному оператору в программе. Почему while.cond не подключается к while.end напрямую, как entry -> if.else в первом CFG? Другими словами, почему генерируются lor.end и land.end? Кажется, что способ обработки коротких замыканий в операторах if отличается от такового в операторах l oop. Что вызывает эту разницу?

сценарий компиляции (calng / llvm 7.0.1): clang -emit-llvm - c -g -fno-discard-value-names имя_файла. c

...