ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0));
Value *Real = ComplexVal.first;
Value *Imag = ComplexVal.second;
- Value *Zero =
- Imag->getType()->isFPOrFPVectorTy()
- ? llvm::ConstantFP::getZeroValueForNegation(Imag->getType())
- : llvm::Constant::getNullValue(Imag->getType());
-
- Imag = Builder.CreateFSub(Zero, Imag, "sub");
+ Imag = Builder.CreateFNeg(Imag, "neg");
return RValue::getComplex(std::make_pair(Real, Imag));
}
case Builtin::BI__builtin_creal:
--- /dev/null
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -w -S -o - -emit-llvm -fmath-errno %s | FileCheck %s
+
+float _Complex test__builtin_conjf(float _Complex x) {
+// CHECK-LABEL: @test__builtin_conjf(
+// CHECK: fneg float %x.imag
+ return __builtin_conjf(x);
+}
+
+double _Complex test__builtin_conj(double _Complex x) {
+// CHECK-LABEL: @test__builtin_conj(
+// CHECK: fneg double %x.imag
+ return __builtin_conj(x);
+}
+
+long double _Complex test__builtin_conjl(long double _Complex x) {
+// CHECK-LABEL: @test__builtin_conjl(
+// CHECK: fneg x86_fp80 %x.imag
+ return __builtin_conjl(x);
+}