[CodeGen] Have a special function to get TBAA info for may-alias accesses

This is part of D37826 reworked to be a separate patch to
simplify review.

Differential Revision: https://reviews.llvm.org/D38408

llvm-svn: 314660
This commit is contained in:
Ivan A. Kosarev 2017-10-02 11:10:04 +00:00
parent 3ccd23e116
commit 5c8e7596e6
5 changed files with 23 additions and 8 deletions

View File

@ -1522,7 +1522,7 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile,
if (TBAAAccessType) {
bool MayAlias = BaseInfo.getMayAlias();
llvm::MDNode *TBAA = MayAlias
? CGM.getTBAATypeInfo(getContext().CharTy)
? CGM.getTBAAMayAliasTypeInfo()
: CGM.getTBAAStructTagInfo(TBAABaseType, TBAAAccessType, TBAAOffset);
if (TBAA)
CGM.DecorateInstructionWithTBAA(Load, TBAA, MayAlias);
@ -1613,7 +1613,7 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr,
if (TBAAAccessType) {
bool MayAlias = BaseInfo.getMayAlias();
llvm::MDNode *TBAA = MayAlias
? CGM.getTBAATypeInfo(getContext().CharTy)
? CGM.getTBAAMayAliasTypeInfo()
: CGM.getTBAAStructTagInfo(TBAABaseType, TBAAAccessType, TBAAOffset);
if (TBAA)
CGM.DecorateInstructionWithTBAA(Store, TBAA, MayAlias);
@ -3724,11 +3724,8 @@ LValue CodeGenFunction::EmitLValueForField(LValue base,
// Loading the reference will disable path-aware TBAA.
TBAAPath = false;
if (CGM.shouldUseTBAA()) {
llvm::MDNode *tbaa;
if (mayAlias)
tbaa = CGM.getTBAATypeInfo(getContext().CharTy);
else
tbaa = CGM.getTBAATypeInfo(type);
llvm::MDNode *tbaa = mayAlias ? CGM.getTBAAMayAliasTypeInfo() :
CGM.getTBAATypeInfo(type);
if (tbaa)
CGM.DecorateInstructionWithTBAA(load, tbaa);
}
@ -3780,7 +3777,7 @@ LValue CodeGenFunction::EmitLValueForField(LValue base,
// FIXME: this should get propagated down through anonymous structs
// and unions.
if (mayAlias && LV.getTBAAAccessType())
LV.setTBAAAccessType(CGM.getTBAATypeInfo(getContext().CharTy));
LV.setTBAAAccessType(CGM.getTBAAMayAliasTypeInfo());
return LV;
}

View File

@ -599,6 +599,12 @@ llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy,
return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O);
}
llvm::MDNode *CodeGenModule::getTBAAMayAliasTypeInfo() {
if (!TBAA)
return nullptr;
return TBAA->getMayAliasTypeInfo();
}
/// Decorate the instruction with a TBAA tag. For both scalar TBAA
/// and struct-path aware TBAA, the tag has the same format:
/// base type, access type and offset.

View File

@ -662,6 +662,10 @@ public:
llvm::MDNode *getTBAAStructTagInfo(QualType BaseTy, llvm::MDNode *AccessN,
uint64_t O);
/// getTBAAMayAliasTypeInfo - Get TBAA information that represents
/// may-alias accesses.
llvm::MDNode *getTBAAMayAliasTypeInfo();
bool isTypeConstant(QualType QTy, bool ExcludeCtorDtor);
bool isPaddedAtomicType(QualType type);

View File

@ -326,3 +326,7 @@ CodeGenTBAA::getTBAAScalarTagInfo(llvm::MDNode *AccessNode) {
return ScalarTagMetadataCache[AccessNode] =
MDHelper.createTBAAStructTagNode(AccessNode, AccessNode, 0);
}
llvm::MDNode *CodeGenTBAA::getMayAliasTypeInfo() {
return getChar();
}

View File

@ -116,6 +116,10 @@ public:
/// Get the scalar tag MDNode for a given scalar type.
llvm::MDNode *getTBAAScalarTagInfo(llvm::MDNode *AccessNode);
/// getMayAliasTypeInfo - Get TBAA information that represents may-alias
/// accesses.
llvm::MDNode *getMayAliasTypeInfo();
};
} // end namespace CodeGen