代码之家  ›  专栏  ›  技术社区  ›  Ta Thanh Dinh

强制clang生成内部cos

  •  1
  • Ta Thanh Dinh  · 技术社区  · 7 年前

    编撰 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 回复  |  直到 7 年前
        1
  •  2
  •   Peter Cordes    7 年前

    -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 on 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
    }
    
    推荐文章