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