summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2019-09-06 06:02:13 +0000
committerCraig Topper <craig.topper@intel.com>2019-09-06 06:02:13 +0000
commit0482c264287f5604fb11f78737f2df1bd4f67e0b (patch)
tree2d8ad28a3edc9ddf8914ce4a0316b5b03c68d434 /docs
parentd5442965f032b33d7c79b6ecc561b1cb26bbfd63 (diff)
downloadclang-0482c264287f5604fb11f78737f2df1bd4f67e0b.tar.gz
[X86] Prevent passing vectors of __int128 as <X x i128> in llvm IR
As far as I can tell, gcc passes 256/512 bit vectors __int128 in memory. And passes a vector of 1 _int128 in an xmm register. The backend considers <X x i128> as an illegal type and will scalarize any arguments with that type. So we need to coerce the argument types in the frontend to match to avoid the illegal type. I'm restricting this to change to Linux and NetBSD based on the how similar ABI changes have been handled in the past. PS4, FreeBSD, and Darwin are unaffected. I've also added a new -fclang-abi-compat version to restore the old behavior. This issue was identified in PR42607. Though even with the types changed, we still seem to be doing some unnecessary stack realignment. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@371169 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'docs')
-rw-r--r--docs/ReleaseNotes.rst5
1 files changed, 4 insertions, 1 deletions
diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst
index bf02a379fd..e764bbb7f0 100644
--- a/docs/ReleaseNotes.rst
+++ b/docs/ReleaseNotes.rst
@@ -129,7 +129,10 @@ OpenCL C Language Changes in Clang
ABI Changes in Clang
--------------------
-- ...
+- gcc passes vectors of __int128 in memory on X86-64. Clang historically
+ broke the vectors into multiple scalars using two 64-bit values for each
+ element. Clang now matches the gcc behavior on Linux and NetBSD. You can
+ switch back to old API behavior with flag: -fclang-abi-compat=9.0.
OpenMP Support in Clang
-----------------------