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

Reply via email to