From 7a8b8f09daa1d4f8b82275006678ce3b5daa03b2 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 8 May 2019 23:30:37 -0700 Subject: [PATCH] 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 (cherry picked from commit b72a8c65e4e34779b6bc9e466203f553f5294486) --- clang/docs/CommandGuide/clang.rst | 11 +++++++++- clang/docs/ReleaseNotes.rst | 24 +++++++++++++++++++++ clang/include/clang/Basic/LangOptions.def | 2 +- clang/test/Headers/altivec-header.c | 2 +- clang/test/Headers/arm-neon-header.c | 2 +- clang/test/Headers/x86-intrinsics-headers.c | 2 +- clang/test/Headers/x86intrin-2.c | 4 ++-- clang/test/Headers/x86intrin.c | 2 +- clang/test/Sema/vector-assign.c | 12 +++++------ clang/test/Sema/vector-cast.c | 23 +++++++++++++------- clang/test/Sema/vector-ops.c | 3 ++- 11 files changed, 64 insertions(+), 23 deletions(-) diff --git a/clang/docs/CommandGuide/clang.rst b/clang/docs/CommandGuide/clang.rst index 7b0873600fc3b..6947450beb43d 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=, -fno-lax-vector-conversions Allow loose type checking rules for implicit vector conversions. + Possible values of : + + - ``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 + + defaults to ``integer`` if unspecified. .. option:: -fblocks diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 881dcb78b6638..8c48724e7c667 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -102,6 +102,15 @@ Non-comprehensive list of changes in this release the found gcc installation is older than 4.7.0. Add ``-fno-use-init-array`` to get the old behavior (``.ctors``). +* 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 ------------------ @@ -132,6 +141,21 @@ Modified Compiler Flags - RISC-V now sets the architecture (riscv32/riscv64) based on the value provided to the ``-march`` flag, overriding the target provided by ``-triple``. +- ``-flax-vector-conversions`` has been split into three different 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 068f206f44847..4bbe6ea26fba4 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 00e5f444de7cc..aa85a33d26da1 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 diff --git a/clang/test/Headers/arm-neon-header.c b/clang/test/Headers/arm-neon-header.c index f6362886010a5..8626a883fdf30 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 59ca354e1160b..2efd3505bca65 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 90475c658fceb..bd6ed565d0de7 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 53e369559f408..e904e9ed5462b 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 ad3406e304a78..88be03e2cb6d8 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 2bdc00707d4cc..01b5c3d252ab7 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 different 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 575f38b972f5e..d8031f0d2f4a5 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)));