Hi Ivan, This change caused a compiler crash in one of our tests. I have put the details in PR34992, can you take a look?
Douglas Yung > -----Original Message----- > From: cfe-commits [mailto:cfe-commits-boun...@lists.llvm.org] On Behalf Of > Ivan A. Kosarev via cfe-commits > Sent: Tuesday, October 17, 2017 2:12 > To: cfe-commits@lists.llvm.org > Subject: r315984 - [CodeGen] EmitPointerWithAlignment() to generate TBAA info > along with LValue base info > > Author: kosarev > Date: Tue Oct 17 02:12:13 2017 > New Revision: 315984 > > URL: http://llvm.org/viewvc/llvm-project?rev=315984&view=rev > Log: > [CodeGen] EmitPointerWithAlignment() to generate TBAA info along with LValue > base info > > Differential Revision: https://reviews.llvm.org/D38796 > > Added: > cfe/trunk/test/CodeGen/tbaa-cast.cpp > Modified: > cfe/trunk/lib/CodeGen/CGExpr.cpp > cfe/trunk/lib/CodeGen/CodeGenFunction.cpp > cfe/trunk/lib/CodeGen/CodeGenFunction.h > cfe/trunk/lib/CodeGen/CodeGenModule.cpp > cfe/trunk/lib/CodeGen/CodeGenModule.h > cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp > cfe/trunk/lib/CodeGen/CodeGenTBAA.h > > Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp > URL: http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=315984&r1=315983&r2=315984&view=d > iff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Oct 17 02:12:13 2017 > @@ -916,7 +916,8 @@ void CodeGenModule::EmitExplicitCastExpr > /// EmitPointerWithAlignment - Given an expression of pointer type, try to > /// derive a more accurate bound on the alignment of the pointer. > Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E, > - LValueBaseInfo *BaseInfo) { > + LValueBaseInfo *BaseInfo, > + TBAAAccessInfo > + *TBAAInfo) { > // We allow this with ObjC object pointers because of fragile ABIs. > assert(E->getType()->isPointerType() || > E->getType()->isObjCObjectPointerType()); > @@ -936,20 +937,30 @@ Address CodeGenFunction::EmitPointerWith > if (PtrTy->getPointeeType()->isVoidType()) > break; > > - LValueBaseInfo InnerInfo; > - Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), > &InnerInfo); > - if (BaseInfo) *BaseInfo = InnerInfo; > - > - // If this is an explicit bitcast, and the source l-value is > - // opaque, honor the alignment of the casted-to type. > - if (isa<ExplicitCastExpr>(CE) && > - InnerInfo.getAlignmentSource() != AlignmentSource::Decl) { > - LValueBaseInfo ExpInfo; > + LValueBaseInfo InnerBaseInfo; > + TBAAAccessInfo InnerTBAAInfo; > + Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), > + &InnerBaseInfo, > + &InnerTBAAInfo); > + if (BaseInfo) *BaseInfo = InnerBaseInfo; > + if (TBAAInfo) *TBAAInfo = InnerTBAAInfo; > + > + if (isa<ExplicitCastExpr>(CE)) { > + LValueBaseInfo TargetTypeBaseInfo; > + TBAAAccessInfo TargetTypeTBAAInfo; > CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(), > - &ExpInfo); > - if (BaseInfo) > - BaseInfo->mergeForCast(ExpInfo); > - Addr = Address(Addr.getPointer(), Align); > + > &TargetTypeBaseInfo, > + > &TargetTypeTBAAInfo); > + if (TBAAInfo) > + *TBAAInfo = CGM.mergeTBAAInfoForCast(*TBAAInfo, > + TargetTypeTBAAInfo); > + // If the source l-value is opaque, honor the alignment of the > + // casted-to type. > + if (InnerBaseInfo.getAlignmentSource() != AlignmentSource::Decl) { > + if (BaseInfo) > + BaseInfo->mergeForCast(TargetTypeBaseInfo); > + Addr = Address(Addr.getPointer(), Align); > + } > } > > if (SanOpts.has(SanitizerKind::CFIUnrelatedCast) && @@ -969,12 > +980,13 @@ Address CodeGenFunction::EmitPointerWith > > // Array-to-pointer decay. > case CK_ArrayToPointerDecay: > - return EmitArrayToPointerDecay(CE->getSubExpr(), BaseInfo); > + return EmitArrayToPointerDecay(CE->getSubExpr(), BaseInfo, > + TBAAInfo); > > // Derived-to-base conversions. > case CK_UncheckedDerivedToBase: > case CK_DerivedToBase: { > - Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), BaseInfo); > + Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), BaseInfo, > + TBAAInfo); > auto Derived = CE->getSubExpr()->getType()->getPointeeCXXRecordDecl(); > return GetAddressOfBaseClass(Addr, Derived, > CE->path_begin(), CE->path_end(), @@ - > 994,6 +1006,7 @@ Address CodeGenFunction::EmitPointerWith > if (UO->getOpcode() == UO_AddrOf) { > LValue LV = EmitLValue(UO->getSubExpr()); > if (BaseInfo) *BaseInfo = LV.getBaseInfo(); > + if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo(); > return LV.getAddress(); > } > } > @@ -1001,7 +1014,8 @@ Address CodeGenFunction::EmitPointerWith > // TODO: conditional operators, comma. > > // Otherwise, use the alignment of the type. > - CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(), BaseInfo); > + CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(), BaseInfo, > + TBAAInfo); > return Address(EmitScalarExpr(E), Align); } > > @@ -2447,8 +2461,10 @@ LValue CodeGenFunction::EmitUnaryOpLValu > assert(!T.isNull() && "CodeGenFunction::EmitUnaryOpLValue: Illegal > type"); > > LValueBaseInfo BaseInfo; > - Address Addr = EmitPointerWithAlignment(E->getSubExpr(), &BaseInfo); > - LValue LV = MakeAddrLValue(Addr, T, BaseInfo, CGM.getTBAAAccessInfo(T)); > + TBAAAccessInfo TBAAInfo; > + Address Addr = EmitPointerWithAlignment(E->getSubExpr(), &BaseInfo, > + &TBAAInfo); > + LValue LV = MakeAddrLValue(Addr, T, BaseInfo, TBAAInfo); > LV.getQuals().setAddressSpace(ExprTy.getAddressSpace()); > > // We should not generate __weak write barrier on indirect reference @@ - > 3048,7 +3064,8 @@ llvm::CallInst *CodeGenFunction::EmitTra } > > Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E, > - LValueBaseInfo *BaseInfo) { > + LValueBaseInfo *BaseInfo, > + TBAAAccessInfo > + *TBAAInfo) { > assert(E->getType()->isArrayType() && > "Array to pointer decay must have array source type!"); > > @@ -3056,6 +3073,7 @@ Address CodeGenFunction::EmitArrayToPoin > LValue LV = EmitLValue(E); > Address Addr = LV.getAddress(); > if (BaseInfo) *BaseInfo = LV.getBaseInfo(); > + if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo(); > > // If the array type was an incomplete type, we need to make sure > // the decay ends up being the right type. > @@ -3216,13 +3234,14 @@ LValue CodeGenFunction::EmitArraySubscri > } > > LValueBaseInfo BaseInfo; > + TBAAAccessInfo TBAAInfo; > Address Addr = Address::invalid(); > if (const VariableArrayType *vla = > getContext().getAsVariableArrayType(E->getType())) { > // The base must be a pointer, which is not an aggregate. Emit > // it. It needs to be emitted first in case it's what captures > // the VLA bounds. > - Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo); > + Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, > + &TBAAInfo); > auto *Idx = EmitIdxAfterBase(/*Promote*/true); > > // The element count here is the total number of non-VLA elements. > @@ -3246,7 +3265,7 @@ LValue CodeGenFunction::EmitArraySubscri > // Indexing over an interface, as in "NSString *P; P[4];" > > // Emit the base pointer. > - Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo); > + Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, > + &TBAAInfo); > auto *Idx = EmitIdxAfterBase(/*Promote*/true); > > CharUnits InterfaceSize = getContext().getTypeSizeInChars(OIT); > @@ -3294,19 +3313,17 @@ LValue CodeGenFunction::EmitArraySubscri > E->getType(), !getLangOpts().isSignedOverflowDefined(), > SignedIndices, > E->getExprLoc()); > BaseInfo = ArrayLV.getBaseInfo(); > + TBAAInfo = CGM.getTBAAAccessInfo(E->getType()); > } else { > // The base must be a pointer; emit it with an estimate of its alignment. > - Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo); > + Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, > + &TBAAInfo); > auto *Idx = EmitIdxAfterBase(/*Promote*/true); > Addr = emitArraySubscriptGEP(*this, Addr, Idx, E->getType(), > !getLangOpts().isSignedOverflowDefined(), > SignedIndices, E->getExprLoc()); > } > > - LValue LV = MakeAddrLValue(Addr, E->getType(), BaseInfo, > - CGM.getTBAAAccessInfo(E->getType())); > - > - // TODO: Preserve/extend path TBAA metadata? > + LValue LV = MakeAddrLValue(Addr, E->getType(), BaseInfo, TBAAInfo); > > if (getLangOpts().ObjC1 && > getLangOpts().getGC() != LangOptions::NonGC) { @@ -3321,8 +3338,6 @@ > static Address emitOMPArraySectionBase(C > TBAAAccessInfo &TBAAInfo, > QualType BaseTy, QualType ElTy, > bool IsLowerBound) { > - TBAAInfo = CGF.CGM.getTBAAAccessInfo(ElTy); > - > LValue BaseLVal; > if (auto *ASE = dyn_cast<OMPArraySectionExpr>(Base->IgnoreParenImpCasts())) > { > BaseLVal = CGF.EmitOMPArraySectionExpr(ASE, IsLowerBound); @@ -3352,7 > +3367,7 @@ static Address emitOMPArraySectionBase(C > BaseInfo.mergeForCast(TypeInfo); > return Address(CGF.Builder.CreateLoad(BaseLVal.getAddress()), Align); > } > - return CGF.EmitPointerWithAlignment(Base, &BaseInfo); > + return CGF.EmitPointerWithAlignment(Base, &BaseInfo, &TBAAInfo); > } > > LValue CodeGenFunction::EmitOMPArraySectionExpr(const OMPArraySectionExpr *E, > @@ -3518,10 +3533,10 @@ EmitExtVectorElementExpr(const ExtVector > // If it is a pointer to a vector, emit the address and form an lvalue > with > // it. > LValueBaseInfo BaseInfo; > - Address Ptr = EmitPointerWithAlignment(E->getBase(), &BaseInfo); > + TBAAAccessInfo TBAAInfo; > + Address Ptr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, > + &TBAAInfo); > const PointerType *PT = E->getBase()->getType()->getAs<PointerType>(); > - Base = MakeAddrLValue(Ptr, PT->getPointeeType(), BaseInfo, > - CGM.getTBAAAccessInfo(PT->getPointeeType())); > + Base = MakeAddrLValue(Ptr, PT->getPointeeType(), BaseInfo, > + TBAAInfo); > Base.getQuals().removeObjCGCAttr(); > } else if (E->getBase()->isGLValue()) { > // Otherwise, if the base is an lvalue ( as in the case of foo.x.x), @@ - > 3577,7 +3592,8 @@ LValue CodeGenFunction::EmitMemberExpr(c > LValue BaseLV; > if (E->isArrow()) { > LValueBaseInfo BaseInfo; > - Address Addr = EmitPointerWithAlignment(BaseExpr, &BaseInfo); > + TBAAAccessInfo TBAAInfo; > + Address Addr = EmitPointerWithAlignment(BaseExpr, &BaseInfo, > + &TBAAInfo); > QualType PtrTy = BaseExpr->getType()->getPointeeType(); > SanitizerSet SkippedChecks; > bool IsBaseCXXThis = IsWrappedCXXThis(BaseExpr); @@ -3587,8 +3603,7 @@ > LValue CodeGenFunction::EmitMemberExpr(c > SkippedChecks.set(SanitizerKind::Null, true); > EmitTypeCheck(TCK_MemberAccess, E->getExprLoc(), Addr.getPointer(), > PtrTy, > /*Alignment=*/CharUnits::Zero(), SkippedChecks); > - BaseLV = MakeAddrLValue(Addr, PtrTy, BaseInfo, > - CGM.getTBAAAccessInfo(PtrTy)); > + BaseLV = MakeAddrLValue(Addr, PtrTy, BaseInfo, TBAAInfo); > } else > BaseLV = EmitCheckedLValue(BaseExpr, TCK_MemberAccess); > > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp > URL: http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=315984&r1=315983&r2=3159 > 84&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Tue Oct 17 02:12:13 2017 > @@ -118,9 +118,9 @@ CodeGenFunction::~CodeGenFunction() { } > > CharUnits CodeGenFunction::getNaturalPointeeTypeAlignment(QualType T, > - LValueBaseInfo *BaseInfo) > { > - return getNaturalTypeAlignment(T->getPointeeType(), BaseInfo, > - /* TBAAInfo= */ nullptr, > + LValueBaseInfo *BaseInfo, > + TBAAAccessInfo > + *TBAAInfo) { return getNaturalTypeAlignment(T->getPointeeType(), > + BaseInfo, TBAAInfo, > /* forPointeeType= */ true); } > > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h > URL: http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=315984&r1=315983&r2=315984 > &view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Tue Oct 17 02:12:13 2017 > @@ -1949,7 +1949,8 @@ public: > TBAAAccessInfo *TBAAInfo = nullptr, > bool forPointeeType = false); > CharUnits getNaturalPointeeTypeAlignment(QualType T, > - LValueBaseInfo *BaseInfo = > nullptr); > + LValueBaseInfo *BaseInfo = > nullptr, > + TBAAAccessInfo *TBAAInfo = > + nullptr); > > Address EmitLoadOfReference(Address Ref, const ReferenceType *RefTy, > LValueBaseInfo *BaseInfo = nullptr, @@ -3198,7 > +3199,8 @@ public: > RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation > Loc); > > Address EmitArrayToPointerDecay(const Expr *Array, > - LValueBaseInfo *BaseInfo = nullptr); > + LValueBaseInfo *BaseInfo = nullptr, > + TBAAAccessInfo *TBAAInfo = nullptr); > > class ConstantEmission { > llvm::PointerIntPair<llvm::Constant*, 1, bool> ValueAndIsReference; @@ - > 3920,7 +3922,8 @@ public: > /// reasonable to just ignore the returned alignment when it isn't from an > /// explicit source. > Address EmitPointerWithAlignment(const Expr *Addr, > - LValueBaseInfo *BaseInfo = nullptr); > + LValueBaseInfo *BaseInfo = nullptr, > + TBAAAccessInfo *TBAAInfo = nullptr); > > void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK); > > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp > URL: http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=315984&r1=315983&r2=315984 > &view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Oct 17 02:12:13 2017 > @@ -612,6 +612,13 @@ TBAAAccessInfo CodeGenModule::getTBAAMay > return TBAA->getMayAliasAccessInfo(); } > > +TBAAAccessInfo CodeGenModule::mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, > + TBAAAccessInfo > +TargetInfo) { > + if (!TBAA) > + return TBAAAccessInfo(); > + return TBAA->mergeTBAAInfoForCast(SourceInfo, TargetInfo); } > + > void CodeGenModule::DecorateInstructionWithTBAA(llvm::Instruction *Inst, > TBAAAccessInfo TBAAInfo) { > if (llvm::MDNode *Tag = getTBAAAccessTagInfo(TBAAInfo)) > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h > URL: http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=315984&r1=315983&r2=315984&v > iew=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Tue Oct 17 02:12:13 2017 > @@ -677,6 +677,11 @@ public: > /// may-alias accesses. > TBAAAccessInfo getTBAAMayAliasAccessInfo(); > > + /// mergeTBAAInfoForCast - Get merged TBAA information for the > + purposes of /// type casts. > + TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, > + TBAAAccessInfo TargetInfo); > + > bool isTypeConstant(QualType QTy, bool ExcludeCtorDtor); > > bool isPaddedAtomicType(QualType type); > > Modified: cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp > URL: http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp?rev=315984&r1=315983&r2=315984&v > iew=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp Tue Oct 17 02:12:13 2017 > @@ -309,3 +309,11 @@ llvm::MDNode *CodeGenTBAA::getAccessTagI TBAAAccessInfo > CodeGenTBAA::getMayAliasAccessInfo() { > return TBAAAccessInfo(getChar()); > } > + > +TBAAAccessInfo CodeGenTBAA::mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, > + TBAAAccessInfo > +TargetInfo) { > + TBAAAccessInfo MayAliasInfo = getMayAliasAccessInfo(); > + if (SourceInfo == MayAliasInfo || TargetInfo == MayAliasInfo) > + return MayAliasInfo; > + return TargetInfo; > +} > > Modified: cfe/trunk/lib/CodeGen/CodeGenTBAA.h > URL: http://llvm.org/viewvc/llvm- > project/cfe/trunk/lib/CodeGen/CodeGenTBAA.h?rev=315984&r1=315983&r2=315984&vie > w=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenTBAA.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenTBAA.h Tue Oct 17 02:12:13 2017 > @@ -47,6 +47,12 @@ struct TBAAAccessInfo { > : TBAAAccessInfo(/* AccessType= */ nullptr) > {} > > + bool operator==(const TBAAAccessInfo &Other) const { > + return BaseType == Other.BaseType && > + AccessType == Other.AccessType && > + Offset == Other.Offset; > + } > + > /// BaseType - The base/leading access type. May be null if this access > /// descriptor represents an access that is not considered to be an access > /// to an aggregate or union member. > @@ -136,6 +142,11 @@ public: > /// getMayAliasAccessInfo - Get TBAA information that represents may-alias > /// accesses. > TBAAAccessInfo getMayAliasAccessInfo(); > + > + /// mergeTBAAInfoForCast - Get merged TBAA information for the > + purpose of /// type casts. > + TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, > + TBAAAccessInfo TargetInfo); > }; > > } // end namespace CodeGen > > Added: cfe/trunk/test/CodeGen/tbaa-cast.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/tbaa- > cast.cpp?rev=315984&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGen/tbaa-cast.cpp (added) > +++ cfe/trunk/test/CodeGen/tbaa-cast.cpp Tue Oct 17 02:12:13 2017 > @@ -0,0 +1,23 @@ > +// RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s \ > +// RUN: -emit-llvm -o - | FileCheck %s > +// > +// Check that we generate correct TBAA information for lvalues > +constructed // with use of casts. > + > +struct V { > + unsigned n; > +}; > + > +struct S { > + char bytes[4]; > +}; > + > +void foo(S *p) { > +// CHECK-LABEL: _Z3fooP1S > +// CHECK: store i32 5, {{.*}}, !tbaa [[TAG_V_n:!.*]] > + ((V*)p->bytes)->n = 5; > +} > + > +// CHECK-DAG: [[TAG_V_n]] = !{[[TYPE_V:!.*]], [[TYPE_int:!.*]], i64 0} > +// CHECK-DAG: [[TYPE_V]] = !{!"_ZTS1V", !{{.*}}, i64 0} // CHECK-DAG: > +[[TYPE_int]] = !{!"int", !{{.*}}, i64 0} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits