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

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 15 13:18:23 PST 2020


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200115/59ef0aa4/attachment-0001.html>


More information about the cfe-commits mailing list