================ @@ -498,3 +498,137 @@ CodeGenTBAA::mergeTBAAInfoForMemoryTransfer(TBAAAccessInfo DestInfo, // access type regardless of their base types. return TBAAAccessInfo::getMayAliasInfo(); } + +// Determine the aliasing kind bit-converting from type Src to type Dst. +CodeGenTBAA::AliasingKind CodeGenTBAA::getAliasingKind(QualType &Dst, + QualType &Src) { + assert(!Src->isVoidType() && !Dst->isVoidType()); + if (TypeHasMayAlias(Src) || TypeHasMayAlias(Dst)) + return AK_Ok; + + Src = QualType{Src->getBaseElementTypeUnsafe(), 0}; + Dst = QualType{Dst->getBaseElementTypeUnsafe(), 0}; + + auto *SrcDecl = Src->getAsRecordDecl(); + auto *DstDecl = Dst->getAsRecordDecl(); + + const llvm::MDNode *AnyTBAA = getChar(); + const llvm::MDNode *SrcTBAA = nullptr; + const llvm::MDNode *DstTBAA = nullptr; + + if (!SrcDecl) { + SrcTBAA = getTypeInfo(Src); + if (!SrcTBAA || SrcTBAA == AnyTBAA) ---------------- Endilll wrote:
Does this check take into account all 3 types (`char`, `unsigned char`, `std::byte`) listed in [basic.lval#11.3](http://eel.is/c++draft/basic.lval#11.3)? Same goes for the similar `DstTBAA` check below. https://github.com/llvm/llvm-project/pull/74155 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits