Заставить лязг генерировать внутреннюю стоимость - PullRequest
0 голосов
/ 05 декабря 2018

Компиляция cos.c

void func() {
    double a = __builtin_cos(3.0);
}

с использованием

clang -S -emit-llvm -c cos.c

У меня есть

define dso_local void @func() {
  %1 = alloca double, align 8
  %2 = call double @cos(double 3.000000e+00)
  store double %2, double* %1, align 8
  ret void
}


declare dso_local double @cos(double)

Но я хочу получить встроенные функции llvm @llvm.fcos.f64для cos вместо @cos, то есть сгенерированный код должен быть таким

  ...
  %2 = call double @llvm.fcos.f64(double 3.000000e+00)
  ...
}

declare double @llvm.cos.f64(double)

Как я могу заставить clang сделать это?Может быть, я должен использовать другую функцию вместо __builtin_cos?

1 Ответ

0 голосов
/ 06 декабря 2018

С -ffast-math (что подразумевает -fno-math-errno) , лязг -O3 будет встроен __builtin_cos до @llvm.cos.f64

double func(double in) {
    double a = __builtin_cos(in);
    return a;
}

clang -O3 -ffast-math -emit-llvm вклGodbolt (со снятыми отладочными материалами)

define dso_local double @_Z4funcd(double) local_unnamed_addr #0 !dbg !7 {
  %2 = tail call fast double @llvm.cos.f64(double %0), !dbg !15
  ret double %2, !dbg !17
}
...