cherry-picked in 7a8b8f09daa and fdb501e59f2 Maybe we should expand the release note since this can be a compatibility problem for some? For example it affected Chromium as it broke something in Skia: https://bugs.chromium.org/p/chromium/issues/detail?id=1042470
On Wed, Jan 15, 2020 at 10:18 PM Richard Smith <rich...@metafoo.co.uk> wrote: > > Hi Hans, > > This flag flip just missed the branch point; can it be applied to the Clang > 10 branch? (You'll also need 388eaa1.) Let me know if that's OK, and I'll > remove the changes to the release notes from master. (Otherwise the version > number in which this applies needs to be bumped.) > > On Wed, 15 Jan 2020 at 13:16, Richard Smith via cfe-commits > <cfe-commits@lists.llvm.org> wrote: >> >> >> Author: Richard Smith >> Date: 2020-01-15T13:14:57-08:00 >> New Revision: b72a8c65e4e34779b6bc9e466203f553f5294486 >> >> URL: >> https://github.com/llvm/llvm-project/commit/b72a8c65e4e34779b6bc9e466203f553f5294486 >> DIFF: >> https://github.com/llvm/llvm-project/commit/b72a8c65e4e34779b6bc9e466203f553f5294486.diff >> >> LOG: PR17164: Change clang's default behavior from >> -flax-vector-conversions=all to -flax-vector-conversions=integer. >> >> Summary: >> See proposal on cfe-dev: >> http://lists.llvm.org/pipermail/cfe-dev/2019-April/062030.html >> >> Reviewers: SjoerdMeijer, eli.friedman >> >> Subscribers: kristof.beyls, cfe-commits >> >> Tags: #clang >> >> Differential Revision: https://reviews.llvm.org/D67678 >> >> Added: >> >> >> Modified: >> clang/docs/CommandGuide/clang.rst >> clang/docs/ReleaseNotes.rst >> clang/include/clang/Basic/LangOptions.def >> clang/test/Headers/altivec-header.c >> clang/test/Headers/arm-neon-header.c >> clang/test/Headers/x86-intrinsics-headers.c >> clang/test/Headers/x86intrin-2.c >> clang/test/Headers/x86intrin.c >> clang/test/Sema/vector-assign.c >> clang/test/Sema/vector-cast.c >> clang/test/Sema/vector-ops.c >> >> Removed: >> >> >> >> ################################################################################ >> diff --git a/clang/docs/CommandGuide/clang.rst >> b/clang/docs/CommandGuide/clang.rst >> index 7b0873600fc3..6947450beb43 100644 >> --- a/clang/docs/CommandGuide/clang.rst >> +++ b/clang/docs/CommandGuide/clang.rst >> @@ -278,9 +278,18 @@ Language Selection and Mode Options >> Make all string literals default to writable. This disables uniquing of >> strings and other optimizations. >> >> -.. option:: -flax-vector-conversions >> +.. option:: -flax-vector-conversions, -flax-vector-conversions=<kind>, >> -fno-lax-vector-conversions >> >> Allow loose type checking rules for implicit vector conversions. >> + Possible values of <kind>: >> + >> + - ``none``: allow no implicit conversions between vectors >> + - ``integer``: allow implicit bitcasts between integer vectors of the same >> + overall bit-width >> + - ``all``: allow implicit bitcasts between any vectors of the same >> + overall bit-width >> + >> + <kind> defaults to ``integer`` if unspecified. >> >> .. option:: -fblocks >> >> >> diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst >> index e5b5438216ef..d081c885a0b3 100644 >> --- a/clang/docs/ReleaseNotes.rst >> +++ b/clang/docs/ReleaseNotes.rst >> @@ -62,6 +62,15 @@ Non-comprehensive list of changes in this release >> ------------------------------------------------- >> >> >> +* Lax vector conversions involving floating-point vectors have been disabled >> + by default, and can no longer be enabled with >> ``-flax-vector-conversions``. >> + This matches the behavior of these flags in GCC, but code relying on >> implicit >> + vector bitcasts between integer and floating-point types that used to >> compile >> + with older versions of Clang is no longer accepted by default in Clang 10. >> + The old behavior can be restored with ``-flax-vector-conversions=all``. >> + In a future release of Clang, we intend to change the default to >> + ``-fno-lax-vector-conversions``. >> + >> New Compiler Flags >> ------------------ >> >> @@ -78,6 +87,21 @@ Modified Compiler Flags >> ----------------------- >> >> >> +- ``-flax-vector-conversions`` has been split into three >> diff erent levels of >> + laxness: >> + >> + - ``-flax-vector-conversions=all``: This is Clang's historical default, >> and >> + permits implicit vector conversions (performed as bitcasts) between any >> + two vector types of the same overall bit-width. >> + >> + - ``-flax-vector-conversions=integer``: This is Clang's current default, >> + and permits implicit vector conversions (performed as bitcasts) between >> + any two integer vector types of the same overall bit-width. >> + Synonym: ``-flax-vector-conversions``. >> + >> + - ``-flax-vector-conversions=none``: Do not perform any implicit bitcasts >> + between vector types. Synonym: ``-fno-lax-vector-conversions``. >> + >> New Pragmas in Clang >> -------------------- >> >> >> diff --git a/clang/include/clang/Basic/LangOptions.def >> b/clang/include/clang/Basic/LangOptions.def >> index 068f206f4484..4bbe6ea26fba 100644 >> --- a/clang/include/clang/Basic/LangOptions.def >> +++ b/clang/include/clang/Basic/LangOptions.def >> @@ -121,7 +121,7 @@ BENIGN_LANGOPT(PascalStrings, 1, 0, "Pascal string >> support") >> LANGOPT(WritableStrings , 1, 0, "writable string support") >> LANGOPT(ConstStrings , 1, 0, "const-qualified string support") >> ENUM_LANGOPT(LaxVectorConversions, LaxVectorConversionKind, 2, >> - LaxVectorConversionKind::All, "lax vector conversions") >> + LaxVectorConversionKind::Integer, "lax vector conversions") >> LANGOPT(ConvergentFunctions, 1, 1, "Assume convergent functions") >> LANGOPT(AltiVec , 1, 0, "AltiVec-style vector initializers") >> LANGOPT(ZVector , 1, 0, "System z vector extensions") >> >> diff --git a/clang/test/Headers/altivec-header.c >> b/clang/test/Headers/altivec-header.c >> index 00e5f444de7c..aa85a33d26da 100644 >> --- a/clang/test/Headers/altivec-header.c >> +++ b/clang/test/Headers/altivec-header.c >> @@ -1,5 +1,5 @@ >> -// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -target-feature >> +altivec -ffreestanding -emit-llvm -o - %s | FileCheck %s >> // RUN: %clang_cc1 -triple powerpc64-unknown-unknown -target-feature >> +altivec -ffreestanding -emit-llvm -flax-vector-conversions=none -o - %s | >> FileCheck %s >> +// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -target-feature >> +altivec -ffreestanding -emit-llvm -flax-vector-conversions=all -o - %s | >> FileCheck %s >> // RUN: %clang_cc1 -triple powerpc64-unknown-unknown -target-feature >> +altivec -ffreestanding -emit-llvm -x c++ -o - %s | FileCheck %s >> >> #include <altivec.h> >> >> diff --git a/clang/test/Headers/arm-neon-header.c >> b/clang/test/Headers/arm-neon-header.c >> index f6362886010a..8626a883fdf3 100644 >> --- a/clang/test/Headers/arm-neon-header.c >> +++ b/clang/test/Headers/arm-neon-header.c >> @@ -1,4 +1,4 @@ >> -// RUN: %clang_cc1 -triple thumbv7-apple-darwin10 -target-cpu cortex-a8 >> -fsyntax-only -Wvector-conversions -ffreestanding %s >> +// RUN: %clang_cc1 -triple thumbv7-apple-darwin10 -target-cpu cortex-a8 >> -fsyntax-only -flax-vector-conversions=all -Wvector-conversions >> -ffreestanding %s >> // RUN: %clang_cc1 -triple thumbv7-apple-darwin10 -target-cpu cortex-a8 >> -fsyntax-only -flax-vector-conversions=none -ffreestanding %s >> // RUN: %clang_cc1 -x c++ -triple thumbv7-apple-darwin10 -target-cpu >> cortex-a8 -fsyntax-only -Wvector-conversions -ffreestanding %s >> >> >> diff --git a/clang/test/Headers/x86-intrinsics-headers.c >> b/clang/test/Headers/x86-intrinsics-headers.c >> index 59ca354e1160..2efd3505bca6 100644 >> --- a/clang/test/Headers/x86-intrinsics-headers.c >> +++ b/clang/test/Headers/x86-intrinsics-headers.c >> @@ -1,4 +1,4 @@ >> -// RUN: %clang_cc1 -fsyntax-only -ffreestanding %s >> +// RUN: %clang_cc1 -fsyntax-only -ffreestanding >> -flax-vector-conversions=all %s >> // RUN: %clang_cc1 -fsyntax-only -ffreestanding >> -flax-vector-conversions=none %s >> // RUN: %clang_cc1 -fsyntax-only -ffreestanding -x c++ %s >> >> >> diff --git a/clang/test/Headers/x86intrin-2.c >> b/clang/test/Headers/x86intrin-2.c >> index 90475c658fce..bd6ed565d0de 100644 >> --- a/clang/test/Headers/x86intrin-2.c >> +++ b/clang/test/Headers/x86intrin-2.c >> @@ -1,5 +1,5 @@ >> -// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual %s -verify >> -// RUN: %clang_cc1 -fsyntax-only -ffreestanding >> -flax-vector-conversions=none -Wcast-qual %s -verify >> +// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual >> -flax-vector-conversions=all %s -verify >> +// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual >> -flax-vector-conversions=none %s -verify >> // RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual -x c++ %s >> -verify >> // expected-no-diagnostics >> >> >> diff --git a/clang/test/Headers/x86intrin.c b/clang/test/Headers/x86intrin.c >> index 53e369559f40..e904e9ed5462 100644 >> --- a/clang/test/Headers/x86intrin.c >> +++ b/clang/test/Headers/x86intrin.c >> @@ -1,4 +1,4 @@ >> -// RUN: %clang_cc1 -fsyntax-only -ffreestanding %s -verify >> +// RUN: %clang_cc1 -fsyntax-only -ffreestanding >> -flax-vector-conversions=all %s -verify >> // RUN: %clang_cc1 -fsyntax-only -ffreestanding >> -flax-vector-conversions=none %s -verify >> // RUN: %clang_cc1 -fsyntax-only -ffreestanding -x c++ %s -verify >> // expected-no-diagnostics >> >> diff --git a/clang/test/Sema/vector-assign.c >> b/clang/test/Sema/vector-assign.c >> index ad3406e304a7..88be03e2cb6d 100644 >> --- a/clang/test/Sema/vector-assign.c >> +++ b/clang/test/Sema/vector-assign.c >> @@ -14,12 +14,12 @@ void test1() { >> >> v1 = v2; // expected-warning {{incompatible vector types assigning to >> 'v2s' (vector of 2 'int' values) from 'v2u' (vector of 2 'unsigned int' >> values)}} >> v1 = v3; // expected-error {{assigning to 'v2s' (vector of 2 'int' >> values) from incompatible type 'v1s' (vector of 1 'int' value)}} >> - v1 = v4; // expected-warning {{incompatible vector types assigning to >> 'v2s' (vector of 2 'int' values) from 'v2f' (vector of 2 'float' values)}} >> + v1 = v4; // expected-error {{assigning to 'v2s' (vector of 2 'int' >> values) from incompatible type 'v2f' (vector of 2 'float' values)}} >> v1 = v5; // expected-warning {{incompatible vector types assigning to >> 'v2s' (vector of 2 'int' values) from 'v4ss' (vector of 4 'short' values)}} >> >> v2 = v1; // expected-warning {{incompatible vector types assigning to >> 'v2u' (vector of 2 'unsigned int' values) from 'v2s' (vector of 2 'int' >> values)}} >> v2 = v3; // expected-error {{assigning to 'v2u' (vector of 2 'unsigned >> int' values) from incompatible type 'v1s' (vector of 1 'int' value)}} >> - v2 = v4; // expected-warning {{incompatible vector types assigning to >> 'v2u' (vector of 2 'unsigned int' values) from 'v2f' (vector of 2 'float' >> values)}} >> + v2 = v4; // expected-error {{assigning to 'v2u' (vector of 2 'unsigned >> int' values) from incompatible type 'v2f' (vector of 2 'float' values)}} >> v2 = v5; // expected-warning {{incompatible vector types assigning to >> 'v2u' (vector of 2 'unsigned int' values) from 'v4ss' (vector of 4 'short' >> values)}} >> >> v3 = v1; // expected-error {{assigning to 'v1s' (vector of 1 'int' value) >> from incompatible type 'v2s' (vector of 2 'int' values)}} >> @@ -27,15 +27,15 @@ void test1() { >> v3 = v4; // expected-error {{assigning to 'v1s' (vector of 1 'int' value) >> from incompatible type 'v2f' (vector of 2 'float' values)}} >> v3 = v5; // expected-error {{assigning to 'v1s' (vector of 1 'int' value) >> from incompatible type 'v4ss'}} >> >> - v4 = v1; // expected-warning {{incompatible vector types assigning to >> 'v2f' (vector of 2 'float' values) from 'v2s' (vector of 2 'int' values)}} >> - v4 = v2; // expected-warning {{incompatible vector types assigning to >> 'v2f' (vector of 2 'float' values) from 'v2u' (vector of 2 'unsigned int' >> values)}} >> + v4 = v1; // expected-error {{assigning to 'v2f' (vector of 2 'float' >> values) from incompatible type 'v2s' (vector of 2 'int' values)}} >> + v4 = v2; // expected-error {{assigning to 'v2f' (vector of 2 'float' >> values) from incompatible type 'v2u' (vector of 2 'unsigned int' values)}} >> v4 = v3; // expected-error {{assigning to 'v2f' (vector of 2 'float' >> values) from incompatible type 'v1s' (vector of 1 'int' value)}} >> - v4 = v5; // expected-warning {{incompatible vector types assigning to >> 'v2f' (vector of 2 'float' values) from 'v4ss' (vector of 4 'short' values)}} >> + v4 = v5; // expected-error {{assigning to 'v2f' (vector of 2 'float' >> values) from incompatible type 'v4ss' (vector of 4 'short' values)}} >> >> v5 = v1; // expected-warning {{incompatible vector types assigning to >> 'v4ss' (vector of 4 'short' values) from 'v2s' (vector of 2 'int' values)}} >> v5 = v2; // expected-warning {{incompatible vector types assigning to >> 'v4ss' (vector of 4 'short' values) from 'v2u' (vector of 2 'unsigned int' >> values)}} >> v5 = v3; // expected-error {{assigning to 'v4ss' (vector of 4 'short' >> values) from incompatible type 'v1s' (vector of 1 'int' value)}} >> - v5 = v4; // expected-warning {{incompatible vector types assigning to >> 'v4ss' (vector of 4 'short' values) from 'v2f'}} >> + v5 = v4; // expected-error {{assigning to 'v4ss' (vector of 4 'short' >> values) from incompatible type 'v2f'}} >> } >> >> // PR2263 >> >> diff --git a/clang/test/Sema/vector-cast.c b/clang/test/Sema/vector-cast.c >> index 2bdc00707d4c..01b5c3d252ab 100644 >> --- a/clang/test/Sema/vector-cast.c >> +++ b/clang/test/Sema/vector-cast.c >> @@ -1,4 +1,5 @@ >> -// RUN: %clang_cc1 -fsyntax-only %s -verify -Wvector-conversion >> +// RUN: %clang_cc1 -fsyntax-only %s -verify=expected,no-lax >> -Wvector-conversion -flax-vector-conversions=none >> +// RUN: %clang_cc1 -fsyntax-only %s -verify=expected,lax >> -Wvector-conversion -flax-vector-conversions=all >> >> typedef long long t1 __attribute__ ((vector_size (8))); >> typedef char t2 __attribute__ ((vector_size (16))); >> @@ -41,7 +42,9 @@ type 't1' (vector of 1 'long long' value) and integer type >> 'short' of >> diff erent >> void f2(t2 X); // expected-note{{passing argument to parameter 'X' here}} >> >> void f3(t3 Y) { >> - f2(Y); // expected-warning {{incompatible vector types passing 't3' >> (vector of 4 'float' values) to parameter of type 't2' (vector of 16 'char' >> values)}} >> + f2(Y); >> + // lax-warning@-1 {{incompatible vector types passing 't3' (vector of 4 >> 'float' values) to parameter of type 't2' (vector of 16 'char' values)}} >> + // no-lax-error@-2 {{passing 't3' (vector of 4 'float' values) to >> parameter of incompatible type 't2' (vector of 16 'char' values)}} >> } >> >> typedef float float2 __attribute__ ((vector_size (8))); >> @@ -58,13 +61,15 @@ void f4() { >> float64x2_t v = {0.0, 1.0}; >> f2 += d; // expected-error {{cannot convert between scalar type 'double' >> and vector type 'float2' (vector of 2 'float' values) as implicit conversion >> would cause truncation}} >> d += f2; // expected-error {{assigning to 'double' from incompatible type >> 'float2' (vector of 2 'float' values)}} >> - a = 3.0 + vget_low_f64(v); >> - b = vget_low_f64(v) + 3.0; >> - c = vget_low_f64(v); >> - c -= vget_low_f64(v); >> + a = 3.0 + vget_low_f64(v); // no-lax-error {{assigning to 'double' from >> incompatible type 'float64x1_t' (vector of 1 'double' value)}} >> + b = vget_low_f64(v) + 3.0; // no-lax-error {{assigning to 'double' from >> incompatible type 'float64x1_t' (vector of 1 'double' value)}} >> + c = vget_low_f64(v); // no-lax-error {{assigning to 'double' from >> incompatible type 'float64x1_t' (vector of 1 'double' value)}} >> + c -= vget_low_f64(v); // no-lax-error {{assigning to 'double' from >> incompatible type 'float64x1_t' (vector of 1 'double' value)}} >> // LAX conversions between scalar and vector types require same size and >> one element sized vectors. >> d = f2; // expected-error {{assigning to 'double' from incompatible type >> 'float2'}} >> - d = d + f2; // expected-error {{assigning to 'double' from incompatible >> type 'float2'}} >> + d = d + f2; >> + // lax-error@-1 {{assigning to 'double' from incompatible type 'float2' >> (vector of 2 'float' values)}} >> + // no-lax-error@-2 {{cannot convert between scalar type 'double' and >> vector type 'float2' (vector of 2 'float' values) as implicit conversion >> would cause truncation}} >> } >> >> // rdar://15931426 >> @@ -78,6 +83,8 @@ void f5() { >> } >> >> void f6(vSInt32 a0) { >> - vUInt32 counter = (float16){0.0f, 0.0f, 0.0f, 0.0f}; // expected-warning >> {{incompatible vector types initializing 'vUInt32' (vector of 4 'unsigned >> int' values) with an expression of type 'float16' (vector of 4 'float' >> values)}} >> + vUInt32 counter = (float16){0.0f, 0.0f, 0.0f, 0.0f}; >> + // lax-warning@-1 {{incompatible vector types initializing 'vUInt32' >> (vector of 4 'unsigned int' values) with an expression of type 'float16' >> (vector of 4 'float' values)}} >> + // no-lax-error@-2 {{initializing 'vUInt32' (vector of 4 'unsigned int' >> values) with an expression of incompatible type 'float16' (vector of 4 >> 'float' values)}} >> counter -= a0; >> } >> >> diff --git a/clang/test/Sema/vector-ops.c b/clang/test/Sema/vector-ops.c >> index 575f38b972f5..d8031f0d2f4a 100644 >> --- a/clang/test/Sema/vector-ops.c >> +++ b/clang/test/Sema/vector-ops.c >> @@ -1,4 +1,5 @@ >> -// RUN: %clang_cc1 %s -verify -fsyntax-only -Wvector-conversion -triple >> x86_64-apple-darwin10 >> +// RUN: %clang_cc1 %s -verify -fsyntax-only -Wvector-conversion -triple >> x86_64-apple-darwin10 -flax-vector-conversions=all >> +// FIXME: We get worse diagnostics here with -flax-vector-conversions >> disabled. >> typedef unsigned int v2u __attribute__ ((vector_size (8))); >> typedef int v2s __attribute__ ((vector_size (8))); >> typedef float v2f __attribute__ ((vector_size(8))); >> >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits