@@ -707,7 +707,38 @@ static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD,
707707 const CallExpr *E, llvm::Constant *calleeValue) {
708708 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E);
709709 CGCallee callee = CGCallee::forDirect(calleeValue, GlobalDecl(FD));
710- return CGF.EmitCall(E->getCallee()->getType(), callee, E, ReturnValueSlot());
710+ RValue Call =
711+ CGF.EmitCall(E->getCallee()->getType(), callee, E, ReturnValueSlot());
712+
713+ // Check the supported intrinsic.
714+ if (unsigned BuiltinID = FD->getBuiltinID()) {
715+ auto IntrinsicID = [&]() -> unsigned {
716+ switch (BuiltinID) {
717+ case Builtin::BIexpf:
718+ case Builtin::BI__builtin_expf:
719+ case Builtin::BI__builtin_expf128:
720+ return true;
721+ }
722+ // TODO: support more FP math libcalls
723+ return false;
724+ }();
725+
726+ if (IntrinsicID) {
727+ llvm::MDBuilder MDHelper(CGF.getLLVMContext());
728+ MDNode *RootMD;
729+ if (CGF.getLangOpts().CPlusPlus)
730+ RootMD = MDHelper.createTBAARoot("Simple C++ TBAA");
731+ else
732+ RootMD = MDHelper.createTBAARoot("Simple C/C++ TBAA");
733+ // Emit "int" TBAA metadata on FP math libcalls.
734+ MDNode *AliasType = MDHelper.createTBAANode("int", RootMD);
735+ MDNode *MDInt = MDHelper.createTBAAStructTagNode(AliasType, AliasType, 0);
736+
737+ Value *Val = Call.getScalarVal();
738+ cast<llvm::Instruction>(Val)->setMetadata(LLVMContext::MD_tbaa, MDInt);
739+ }
740+ }
741+ return Call;
711742}
712743
713744/// Emit a call to llvm.{sadd,uadd,ssub,usub,smul,umul}.with.overflow.*
0 commit comments