Ваши блоки A
и B
не являются базовыми блоками, они просто блоки. C (или любой другой язык) не имеет понятия базовых блоков - LLVM делает.
Базовые блоки в LLVM не должны (и часто не) соответствуют блокам на исходном языке. По сути, базовый блок - это просто блок кода, такой, что вы никогда не прыгаете в или из середины его. Вы прыгаете только в начало блока и прыгаете только с его конца.
Блоки в исходных языках могут служить многим целям. Иногда они используются как часть операторов потока управления, а иногда нет. И иногда вы можете иметь контроль потока без блоков. Например, во многих языках циклы и операторы if
могут использоваться с одним телом оператора, который не является составным оператором (например, if (condition) return;
- здесь нет блока, но все еще поток управления). Точно так же switch
операторы обычно не имеют блока для каждого случая, и, конечно, есть goto
.
Таким образом, при наличии потока управления без блоков сгенерированная программа будет содержать больше базовых блоков, чем блоки с исходной программой. И в противоположном случае, когда есть блоки без потока управления, сгенерированная программа будет содержать меньше базовых блоков.
В вашем примере функция fun
не содержит никакого потока управления, кроме неявного возврата в конце функции. Поэтому вы должны генерировать только один базовый блок для него.