if688

Explorando Representações Intermediárias com LLVM IR

Objetivo

Compreender na prática o conceito de representação intermediária (IR) no processo de compilação, utilizando o LLVM IR para observar como um código em C é transformado em uma representação abstrata independente de máquina. Esta atividade permite também visualizar o uso de variáveis SSA, blocos básicos, instruções de controle e otimizações no nível de IR.

Material Esperado para Entrega

O aluno deve enviar os arquivos abaixo via Google Classroom (não envie um .zip, mas suba os arquivos separadamente):

Instruções

1. Preparação do Ambiente

Verifique se clang e opt estão instalados:

clang --version
opt --version

Se necessário, instale no Linux com:

sudo apt install clang llvm

Para outros SOs, vide https://llvm.org.

2. Código C e Geração de IR

#include <stdio.h>

int soma(int a, int b) {
    return a + b;
}

int multiplica(int x, int y) {
    return x * y;
}

int calcula(int valor) {
    if (valor > 10) {
        return multiplica(valor, 2);
    } else {
        return soma(valor, 5);
    }
}

int main() {
    int resultado = calcula(7);
    printf("Resultado: %d\n", resultado);
    return 0;
}
clang -S -emit-llvm operacoes.c -o operacoes.ll

Perguntas:

3. Modificação do Código

#include <stdio.h>

int soma(int a, int b) {
    return a + b;
}

int multiplica(int x, int y) {
    return x * y;
}

int divide(int x, int y) {
    if (y == 0) return 0;
    return x / y;
}

int calcula(int valor) {
    int temp = soma(valor, 3);
    if (temp % 2 == 0) {
        return multiplica(temp, 4);
    } else {
        return divide(temp, 2);
    }
}

int main() {
    int resultado = calcula(5);
    printf("Resultado: %d\n", resultado);
    return 0;
}
clang -S -emit-llvm operacoes_mod.c -o operacoes_mod.ll

Perguntas

4. Otimização com opt

opt -O2 operacoes.ll -S -o operacoes_opt.ll

Perguntas

5. Visualizando o Grafo de Fluxo de Controle (CFG)

Nesta etapa, você irá gerar uma representação gráfica do fluxo de controle da função calcula usando o opt com a opção -dot-cfg. Esse recurso gera arquivos .dot que podem ser visualizados.

opt -dot-cfg operacoes_mod.ll -disable-output

Perguntas

Recursos de Apoio