
XL considers different vector types to be incompatible with each other. For example assignment between variables of types vector float and vector long long or even vector signed int and vector unsigned int are diagnosed. clang, however does not diagnose such cases and does a simple bitcast between the two types. This could easily result in program errors. This patch is to fix the implicit casts in altivec.h so that there is no incompatible vector type errors whit -fno-lax-vector-conversions, this is the prerequisite patch to switch the default to -fno-lax-vector-conversions later. Reviewed By: nemanjai, amyk Differential Revision: https://reviews.llvm.org/D124093
49 lines
2.0 KiB
C
49 lines
2.0 KiB
C
// REQUIRES: powerpc-registered-target
|
|
// RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc64-unknown-unknown -target-cpu pwr10 \
|
|
// RUN: -fsyntax-only -Wall -Werror -verify %s
|
|
// RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc64le-unknown-unknown -target-cpu pwr10 \
|
|
// RUN: -fsyntax-only -Wall -Werror -verify %s
|
|
// RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc64-unknown-aix -target-cpu pwr10 \
|
|
// RUN: -fsyntax-only -Wall -Werror -verify %s
|
|
// RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc-unknown-aix -target-cpu pwr10 \
|
|
// RUN: -fsyntax-only -Wall -Werror -verify %s
|
|
|
|
#include <altivec.h>
|
|
|
|
vector unsigned char vuca;
|
|
vector unsigned short vusa;
|
|
vector unsigned int vuia;
|
|
vector unsigned long long vulla;
|
|
|
|
unsigned long long test_vec_cntm_uc(void) {
|
|
return vec_cntm(vuca, -1); // expected-error 1+ {{argument value 255 is outside the valid range [0, 1]}}
|
|
}
|
|
|
|
unsigned long long test_vec_cntm_us(void) {
|
|
return vec_cntm(vusa, -1); // expected-error 1+ {{argument value 255 is outside the valid range [0, 1]}}
|
|
}
|
|
|
|
unsigned long long test_vec_cntm_ui(void) {
|
|
return vec_cntm(vuia, 2); // expected-error 1+ {{argument value 2 is outside the valid range [0, 1]}}
|
|
}
|
|
|
|
unsigned long long test_vec_cntm_ull(void) {
|
|
return vec_cntm(vulla, 2); // expected-error 1+ {{argument value 2 is outside the valid range [0, 1]}}
|
|
}
|
|
|
|
vector unsigned char test_xxgenpcvbm(void) {
|
|
return vec_genpcvm(vuca, -1); // expected-error 1+ {{argument value -1 is outside the valid range [0, 3]}}
|
|
}
|
|
|
|
vector unsigned short test_xxgenpcvhm(void) {
|
|
return vec_genpcvm(vusa, -1); // expected-error 1+ {{argument value -1 is outside the valid range [0, 3]}}
|
|
}
|
|
|
|
vector unsigned int test_xxgenpcvwm(void) {
|
|
return vec_genpcvm(vuia, 4); // expected-error 1+ {{argument value 4 is outside the valid range [0, 3]}}
|
|
}
|
|
|
|
vector unsigned long long test_xxgenpcvdm(void) {
|
|
return vec_genpcvm(vulla, 4); // expected-error 1+ {{argument value 4 is outside the valid range [0, 3]}}
|
|
}
|