[clang] b72a8c6 - PR17164: Change clang's default behavior from -flax-vector-conversions=all to -flax-vector-conversions=integer.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 17 00:51:58 PST 2020


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 <richard at 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 at 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 at -1 {{incompatible vector types passing 't3' (vector of 4 'float' values) to parameter of type 't2' (vector of 16 'char' values)}}
>> +  // no-lax-error at -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 at -1 {{assigning to 'double' from incompatible type 'float2' (vector of 2 'float' values)}}
>> +  // no-lax-error at -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 at -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 at -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 at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list