[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:
parent
3ccd23e116
commit
5c8e7596e6
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -326,3 +326,7 @@ CodeGenTBAA::getTBAAScalarTagInfo(llvm::MDNode *AccessNode) {
|
|||
return ScalarTagMetadataCache[AccessNode] =
|
||||
MDHelper.createTBAAStructTagNode(AccessNode, AccessNode, 0);
|
||||
}
|
||||
|
||||
llvm::MDNode *CodeGenTBAA::getMayAliasTypeInfo() {
|
||||
return getChar();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue