forked from OSchip/llvm-project
PowerPC] Emit warning for incompatible vector types that are currently diagnosed with -fno-lax-vector-conversions
This patch is the last prerequisite to switch the default behaviour to -fno-lax-vector-conversions in the future. The first path ;D124093; fixed the altivec implicit castings. Reviewed By: amyk Differential Revision: https://reviews.llvm.org/D126540
This commit is contained in:
parent
febe4f650b
commit
711a71d1ab
|
@ -7589,6 +7589,12 @@ def warn_deprecated_altivec_src_compat : Warning<
|
|||
"'-altivec-compat=xl' option">,
|
||||
InGroup<DiagGroup<"deprecated-altivec-src-compat">>;
|
||||
|
||||
def warn_deprecated_lax_vec_conv_all : Warning<
|
||||
"Implicit conversion between vector types ('%0' and '%1') is deprecated. "
|
||||
"In the future, the behavior implied by '-fno-lax-vector-conversions' "
|
||||
"will be the default.">,
|
||||
InGroup<DiagGroup<"deprecate-lax-vec-conv-all">>;
|
||||
|
||||
def err_catch_incomplete_ptr : Error<
|
||||
"cannot catch pointer to incomplete type %0">;
|
||||
def err_catch_incomplete_ref : Error<
|
||||
|
|
|
@ -12136,6 +12136,8 @@ public:
|
|||
bool areVectorTypesSameSize(QualType srcType, QualType destType);
|
||||
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
|
||||
bool isLaxVectorConversion(QualType srcType, QualType destType);
|
||||
bool areSameVectorElemTypes(QualType srcType, QualType destType);
|
||||
bool anyAltivecTypes(QualType srcType, QualType destType);
|
||||
|
||||
/// type checking declaration initializers (C99 6.7.8)
|
||||
bool CheckForConstantInitializer(Expr *e, QualType t);
|
||||
|
|
|
@ -7733,6 +7733,36 @@ bool Sema::areVectorTypesSameSize(QualType SrcTy, QualType DestTy) {
|
|||
return (SrcLen * SrcEltSize == DestLen * DestEltSize);
|
||||
}
|
||||
|
||||
// This returns true if at least one of the types is an altivec vector.
|
||||
bool Sema::anyAltivecTypes(QualType SrcTy, QualType DestTy) {
|
||||
assert((DestTy->isVectorType() || SrcTy->isVectorType()) &&
|
||||
"expected at least one type to be a vector here");
|
||||
|
||||
bool IsSrcTyAltivec =
|
||||
SrcTy->isVectorType() && (SrcTy->castAs<VectorType>()->getVectorKind() ==
|
||||
VectorType::AltiVecVector);
|
||||
bool IsDestTyAltivec = DestTy->isVectorType() &&
|
||||
(DestTy->castAs<VectorType>()->getVectorKind() ==
|
||||
VectorType::AltiVecVector);
|
||||
|
||||
return (IsSrcTyAltivec || IsDestTyAltivec);
|
||||
}
|
||||
|
||||
// This returns true if both vectors have the same element type.
|
||||
bool Sema::areSameVectorElemTypes(QualType SrcTy, QualType DestTy) {
|
||||
assert((DestTy->isVectorType() || SrcTy->isVectorType()) &&
|
||||
"expected at least one type to be a vector here");
|
||||
|
||||
uint64_t SrcLen, DestLen;
|
||||
QualType SrcEltTy, DestEltTy;
|
||||
if (!breakDownVectorType(SrcTy, SrcLen, SrcEltTy))
|
||||
return false;
|
||||
if (!breakDownVectorType(DestTy, DestLen, DestEltTy))
|
||||
return false;
|
||||
|
||||
return (SrcEltTy == DestEltTy);
|
||||
}
|
||||
|
||||
/// Are the two types lax-compatible vector types? That is, given
|
||||
/// that one of them is a vector, do they have equal storage sizes,
|
||||
/// where the storage size is the number of elements times the element
|
||||
|
@ -9552,6 +9582,13 @@ Sema::CheckAssignmentConstraints(QualType LHSType, ExprResult &RHS,
|
|||
// vectors, the total size only needs to be the same. This is a bitcast;
|
||||
// no bits are changed but the result type is different.
|
||||
if (isLaxVectorConversion(RHSType, LHSType)) {
|
||||
// The default for lax vector conversions with Altivec vectors will
|
||||
// change, so if we are converting between vector types where
|
||||
// at least one is an Altivec vector, emit a warning.
|
||||
if (anyAltivecTypes(RHSType, LHSType) &&
|
||||
!areSameVectorElemTypes(RHSType, LHSType))
|
||||
Diag(RHS.get()->getExprLoc(), diag::warn_deprecated_lax_vec_conv_all)
|
||||
<< RHSType << LHSType;
|
||||
Kind = CK_BitCast;
|
||||
return IncompatibleVectors;
|
||||
}
|
||||
|
@ -9565,6 +9602,9 @@ Sema::CheckAssignmentConstraints(QualType LHSType, ExprResult &RHS,
|
|||
const VectorType *VecType = RHSType->getAs<VectorType>();
|
||||
if (VecType && VecType->getNumElements() == 1 &&
|
||||
isLaxVectorConversion(RHSType, LHSType)) {
|
||||
if (VecType->getVectorKind() == VectorType::AltiVecVector)
|
||||
Diag(RHS.get()->getExprLoc(), diag::warn_deprecated_lax_vec_conv_all)
|
||||
<< RHSType << LHSType;
|
||||
ExprResult *VecExpr = &RHS;
|
||||
*VecExpr = ImpCastExprToType(VecExpr->get(), LHSType, CK_BitCast);
|
||||
Kind = CK_BitCast;
|
||||
|
@ -10503,6 +10543,9 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS,
|
|||
QualType OtherType = LHSVecType ? RHSType : LHSType;
|
||||
ExprResult *OtherExpr = LHSVecType ? &RHS : &LHS;
|
||||
if (isLaxVectorConversion(OtherType, VecType)) {
|
||||
if (anyAltivecTypes(RHSType, LHSType) &&
|
||||
!areSameVectorElemTypes(RHSType, LHSType))
|
||||
Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;
|
||||
// If we're allowing lax vector conversions, only the total (data) size
|
||||
// needs to be the same. For non compound assignment, if one of the types is
|
||||
// scalar, the result is always the vector type.
|
||||
|
|
|
@ -1617,8 +1617,9 @@ bool Sema::IsFunctionConversion(QualType FromType, QualType ToType,
|
|||
///
|
||||
/// \param ICK Will be set to the vector conversion kind, if this is a vector
|
||||
/// conversion.
|
||||
static bool IsVectorConversion(Sema &S, QualType FromType,
|
||||
QualType ToType, ImplicitConversionKind &ICK) {
|
||||
static bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType,
|
||||
ImplicitConversionKind &ICK, Expr *From,
|
||||
bool InOverloadResolution) {
|
||||
// We need at least one of these types to be a vector type to have a vector
|
||||
// conversion.
|
||||
if (!ToType->isVectorType() && !FromType->isVectorType())
|
||||
|
@ -1660,6 +1661,13 @@ static bool IsVectorConversion(Sema &S, QualType FromType,
|
|||
if (S.Context.areCompatibleVectorTypes(FromType, ToType) ||
|
||||
(S.isLaxVectorConversion(FromType, ToType) &&
|
||||
!ToType->hasAttr(attr::ArmMveStrictPolymorphism))) {
|
||||
if (S.isLaxVectorConversion(FromType, ToType) &&
|
||||
S.anyAltivecTypes(FromType, ToType) &&
|
||||
!S.areSameVectorElemTypes(FromType, ToType) &&
|
||||
!InOverloadResolution) {
|
||||
S.Diag(From->getBeginLoc(), diag::warn_deprecated_lax_vec_conv_all)
|
||||
<< FromType << ToType;
|
||||
}
|
||||
ICK = ICK_Vector_Conversion;
|
||||
return true;
|
||||
}
|
||||
|
@ -1908,7 +1916,8 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
|
|||
InOverloadResolution, FromType)) {
|
||||
// Pointer to member conversions (4.11).
|
||||
SCS.Second = ICK_Pointer_Member;
|
||||
} else if (IsVectorConversion(S, FromType, ToType, SecondICK)) {
|
||||
} else if (IsVectorConversion(S, FromType, ToType, SecondICK, From,
|
||||
InOverloadResolution)) {
|
||||
SCS.Second = SecondICK;
|
||||
FromType = ToType.getUnqualifiedType();
|
||||
} else if (!S.getLangOpts().CPlusPlus &&
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// RUN: %clang_cc1 -triple=powerpc-apple-darwin8 -target-feature +altivec -fsyntax-only -verify=expected,novsx -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -target-feature +altivec -target-feature +vsx -fsyntax-only -verify=expected,nonaix -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-feature +altivec -fsyntax-only -verify=expected,novsx -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -target-feature +vsx -target-cpu pwr7 -fsyntax-only -verify=expected,nonaix -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-feature -vsx -target-cpu pwr7 -fsyntax-only -verify=expected,novsx -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc-ibm-aix -target-feature +altivec -fsyntax-only -verify=expected,aix -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64-ibm-aix -target-feature +altivec -fsyntax-only -verify=expected,aix -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc-apple-darwin8 -Wno-deprecate-lax-vec-conv-all -target-feature +altivec -fsyntax-only -verify=expected,novsx -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -Wno-deprecate-lax-vec-conv-all -target-feature +altivec -target-feature +vsx -fsyntax-only -verify=expected,nonaix -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -Wno-deprecate-lax-vec-conv-all -target-feature +altivec -fsyntax-only -verify=expected,novsx -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -Wno-deprecate-lax-vec-conv-all -target-feature +vsx -target-cpu pwr7 -fsyntax-only -verify=expected,nonaix -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -Wno-deprecate-lax-vec-conv-all -target-feature -vsx -target-cpu pwr7 -fsyntax-only -verify=expected,novsx -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc-ibm-aix -Wno-deprecate-lax-vec-conv-all -target-feature +altivec -fsyntax-only -verify=expected,aix -std=c++11 %s
|
||||
// RUN: %clang_cc1 -triple=powerpc64-ibm-aix -Wno-deprecate-lax-vec-conv-all -target-feature +altivec -fsyntax-only -verify=expected,aix -std=c++11 %s
|
||||
#include <altivec.h>
|
||||
|
||||
__vector char vv_c;
|
||||
|
|
Loading…
Reference in New Issue