Maryam Moghadas a9ddb7d54e [PowerPC] Fixing implicit castings in altivec for -fno-lax-vector-conversions
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
2022-06-16 17:07:03 -05:00

83 lines
1.7 KiB
C

// RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc64le-linux-gnu -S -O0 -o - %s -target-feature +altivec -target-feature +vsx | FileCheck %s -check-prefix=CHECK -check-prefix=VSX
// RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc-linux-gnu -S -O0 -o - %s -target-feature +altivec -target-feature -vsx | FileCheck %s
// REQUIRES: powerpc-registered-target
#include <altivec.h>
// CHECK-LABEL: test1
// CHECK: vcfsx
vector float test1(vector int x) {
return vec_ctf(x, 0);
}
// CHECK-LABEL: test2
// CHECK: vcfux
vector float test2(vector unsigned int x) {
return vec_ctf(x, 0);
}
#ifdef __VSX__
// VSX-LABEL: test3
vector float test3(vector signed long long x) {
return vec_ctf(x, 0);
}
// VSX-LABEL: test4
vector float test4(vector unsigned long long x) {
return vec_ctf(x, 0);
}
#endif
// CHECK-LABEL: test5
// CHECK: vcfsx
vector float test5(vector int x) {
return vec_vcfsx(x, 0);
}
// CHECK-LABEL: test6
// CHECK: vcfux
vector float test6(vector unsigned int x) {
return vec_vcfux(x, 0);
}
// CHECK-LABEL: test7
// CHECK: vctsxs
vector int test7(vector float x) {
return vec_cts(x, 0);
}
#ifdef __VSX__
// VSX-LABEL: test8
vector signed long long test8(vector double x) {
return vec_cts(x, 0);
}
#endif
// CHECK-LABEL: test9
// CHECK: vctsxs
vector int test9(vector float x) {
return vec_vctsxs(x, 0);
}
// CHECK-LABEL: test10
// CHECK: vctuxs
vector unsigned test10(vector float x) {
return vec_ctu(x, 0);
}
#ifdef __VSX__
// VSX-LABEL: test11
vector unsigned long long test11(vector double x) {
return vec_ctu(x, 0);
}
#endif
// CHECK-LABEL: test12
// CHECK: vctuxs
vector unsigned test12(vector float x) {
return vec_vctuxs(x, 0);
}