Предполагая, что вы знаете о внутренностях
llvm.lifetime.start / llvm.lifetime.end
и его использование в качестве памяти использует маркер для MemoryDependenceAnalysis.
О выборе указателя (адреса переменной) в качестве i8 было сделано, чтобы сделать его более универсальным в качестве области памяти с байтовой адресацией с первыми аргументами в качестве числа байтов, такого же, как мы используем в malloc.
Таким образом, чтобы сгенерировать внутренний вызов, нам нужен адрес байта в памяти и количество байтов, равное sizeof (T). вот почему нам нужно конвертировать i32 * в i8 *.
кстати, подпись, если в ваших примерах используются встроенные функции времени жизни
объявить void @ llvm.lifetime.start (i64, i8 * nocapture)
объявить void @ llvm.lifetime.end (i64, i8 * nocapture)
Для получения дополнительной информации пройдите Lang ref .