@@ -835,6 +835,38 @@ static Value *emitFrexpBuiltin(CodeGenFunction &CGF, const CallExpr *E,
835835 return CGF.Builder.CreateExtractValue(Call, 0);
836836}
837837
838+ static void emitSincosBuiltin(CodeGenFunction &CGF, const CallExpr *E,
839+ llvm::Intrinsic::ID IntrinsicID) {
840+ llvm::Value *Val = CGF.EmitScalarExpr(E->getArg(0));
841+ llvm::Value *Dest0 = CGF.EmitScalarExpr(E->getArg(1));
842+ llvm::Value *Dest1 = CGF.EmitScalarExpr(E->getArg(2));
843+
844+ llvm::Function *F = CGF.CGM.getIntrinsic(IntrinsicID, {Val->getType()});
845+ llvm::Value *Call = CGF.Builder.CreateCall(F, Val);
846+
847+ llvm::Value *SinResult = CGF.Builder.CreateExtractValue(Call, 0);
848+ llvm::Value *CosResult = CGF.Builder.CreateExtractValue(Call, 1);
849+
850+ QualType DestPtrType = E->getArg(1)->getType()->getPointeeType();
851+ LValue SinLV = CGF.MakeNaturalAlignAddrLValue(Dest0, DestPtrType);
852+ LValue CosLV = CGF.MakeNaturalAlignAddrLValue(Dest1, DestPtrType);
853+
854+ llvm::StoreInst *StoreSin =
855+ CGF.Builder.CreateStore(SinResult, SinLV.getAddress());
856+ llvm::StoreInst *StoreCos =
857+ CGF.Builder.CreateStore(CosResult, CosLV.getAddress());
858+
859+ // Mark the two stores as non-aliasing with each other. The order of stores
860+ // emitted by this builtin is arbitrary, enforcing a particular order will
861+ // prevent optimizations later on.
862+ llvm::MDBuilder MDHelper(CGF.getLLVMContext());
863+ MDNode *Domain = MDHelper.createAnonymousAliasScopeDomain();
864+ MDNode *AliasScope = MDHelper.createAnonymousAliasScope(Domain);
865+ MDNode *AliasScopeList = MDNode::get(Call->getContext(), AliasScope);
866+ StoreSin->setMetadata(LLVMContext::MD_alias_scope, AliasScopeList);
867+ StoreCos->setMetadata(LLVMContext::MD_noalias, AliasScopeList);
868+ }
869+
838870/// EmitFAbs - Emit a call to @llvm.fabs().
839871static Value *EmitFAbs(CodeGenFunction &CGF, Value *V) {
840872 Function *F = CGF.CGM.getIntrinsic(Intrinsic::fabs, V->getType());
@@ -3232,6 +3264,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
32323264 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
32333265 *this, E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh));
32343266
3267+ case Builtin::BI__builtin_sincos:
3268+ case Builtin::BI__builtin_sincosf:
3269+ case Builtin::BI__builtin_sincosf16:
3270+ case Builtin::BI__builtin_sincosl:
3271+ case Builtin::BI__builtin_sincosf128:
3272+ emitSincosBuiltin(*this, E, Intrinsic::sincos);
3273+ return RValue::get(nullptr);
3274+
32353275 case Builtin::BIsqrt:
32363276 case Builtin::BIsqrtf:
32373277 case Builtin::BIsqrtl:
0 commit comments