diff options
author | Ivan A. Kosarev <ikosarev@accesssoftek.com> | 2017-10-05 11:05:43 +0000 |
---|---|---|
committer | Ivan A. Kosarev <ikosarev@accesssoftek.com> | 2017-10-05 11:05:43 +0000 |
commit | 9c61abafb856367492d45c0ec2fb858d5014dbc5 (patch) | |
tree | 5355772ee91e6ae30d8073344496e2bac580fee5 /lib/CodeGen/CGExpr.cpp | |
parent | c64aa1bff66eaa08d18f0704502ac0b45610f218 (diff) |
Revert r314977 "[CodeGen] Unify generation of scalar and struct-path TBAA tags"
D37826 has been mistakenly committed where it should be the patch from D38503.
Differential Revision: https://reviews.llvm.org/D38503
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@314978 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 1bb57b6e2b..74ad9dcf46 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -1174,7 +1174,8 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) { llvm::Value *V = LV.getPointer(); Scope.ForceCleanup({&V}); return LValue::MakeAddr(Address(V, LV.getAlignment()), LV.getType(), - getContext(), LV.getBaseInfo(), LV.getTBAAInfo()); + getContext(), LV.getBaseInfo(), + LV.getTBAAAccessType()); } // FIXME: Is it possible to create an ExprWithCleanups that produces a // bitfield lvalue or some other non-simple lvalue? @@ -1513,7 +1514,7 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile, // Atomic operations have to be done on integral types. LValue AtomicLValue = - LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo); + LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo.AccessType); if (Ty->isAtomicType() || LValueIsSuitableForInlineAtomic(AtomicLValue)) { return EmitAtomicLoad(AtomicLValue, Loc).getScalarVal(); } @@ -1524,10 +1525,14 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile, Load->getContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1))); Load->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); } - - if (BaseInfo.getMayAlias()) - TBAAInfo = CGM.getTBAAMayAliasAccessInfo(); - CGM.DecorateInstructionWithTBAA(Load, TBAAInfo); + if (TBAAInfo.AccessType) { + bool MayAlias = BaseInfo.getMayAlias(); + llvm::MDNode *TBAA = MayAlias + ? CGM.getTBAAMayAliasTypeInfo() + : CGM.getTBAAStructTagInfo(TBAAInfo); + if (TBAA) + CGM.DecorateInstructionWithTBAA(Load, TBAA, MayAlias); + } if (EmitScalarRangeCheck(Load, Ty, Loc)) { // In order to prevent the optimizer from throwing away the check, don't @@ -1594,7 +1599,7 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr, Value = EmitToMemory(Value, Ty); LValue AtomicLValue = - LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo); + LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo.AccessType); if (Ty->isAtomicType() || (!isInit && LValueIsSuitableForInlineAtomic(AtomicLValue))) { EmitAtomicStore(RValue::get(Value), AtomicLValue, isInit); @@ -1608,10 +1613,14 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr, llvm::ConstantAsMetadata::get(Builder.getInt32(1))); Store->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); } - - if (BaseInfo.getMayAlias()) - TBAAInfo = CGM.getTBAAMayAliasAccessInfo(); - CGM.DecorateInstructionWithTBAA(Store, TBAAInfo); + if (TBAAInfo.AccessType) { + bool MayAlias = BaseInfo.getMayAlias(); + llvm::MDNode *TBAA = MayAlias + ? CGM.getTBAAMayAliasTypeInfo() + : CGM.getTBAAStructTagInfo(TBAAInfo); + if (TBAA) + CGM.DecorateInstructionWithTBAA(Store, TBAA, MayAlias); + } } void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue, @@ -3718,9 +3727,12 @@ LValue CodeGenFunction::EmitLValueForField(LValue base, // Loading the reference will disable path-aware TBAA. TBAAPath = false; - TBAAAccessInfo TBAAInfo = mayAlias ? CGM.getTBAAMayAliasAccessInfo() : - CGM.getTBAAAccessInfo(type); - CGM.DecorateInstructionWithTBAA(load, TBAAInfo); + if (CGM.shouldUseTBAA()) { + llvm::MDNode *tbaa = mayAlias ? CGM.getTBAAMayAliasTypeInfo() : + CGM.getTBAATypeInfo(type); + if (tbaa) + CGM.DecorateInstructionWithTBAA(load, tbaa); + } mayAlias = false; type = refType->getPointeeType(); @@ -3750,33 +3762,17 @@ LValue CodeGenFunction::EmitLValueForField(LValue base, LValue LV = MakeAddrLValue(addr, type, FieldBaseInfo); LV.getQuals().addCVRQualifiers(cvr); - - // Fields of may_alias structs act like 'char' for TBAA purposes. - // FIXME: this should get propagated down through anonymous structs - // and unions. - if (mayAlias) { - LV.setTBAAInfo(CGM.getTBAAMayAliasAccessInfo()); - } else if (TBAAPath) { - // If no base type been assigned for the base access, then try to generate - // one for this base lvalue. - TBAAAccessInfo TBAAInfo = base.getTBAAInfo(); - if (!TBAAInfo.BaseType) { - TBAAInfo.BaseType = CGM.getTBAABaseTypeInfo(base.getType()); - assert(!TBAAInfo.Offset && - "Nonzero offset for an access with no base type!"); - } - - // Adjust offset to be relative to the base type. + if (TBAAPath) { const ASTRecordLayout &Layout = getContext().getASTRecordLayout(field->getParent()); + // Set the base type to be the base type of the base LValue and + // update offset to be relative to the base type. unsigned CharWidth = getContext().getCharWidth(); - if (TBAAInfo.BaseType) - TBAAInfo.Offset += - Layout.getFieldOffset(field->getFieldIndex()) / CharWidth; - - // Update the final access type. - TBAAInfo.AccessType = LV.getTBAAInfo().AccessType; - + TBAAAccessInfo TBAAInfo = mayAlias ? + TBAAAccessInfo(CGM.getTBAAMayAliasTypeInfo()) : + TBAAAccessInfo(base.getTBAAInfo().BaseType, CGM.getTBAATypeInfo(type), + base.getTBAAInfo().Offset + Layout.getFieldOffset( + field->getFieldIndex()) / CharWidth); LV.setTBAAInfo(TBAAInfo); } @@ -3784,6 +3780,12 @@ LValue CodeGenFunction::EmitLValueForField(LValue base, if (LV.getQuals().getObjCGCAttr() == Qualifiers::Weak) LV.getQuals().removeObjCGCAttr(); + // Fields of may_alias structs act like 'char' for TBAA purposes. + // FIXME: this should get propagated down through anonymous structs + // and unions. + if (mayAlias && LV.getTBAAAccessType()) + LV.setTBAAAccessType(CGM.getTBAAMayAliasTypeInfo()); + return LV; } |