llvm-project/clang/test/CodeGenCXX/builtins-systemz-zvector.cpp
Richard Smith c624510f13 For PR17164: split -fno-lax-vector-conversion into three different
levels:

 -- none: no lax vector conversions [new GCC default]
 -- integer: only conversions between integer vectors [old GCC default]
 -- all: all conversions between same-size vectors [Clang default]

For now, Clang still defaults to "all" mode, but per my proposal on
cfe-dev (2019-04-10) the default will be changed to "integer" as soon as
that doesn't break lots of testcases. (Eventually I'd like to change the
default to "none" to match GCC and general sanity.)

Following GCC's behavior, the driver flag -flax-vector-conversions is
translated to -flax-vector-conversions=integer.

This reinstates r371805, reverted in r371813, with an additional fix for
lldb.

llvm-svn: 371817
2019-09-13 06:02:15 +00:00

51 lines
1.3 KiB
C++

// REQUIRES: systemz-registered-target
// RUN: %clang_cc1 -target-cpu z13 -triple s390x-linux-gnu \
// RUN: -fzvector -flax-vector-conversions=none -std=c++11 \
// RUN: -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s
bool gb;
// There was an issue where we weren't properly converting constexprs to
// vectors with elements of the appropriate width. (e.g.
// (vector signed short)0 would be lowered as [4 x i32] in some cases)
// CHECK-LABEL: @_Z8testIntsDv4_i
void testInts(vector int VI) {
constexpr vector int CI1 = (vector int)0LL;
// CHECK: icmp
gb = (VI == CI1)[0];
// Likewise for float inits.
constexpr vector int CI2 = (vector int)char(0);
// CHECK: icmp
gb = (VI == CI2)[0];
constexpr vector int CF1 = (vector int)0.0;
// CHECK: icmp
gb = (VI == CF1)[0];
constexpr vector int CF2 = (vector int)0.0f;
// CHECK: icmp
gb = (VI == CF2)[0];
}
// CHECK-LABEL: @_Z10testFloatsDv2_d
void testFloats(vector double VD) {
constexpr vector double CI1 = (vector double)0LL;
// CHECK: fcmp
gb = (VD == CI1)[0];
// Likewise for float inits.
constexpr vector double CI2 = (vector double)char(0);
// CHECK: fcmp
gb = (VD == CI2)[0];
constexpr vector double CF1 = (vector double)0.0;
// CHECK: fcmp
gb = (VD == CF1)[0];
constexpr vector double CF2 = (vector double)0.0f;
// CHECK: fcmp
gb = (VD == CF2)[0];
}