diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -7294,7 +7294,10 @@ Op = Builder.CreateBitCast(Op, OTy); if (OTy->getScalarType()->isFloatingPointTy()) { - Op = Builder.CreateFCmp(Fp, Op, Constant::getNullValue(OTy)); + if (Fp == CmpInst::FCMP_OEQ) + Op = Builder.CreateFCmp(Fp, Op, Constant::getNullValue(OTy)); + else + Op = Builder.CreateFCmpS(Fp, Op, Constant::getNullValue(OTy)); } else { Op = Builder.CreateICmp(Ip, Op, Constant::getNullValue(OTy)); } @@ -10299,7 +10302,10 @@ Ops.push_back(EmitScalarExpr(E->getArg(1))); Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy); Ops[1] = Builder.CreateBitCast(Ops[1], DoubleTy); - Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); + if (P == llvm::FCmpInst::FCMP_OEQ) + Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); + else + Ops[0] = Builder.CreateFCmpS(P, Ops[0], Ops[1]); return Builder.CreateSExt(Ops[0], Int64Ty, "vcmpd"); } case NEON::BI__builtin_neon_vceqs_f32: @@ -10319,7 +10325,10 @@ Ops.push_back(EmitScalarExpr(E->getArg(1))); Ops[0] = Builder.CreateBitCast(Ops[0], FloatTy); Ops[1] = Builder.CreateBitCast(Ops[1], FloatTy); - Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); + if (P == llvm::FCmpInst::FCMP_OEQ) + Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); + else + Ops[0] = Builder.CreateFCmpS(P, Ops[0], Ops[1]); return Builder.CreateSExt(Ops[0], Int32Ty, "vcmpd"); } case NEON::BI__builtin_neon_vceqh_f16: @@ -10339,7 +10348,10 @@ Ops.push_back(EmitScalarExpr(E->getArg(1))); Ops[0] = Builder.CreateBitCast(Ops[0], HalfTy); Ops[1] = Builder.CreateBitCast(Ops[1], HalfTy); - Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); + if (P == llvm::FCmpInst::FCMP_OEQ) + Ops[0] = Builder.CreateFCmp(P, Ops[0], Ops[1]); + else + Ops[0] = Builder.CreateFCmpS(P, Ops[0], Ops[1]); return Builder.CreateSExt(Ops[0], Int16Ty, "vcmpd"); } case NEON::BI__builtin_neon_vceqd_s64: diff --git a/clang/test/CodeGen/aarch64-neon-intrinsics-constrained.c b/clang/test/CodeGen/aarch64-neon-intrinsics-constrained.c --- a/clang/test/CodeGen/aarch64-neon-intrinsics-constrained.c +++ b/clang/test/CodeGen/aarch64-neon-intrinsics-constrained.c @@ -585,7 +585,7 @@ // COMMON-LABEL: test_vcges_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp oge float %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, s{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ge // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -596,7 +596,7 @@ // COMMON-LABEL: test_vcged_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp oge double %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oge", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oge", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, d{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ge // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i64 @@ -607,7 +607,7 @@ // COMMON-LABEL: test_vcgezs_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp oge float %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float 0.000000e+00, metadata !"oge", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float 0.000000e+00, metadata !"oge", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ge // COMMONIR: [[VCGEZ_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -618,7 +618,7 @@ // COMMON-LABEL: test_vcgezd_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp oge double %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double 0.000000e+00, metadata !"oge", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double 0.000000e+00, metadata !"oge", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ge // COMMONIR: [[VCGEZ_I:%.*]] = sext i1 [[TMP0]] to i64 @@ -629,7 +629,7 @@ // COMMON-LABEL: test_vcgts_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ogt float %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, s{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, gt // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -640,7 +640,7 @@ // COMMON-LABEL: test_vcgtd_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ogt double %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ogt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ogt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, d{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, gt // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i64 @@ -651,7 +651,7 @@ // COMMON-LABEL: test_vcgtzs_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ogt float %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float 0.000000e+00, metadata !"ogt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float 0.000000e+00, metadata !"ogt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, gt // COMMONIR: [[VCGTZ_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -662,7 +662,7 @@ // COMMON-LABEL: test_vcgtzd_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ogt double %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double 0.000000e+00, metadata !"ogt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double 0.000000e+00, metadata !"ogt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, gt // COMMONIR: [[VCGTZ_I:%.*]] = sext i1 [[TMP0]] to i64 @@ -673,7 +673,7 @@ // COMMON-LABEL: test_vcles_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ole float %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, s{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ls // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -684,7 +684,7 @@ // COMMON-LABEL: test_vcled_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ole double %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, d{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ls // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i64 @@ -695,7 +695,7 @@ // COMMON-LABEL: test_vclezs_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ole float %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ls // COMMONIR: [[VCLEZ_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -706,7 +706,7 @@ // COMMON-LABEL: test_vclezd_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp ole double %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, ls // COMMONIR: [[VCLEZ_I:%.*]] = sext i1 [[TMP0]] to i64 @@ -717,7 +717,7 @@ // COMMON-LABEL: test_vclts_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp olt float %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, s{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, mi // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -728,7 +728,7 @@ // COMMON-LABEL: test_vcltd_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp olt double %a, %b -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, d{{[0-9]+}} // CHECK-ASM-NEXT:cset {{w[0-9]+}}, mi // COMMONIR: [[VCMPD_I:%.*]] = sext i1 [[TMP0]] to i64 @@ -739,7 +739,7 @@ // COMMON-LABEL: test_vcltzs_f32 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp olt float %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float 0.000000e+00, metadata !"olt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float 0.000000e+00, metadata !"olt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp s{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, mi // COMMONIR: [[VCLTZ_I:%.*]] = sext i1 [[TMP0]] to i32 @@ -750,7 +750,7 @@ // COMMON-LABEL: test_vcltzd_f64 // UNCONSTRAINED: [[TMP0:%.*]] = fcmp olt double %a, 0.000000e+00 -// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double 0.000000e+00, metadata !"olt", metadata !"fpexcept.strict") +// CONSTRAINED: [[TMP0:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double 0.000000e+00, metadata !"olt", metadata !"fpexcept.strict") // CHECK-ASM: fcmp d{{[0-9]+}}, #0.0 // CHECK-ASM-NEXT:cset {{w[0-9]+}}, mi // COMMONIR: [[VCLTZ_I:%.*]] = sext i1 [[TMP0]] to i64