IRgen/ABI/ARM: Trust the backend to pass vectors correctly for the given ABI.
 - Therefore, we can lower out the NEON wrapper structs and pass the vectors
   directly. This makes a huge difference in the cleanliness of the IR after
   optimization.
 - I will trust, but verify, via future ABITest testing (for APCS-GNU, at
   least).

llvm-svn: 114618
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index 34a6d37..f1da3c3 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -2272,6 +2272,17 @@
   if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty))
     return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
 
+  // NEON vectors are implemented as (theoretically) opaque structures wrapping
+  // the underlying vector type. We trust the backend to pass the underlying
+  // vectors appropriately, so we can unwrap the structs which generally will
+  // lead to much cleaner IR.
+  if (const Type *SeltTy = isSingleElementStruct(Ty, getContext())) {
+    if (SeltTy->isVectorType())
+      return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
+  }
+
+  // Otherwise, pass by coercing to a structure of the appropriate size.
+  //
   // FIXME: This is kind of nasty... but there isn't much choice because the ARM
   // backend doesn't support byval.
   // FIXME: This doesn't handle alignment > 64 bits.