Описание тега llvm-codegen

Вопросы о том, как LLVM генерирует машинный код из LLVM-IR или языков высокого уровня. Если вас интересует конкретная архитектура ЦП, также добавьте соответствующий тег (например, `x86`).
1 ответ

LLVM opt mem2reg не имеет никакого эффекта

В настоящее время я играю с LLVM и пытаюсь написать несколько оптимизаторов, чтобы ознакомиться с opt и clang. Я написал файл test.c, который выглядит следующим образом: int foo(int aa, int bb, int cc){ int sum = aa + bb; return sum/cc; } Я скомпили…
0 ответов

Получить размер типа LLVM / типа разыменования

Этот вопрос очень похож на этот, но я не совсем уверен, как получить размер в следующей ситуации: У меня есть тип указателя, например i32*, Теперь я хотел бы получить размер типа "указывает на", так i32 (иначе 4). Сейчас я использую следующий код, к…
26 авг '19 в 10:09
1 ответ

Почему компилятор Rust не оптимизирует код, предполагая, что две изменяемые ссылки не могут иметь псевдоним?

Насколько я знаю, псевдонимы ссылок / указателей могут препятствовать способности компилятора генерировать оптимизированный код, поскольку они должны обеспечивать правильное поведение сгенерированного двоичного файла в случае, когда две ссылки / ука…
29 июл '19 в 20:57
4 ответа

Как работает 128-битное целое число Rust `i128` в 64-битной системе?

Rust имеет 128-битные целые числа, они обозначены типом данных i128 (а также u128 для неподписанных целых): let a: i128 = 170141183460469231731687303715884105727; Как Rust делает это i128 значения работают в 64-битной системе; например, как это дела…
03 авг '19 в 19:44
2 ответа

Почему при зацикливании массива с 240 или более элементами сильно сказывается производительность?

При запуске цикла суммы над массивом в Rust, я заметил огромное падение производительности, когда CAPACITY >= 240 CAPACITY = 239 примерно в 80 раз быстрее. Есть ли специальная оптимизация компиляции, которую Rust делает для "коротких" массивов? Сост…
12 авг '19 в 12:16
3 ответа

Почему LLVM выделяет избыточную переменную?

Вот простой файл C с определением перечисления и main функция: enum days {MON, TUE, WED, THU}; int main() { enum days d; d = WED; return 0; } Он переносится в следующий LLVM IR: define dso_local i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca …
06 янв '20 в 13:03
1 ответ

Почему кажется, что LLVM игнорирует внутреннее предположение Rust?

