llvm оптимизируется с помощью библиотечных функций

Начиная с такого кода

void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
    while(n--)
    {
        *dest=c;
        dest++;
    }
}

использование llvm в качестве кросс-компилятора

clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi  -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls  lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls  lib_memset.bc -o lib_memset.s

и он обнаруживает и заменяет его реальным memset, когда используется оптимизатор

lib_memset:
    push    {r11, lr}
    mov r3, r1
    mov r11, sp
    cmp r2, #0
    beq .LBB0_2
    mov r1, r2
    mov r2, r3
    bl  __aeabi_memset
.LBB0_2:                                @ %while.end
    pop {r11, pc}

но реализует его без.

Я не хочу, чтобы он компилировал код, который я ему дал, для цели, которую я ему дал, а не использовал библиотечные вызовы. Я думал, что -disable-simplify-libcalls сделает это, но это не так.

Я думал, что понял это раньше, но не могу понять, как это сделать. Мне нужен оптимизатор, я не хочу этой круговой проблемы с зависимостями реализации библиотеки и необходимости библиотеки и т. д. Можно было бы сделать это на ассемблере, чтобы вывести компилятор из цикла, но не нужно.


person old_timer    schedule 23.01.2014    source источник
comment
-ffreestanding? та же проблема?   -  person artless noise    schedule 24.01.2014
comment
ДОХ! Требовался -disable-simplify-libcalls на шаге opt вместо или так же, как llc..., который это исправил.   -  person old_timer    schedule 24.01.2014


Ответы (2)


clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -ffreestanding -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi -disable-simplify-libcalls  lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi  lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi  lib_memset.bc -o lib_memset.s

благодаря бесхитростному шуму при добавлении -ffreestanding, я решил перечитать все параметры --help для llc и opt и обнаружил, что -disable-simpilfy-libcalls является вариантом как для opt, так и для llc, добавив его, чтобы opt исправил ошибку. проблема.

lib_memset:
    cmp r2, #0
    bxeq    lr
.LBB0_1:
    strb    r1, [r0], #1
    subs    r2, r2, #1
    bne .LBB0_1
    bx  lr

Мне не нравится отвечать на мой собственный вопрос, я могу немного посидеть здесь, чтобы в следующий раз найти ответ, или если ТАКИЕ боги решат оставить его здесь, это нормально...

person old_timer    schedule 24.01.2014
comment
Отвечая на свой вопрос, это нормально. Перед тем, как вы сможете принять его, есть двухдневная задержка, поэтому у всех остальных также есть шанс ответить. Вы обязательно должны оставить его здесь, на случай, если кто-то еще столкнется с той же проблемой в будущем. - person Lundin; 24.01.2014

Я сталкиваюсь с той же проблемой, и если это все еще может помочь кому-то, это то, что я сделал для ее решения - я изменил файл LoopIdiomRecognize.cpp в исходном коде llvm: есть код, который проверяет, является ли имя функции memset или memcpy это отменяет оптимизацию, поэтому я изменил его с:

StringRef Name = L->getHeader()->getParent()->getName();
  if (Name == "memset" || Name == "memcpy")

to

StringRef Name = L->getHeader()->getParent()->getName();
  if (Name.endswith("memset") || Name == "memcpy")
person yehudahs    schedule 01.12.2015