Hello Alex,

I'm working on it.

Thanks,


On 22/12/17 00:07, Alex L wrote:
Hi,

This commit has caused a new regression in LLVM 6. I filed the following PR: https://bugs.llvm.org/show_bug.cgi?id=35724 .
Could you please take a look?

Thanks,
Alex

On 17 October 2017 at 02:12, Ivan A. Kosarev via cfe-commits <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:

    Author: kosarev
    Date: Tue Oct 17 02:12:13 2017
    New Revision: 315984

    URL: http://llvm.org/viewvc/llvm-project?rev=315984&view=rev
    <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
    <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=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=315984&r1=315983&r2=315984&view=diff>
    
==============================================================================
    --- 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=315984&view=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=315984&r1=315983&r2=315984&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
    
<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
    
<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&view=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=315984&r1=315983&r2=315984&view=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&view=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp?rev=315984&r1=315983&r2=315984&view=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&view=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTBAA.h?rev=315984&r1=315983&r2=315984&view=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
    
<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 <mailto:cfe-commits@lists.llvm.org>
    http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
    <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

Reply via email to