LLVM игнорирует core::intrinsics::assume(..)звонки. Они попадают в байт-код, но не меняют полученный машинный код. Например, возьмите следующий (бессмысленный) код: pub fn one(xs: &mut Vec<i32>) { if let Some(x) = xs.pop() { xs.push(x); } …
15 янв '20 в 15:04
1 ответ

LLVM-C создает объектный файл: "TargetMachine не может создать файл этого типа"

Попытка создать очень простой объектный файл с помощью LLVM-C. К сожалению, я все еще застрял на "TargetMachine не может создать файл этого типа", попытался переупорядочить код и различные вещи для CPU (x64-64, generic и LLVMGetHostCPUName()). Ясно,…
10 июн '20 в 22:45
1 ответ

Считается ли подписанное целочисленное переполнение в безопасном Rust в режиме выпуска неопределенным поведением?

Rust по-разному обрабатывает подписанное целочисленное переполнение в режиме отладки и выпуска. Когда это происходит, Rust паникует в режиме отладки, в то время как молча выполняет двойное дополнение в режиме выпуска. Насколько мне известно, C/C++ р…
15 фев '20 в 13:56
0 ответов

Что такое модели кода и как они влияют на генерацию кода?

В rustc есть 4 модели кода. Вы можете увидеть список, набравrustc --print code-models: Available code models: small kernel medium large Что они имеют в виду?
11 апр '20 в 07:41
1 ответ

Статическое планирование ООО процессоров

Планировщик инструкций LLVM MISched использует декларативные описания TableGen функциональных блоков процессора, конвейеров и задержек. Представьте, что вы пытаетесь определить эквивалент рекомендаций по кодированию из Справочного руководства Intel …
31 май '20 в 05:22
0 ответов

отключить использование cmov в clang

Из командной строки можно указать clang отключить использование некоторых функций, например -mno-mmx или -mno-popcnt. Однако покаcmov это функция, отслеживаемая llvm, нет -mno-cmov для процессоров x86 (хотя вы можете отключить условные перемещения д…
24 июл '20 в 22:43
1 ответ

Почему в этом коде на Rust нет штрафа за ошибку предсказания ветвления?

Я написал эту очень простую функцию на Rust: fn iterate(nums: &Box<[i32]>) -> i32 { let mut total = 0; let len = nums.len(); for i in 0..len { if nums[i] > 0 { total += nums[i]; } else { total -= nums[i]; } } total } Я написал базовы…
0 ответов

Ошибка при вызове прохода LLVM CodeGen с использованием clang: попытка создания TargetPassConfig без целевой машины

Я пытался вызвать свой проход функции LLVM вне дерева с помощью clang (opt не вариант. Отлично работает с opt btw): clang -std =c99 -m64 -c -o file.o -DSPEC -DNDEBUG -Ispec_qsort -DSPEC_AUTO_SUPPRESS_OPENMP -g -march=native -fno-unsafe-math-optimiza…
22 мар '20 в 01:27
0 ответов

LLVM создает исполняемый код из построителя C/C++

У меня есть пример кода llvm отсюда. В этом коде есть некоторые проблемы, которые я тоже исправил. На этом этапе все, что он делает, это сбрасывает переведенный ИК-код. Мне нужно создать исполняемый файл из моегоC++ код без звонка llvm-as/llc/clangв…
30 май '20 в 05:34
1 ответ

Почему clang выдает 32-битную инструкцию ps с плавающей запятой для абсолютного значения 64-битной двойной точности?

Почему лязг крутится fabs(double) в вместо (как это делает GCC)? Пример из обозревателя компилятора: #include <math.h> double float_abs(double x) { return fabs(x); } лязг 12.0.1 .LCPI0_0: .quad 0x7fffffffffffffff # double NaN .quad 0x7ffffffff…
08 сен '21 в 02:03
1 ответ

x86_64 неправильное соглашение о вызовах при вызове функции

Я относительно новичок в LLVM, и я пытаюсь создать LLVM IR, который вызывает функцию C ( growDictionary). Это на x86_64 Linux, используя llvm 12: $ llc-12 --version Ubuntu LLVM version 12.0.1 Optimized build. Default target: x86_64-pc-linux-gnu Host…
13 ноя '21 в 00:27
0 ответов

Создание объектного кода в памяти с помощью C API LLVM

Я использую LLVM-C API для проекта компилятора, и мне нужно передать объектный код из IR в буфер в памяти. Я знаю, что JIT может это сделать, но результирующий код будет выполняться много раз с разными аргументами, поэтому статическая компиляция оди…
13 фев '21 в 13:45
1 ответ

LLVM C-API Жизненные циклы основных объектов

Я начал играть с LLVM, создавая любимый язык. Я использую C-API. У меня есть синтаксический анализатор и базовый AST, но я немного затрудняюсь с LLVM. Ниже приведена уменьшенная версия моего кода, иллюстрирующая мою текущую проблему: #include <st…
08 янв '22 в 03:37
0 ответов

Выбор DAG из LLVM IR?

Я получил LLVM-IR через clang -S -emit-llvm demo.c гдеdemo.cкак следует int demo(int a, int b){ int c = a+b; return c; } ИК выглядит так define dso_local i32 @demo(i32 %0, i32 %1) #0 { %3 = alloca i32, align 4 %4 = alloca i32, align 4 %5 = alloca i3…
18 янв '23 в 07:46