forked from OSchip/llvm-project
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
This commit is contained in:
parent
388eaa1270
commit
b72a8c65e4
|
@ -278,9 +278,18 @@ Language Selection and Mode Options
|
||||||
Make all string literals default to writable. This disables uniquing of
|
Make all string literals default to writable. This disables uniquing of
|
||||||
strings and other optimizations.
|
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.
|
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
|
.. option:: -fblocks
|
||||||
|
|
||||||
|
|
|
@ -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
|
New Compiler Flags
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@ -78,6 +87,21 @@ Modified Compiler Flags
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
|
||||||
|
- ``-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
|
New Pragmas in Clang
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,7 @@ BENIGN_LANGOPT(PascalStrings, 1, 0, "Pascal string support")
|
||||||
LANGOPT(WritableStrings , 1, 0, "writable string support")
|
LANGOPT(WritableStrings , 1, 0, "writable string support")
|
||||||
LANGOPT(ConstStrings , 1, 0, "const-qualified string support")
|
LANGOPT(ConstStrings , 1, 0, "const-qualified string support")
|
||||||
ENUM_LANGOPT(LaxVectorConversions, LaxVectorConversionKind, 2,
|
ENUM_LANGOPT(LaxVectorConversions, LaxVectorConversionKind, 2,
|
||||||
LaxVectorConversionKind::All, "lax vector conversions")
|
LaxVectorConversionKind::Integer, "lax vector conversions")
|
||||||
LANGOPT(ConvergentFunctions, 1, 1, "Assume convergent functions")
|
LANGOPT(ConvergentFunctions, 1, 1, "Assume convergent functions")
|
||||||
LANGOPT(AltiVec , 1, 0, "AltiVec-style vector initializers")
|
LANGOPT(AltiVec , 1, 0, "AltiVec-style vector initializers")
|
||||||
LANGOPT(ZVector , 1, 0, "System z vector extensions")
|
LANGOPT(ZVector , 1, 0, "System z vector extensions")
|
||||||
|
|
|
@ -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=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
|
// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -target-feature +altivec -ffreestanding -emit-llvm -x c++ -o - %s | FileCheck %s
|
||||||
|
|
||||||
#include <altivec.h>
|
#include <altivec.h>
|
||||||
|
|
|
@ -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 -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
|
// RUN: %clang_cc1 -x c++ -triple thumbv7-apple-darwin10 -target-cpu cortex-a8 -fsyntax-only -Wvector-conversions -ffreestanding %s
|
||||||
|
|
||||||
|
|
|
@ -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 -flax-vector-conversions=none %s
|
||||||
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -x c++ %s
|
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -x c++ %s
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual %s -verify
|
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual -flax-vector-conversions=all %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=none %s -verify
|
||||||
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual -x c++ %s -verify
|
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -Wcast-qual -x c++ %s -verify
|
||||||
// expected-no-diagnostics
|
// expected-no-diagnostics
|
||||||
|
|
||||||
|
|
|
@ -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 -flax-vector-conversions=none %s -verify
|
||||||
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -x c++ %s -verify
|
// RUN: %clang_cc1 -fsyntax-only -ffreestanding -x c++ %s -verify
|
||||||
// expected-no-diagnostics
|
// expected-no-diagnostics
|
||||||
|
|
|
@ -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 = 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 = 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)}}
|
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 = 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 = 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)}}
|
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)}}
|
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 = 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'}}
|
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 = v1; // expected-error {{assigning to 'v2f' (vector of 2 'float' values) from incompatible type '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 = 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 = 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 = 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 = 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 = 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
|
// PR2263
|
||||||
|
|
|
@ -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 long long t1 __attribute__ ((vector_size (8)));
|
||||||
typedef char t2 __attribute__ ((vector_size (16)));
|
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 f2(t2 X); // expected-note{{passing argument to parameter 'X' here}}
|
||||||
|
|
||||||
void f3(t3 Y) {
|
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)));
|
typedef float float2 __attribute__ ((vector_size (8)));
|
||||||
|
@ -58,13 +61,15 @@ void f4() {
|
||||||
float64x2_t v = {0.0, 1.0};
|
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}}
|
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)}}
|
d += f2; // expected-error {{assigning to 'double' from incompatible type 'float2' (vector of 2 'float' values)}}
|
||||||
a = 3.0 + 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;
|
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);
|
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);
|
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.
|
// 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 = 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
|
// rdar://15931426
|
||||||
|
@ -78,6 +83,8 @@ void f5() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void f6(vSInt32 a0) {
|
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;
|
counter -= a0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 unsigned int v2u __attribute__ ((vector_size (8)));
|
||||||
typedef int v2s __attribute__ ((vector_size (8)));
|
typedef int v2s __attribute__ ((vector_size (8)));
|
||||||
typedef float v2f __attribute__ ((vector_size(8)));
|
typedef float v2f __attribute__ ((vector_size(8)));
|
||||||
|
|
Loading…
Reference in New Issue