[llvm-branch-commits] [cfe-branch] r314476 - Merging r312447:

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Sep 28 16:41:39 PDT 2017


Author: tstellar
Date: Thu Sep 28 16:41:39 2017
New Revision: 314476

URL: http://llvm.org/viewvc/llvm-project?rev=314476&view=rev
Log:
Merging r312447:

------------------------------------------------------------------------
r312447 | hfinkel | 2017-09-03 10:18:25 -0700 (Sun, 03 Sep 2017) | 12 lines

[CodeGen] Treat all vector fields as mayalias

Because it is common to treat vector types as an array of their elements, or
even some other type that's not the element type, and thus index into them, we
can't use struct-path TBAA for these accesses. Even though we already treat all
vector types as equivalent to 'char', we were using field-offset information
for them with TBAA, and this renders undefined the intra-value indexing we
intend to allow. Note that, although 'char' is universally aliasing, with path
TBAA, we can still differentiate between access to s.a and s.b in
  struct { char a, b; } s;. We can't use this capability as-is for vector types.

Fixes PR33967.
------------------------------------------------------------------------

Added:
    cfe/branches/release_50/test/CodeGen/tbaa-vec.cpp
Modified:
    cfe/branches/release_50/lib/CodeGen/CGExpr.cpp

Modified: cfe/branches/release_50/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_50/lib/CodeGen/CGExpr.cpp?rev=314476&r1=314475&r2=314476&view=diff
==============================================================================
--- cfe/branches/release_50/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/branches/release_50/lib/CodeGen/CGExpr.cpp Thu Sep 28 16:41:39 2017
@@ -3619,8 +3619,9 @@ LValue CodeGenFunction::EmitLValueForFie
     getFieldAlignmentSource(BaseInfo.getAlignmentSource());
   LValueBaseInfo FieldBaseInfo(fieldAlignSource, BaseInfo.getMayAlias());
 
+  QualType type = field->getType();
   const RecordDecl *rec = field->getParent();
-  if (rec->isUnion() || rec->hasAttr<MayAliasAttr>())
+  if (rec->isUnion() || rec->hasAttr<MayAliasAttr>() || type->isVectorType())
     FieldBaseInfo.setMayAlias(true);
   bool mayAlias = FieldBaseInfo.getMayAlias();
 
@@ -3645,7 +3646,6 @@ LValue CodeGenFunction::EmitLValueForFie
     return LValue::MakeBitfield(Addr, Info, fieldType, FieldBaseInfo);
   }
 
-  QualType type = field->getType();
   Address addr = base.getAddress();
   unsigned cvr = base.getVRQualifiers();
   bool TBAAPath = CGM.getCodeGenOpts().StructPathTBAA;

Added: cfe/branches/release_50/test/CodeGen/tbaa-vec.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_50/test/CodeGen/tbaa-vec.cpp?rev=314476&view=auto
==============================================================================
--- cfe/branches/release_50/test/CodeGen/tbaa-vec.cpp (added)
+++ cfe/branches/release_50/test/CodeGen/tbaa-vec.cpp Thu Sep 28 16:41:39 2017
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s
+// Test TBAA metadata generated by front-end (vector types are always treated as mayalias).
+
+typedef float __m128 __attribute__ ((__vector_size__ (16)));
+
+struct A {
+  __m128 a, b;
+};
+
+void foo(A *a, __m128 v) {
+  // CHECK-LABEL: define void @_Z3fooP1ADv4_f
+  a->a = v;
+  // CHECK: store <4 x float> %v, <4 x float>* %{{.*}}, align 16, !tbaa [[TAG_char:!.*]]
+  // CHECK: store <4 x float> %{{.*}}, <4 x float>* %{{.*}}, align 16, !tbaa [[TAG_char]]
+}
+
+// CHECK: [[TYPE_char:!.*]] = !{!"omnipotent char", [[TAG_cxx_tbaa:!.*]],
+// CHECK: [[TAG_cxx_tbaa]] = !{!"Simple C++ TBAA"}
+// CHECK: [[TAG_char]] = !{[[TYPE_char]], [[TYPE_char]], i64 0}
+




More information about the llvm-branch-commits mailing list